最常用手法是篡改general_log_file路径至Web目录并写入PHP木马;需检查general_log状态、日志文件路径及内容,确认secure_file_priv配置并关闭日志功能。

查日志:重点盯 general_log 和 slow_query_log 相关操作
攻击者通过 phpMyAdmin 写 Webshell,最常用的手法就是篡改 MySQL 日志路径,把 general_log_file 指向网站可访问目录(如 C:/phpstudy_pro/WWW/shell.php),再执行一句含 PHP 代码的 SELECT,让日志内容变成一句话木马。
排查时直接登录数据库执行:
SHOW VARIABLES LIKE '%general%';<br>SHOW VARIABLES LIKE '%slow%';
若发现 general_log 为 ON,且 general_log_file 路径落在 Web 根目录下(尤其是后缀为 .php、.phtml),立刻检查该文件是否存在、内容是否含 eval(、assert(、system( 等敏感函数调用。慢查询日志同理,只要路径被设为 Web 可访问路径,也一样危险。
扫文件:不只看名字,更要看内容特征和时间异常
别只搜 shell.php、1.php 这类明显名字——攻击者早就不这么干了。真实后门常伪装成正常文件名,比如 5d.php、dpvebhqgkc.php(来自真实应急案例),甚至藏在图片、JS 文件里。
立即学习“PHP免费学习笔记(深入)”;
- 按修改时间排序,重点检查近 24–72 小时内新增或突改的
.php、.phtml、.php3文件 - 用命令行快速 grep 敏感模式:
find /var/www -name "*.php" -exec grep -l "eval\|assert\|system\|passthru\|shell_exec" {} \;(Linux) - Windows 下可用 PowerShell:
Get-ChildItem C:\phpstudy_pro\WWW -Recurse -Include *.php | Select-String "eval\|assert\|@\$_POST\|@\$_GET" - 注意空格、换行、注释混淆写法,比如
eval或拆成多行字符串拼接,基础 grep 可能漏掉,需配合工具
验行为:从 Web 访问日志反推可疑请求
Webshell 不是写完就完事,它一定会被访问、被连接。Apache 或 Nginx 的 access.log 是最直接的证据源。
搜索这些特征:
- 高频、短间隔、相同 IP 对单一 PHP 文件的 POST 请求(蚁剑/冰蝎典型行为)
- URL 中带可疑参数,如
?cmd=whoami、?a=system、?jkxy=(参考真实案例中的$_POST["jkxy"]) - 返回状态码为
200但响应体极小(常见于一句话木马回显) - 非标准 User-Agent,如
sqlmap、python-requests、或空白 UA
例如这条日志很可疑:91.246.37.127 - - [02/Oct/2024:20:22:05 +0800] "POST /dpvebhqgkc.php HTTP/1.1" 200 12 "-" "Mozilla/4.0" —— IP 来自境外、文件名随机、无 Referer、UA 极简,基本可判定为 Webshell 回连。
补漏洞:别只删文件,secure_file_priv 和 general_log 必须关
删了 5d.php 不代表安全了。只要数据库配置没改,攻击者下次爆破成功,30 秒内就能再写一个。
必须做两件事:
- 进 MySQL 执行:
SET GLOBAL general_log = 'OFF';,并确认my.cnf或my.ini中没有硬编码开启general_log - 检查
secure_file_priv值:SELECT @@secure_file_priv;。若返回NULL,说明导出功能已被禁用,是好事;若为空字符串'',表示任意路径都可写入,风险极高,必须在配置文件中显式设为具体安全路径(如/tmp/),然后重启 MySQL - 弱口令是根源,
root密码必须改,且不能是root、123456、password这类——大小写+数字+符号+8位以上是底线
真正容易被忽略的点是:日志路径一旦被设成 .php,MySQL 会直接覆盖写入,哪怕原文件是图片或 JS,也会被清空重写成 PHP 代码。所以排查时不能只看“有没有新文件”,更要查“有没有被覆盖的旧文件突然变小、内容突变”。



















