直接看access.log中连续出现的“SET GLOBAL general_log = 'ON'”“SET GLOBAL general_log_file = '...php'”“SELECT”三连操作,且路径指向Web可访问目录,即为高危写shell痕迹;用grep -i "set global.general_log|select."可快速筛选。
phpMyAdmin 访问日志里哪些请求行为值得警惕
直接看 access.log(apache)或 nginx/access.log,重点不是“有没有登录”,而是“登录后干了什么”。攻击者用 phpmyadmin 写 shell 时,会留下非常典型的三连操作痕迹:set global general_log = 'on'、set global general_log_file = '...php'、select '<?php ... ?>'。这三条语句在日志中通常紧挨着出现,且 general_log_file 路径指向 web 可访问目录(如 /www/、/htdocs/、/public/),就是高危信号。
如何快速从日志里筛出可疑 SQL 操作
不要手动翻日志。用 grep 配合正则能秒级定位:
grep -i "set global.*general_log" /var/log/apache2/access.loggrep -i "select.*<?php \|eval\|system\|cmd" /var/log/apache2/access.log | grep -v "404"grep -E "(general_log_file|log_file).*\.php" /var/log/apache2/access.log
注意:如果 phpMyAdmin 启用了 blowfish_secret 或 cookie 认证,这些请求仍会出现在 access 日志里,但不会带明文密码——所以不能靠“有没有密码字段”来排除风险。
为什么只查 access.log 不够,还得看 MySQL 的 general log
access.log 只记录 HTTP 请求路径和参数,而真正执行写文件的 SQL 是发给 MySQL 的,MySQL 自己的日志才包含完整语句。如果管理员开了 general_log = ON,日志默认存于 /var/lib/mysql/hostname.log 或由 general_log_file 指定路径。攻击者常把日志路径设成 /var/www/html/shell.php,此时 MySQL 日志内容就直接是 PHP 代码,一打开就暴露。
检查方式:
- 先确认是否启用:
mysql -uroot -p -e "show variables like 'general_log';" - 再查路径:
mysql -uroot -p -e "show variables like 'general_log_file';" - 最后 cat 日志文件,看有没有
<?php开头的行
容易被忽略的绕过点:日志路径没写 .php 后缀怎么办
有些攻击者会故意写成 shell.txt 或 123,然后配合 Apache 的多后缀解析(如 shell.php.jpg)或 Nginx 的 fastcgi_split_path_info 配置缺陷来执行。所以不能只搜 .php,还要关注:
- 日志路径中是否含常见 Web 目录名(
www、html、public、web) - 路径是否为绝对路径(
/var/www/...)而非相对路径(./xxx) - 后续是否有对该路径的 HTTP GET 请求(比如
GET /shell.txt返回 200)
真正的难点不在发现单条日志,而在把“SQL 设置日志路径”、“写入恶意内容”、“HTTP 访问该路径”这三件事串起来——时间戳接近、IP 一致、路径可对应,才是闭环证据。漏掉任意一环,都可能误报或漏报。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











