直接筛选含phpmyadmin/pma等路径的404或200请求,结合User-Agent和Referer交叉验证,可快速识别扫描行为;需确保日志格式包含$http_user_agent与$http_referer字段,并通过时间密度、后续请求链区分真实访问与工具探测。
怎么从 access.log 里快速定位 phpMyAdmin 扫描行为
直接看 get /phpmyadmin/、get /pma/、get /phpmyadmin/ 这类路径的 404 或 200 请求,是最快的方式。扫描工具不会真登录,而是批量试探常见路径和大小写变体,所以日志里会密集出现同一 ip 对多个 phpmyadmin 相关路径的请求。
- 用
grep -E 'GET (/.*/)?(phpmyadmin|pma|phpMyAdmin|PHPMYADMIN)' /var/log/nginx/access.log快速筛出可疑行 - 重点看状态码:大量
404是典型扫描特征;少量200且无后续登录行为(比如没/index.php?token=或/js/资源加载)也要警惕 - 注意时间戳密度——1 秒内连续 5+ 条同类请求,基本可以判定为工具行为,不是人工访问
为什么不能只靠路径匹配?得结合 User-Agent 和 Referer
有些扫描器会伪造 User-Agent 模拟浏览器,或者干脆不带,而真实用户访问时通常有完整 UA 和来自登录页的 Referer。光看路径容易误杀(比如某些 CMS 插件会自动探测管理后台),必须交叉验证。
- 真实 phpMyAdmin 访问一般伴随
Referer: https://example.com/phpmyadmin/或类似路径;扫描器多数Referer: -或缺失 - 扫描器常用 UA:空值、
sqlmap、nikto、gobuster、python-requests、curl/7.—— 这些在日志里一搜就出来 -
awk '$9 ~ /^404$/ && $6 ~ /phpmyadmin/ {print $1, $6, $9, $12, $13}' /var/log/nginx/access.log | sort | uniq -c | sort -nr可聚合统计,快速识别高频扫描 IP
nginx 日志格式影响分析效果,必须确认 log_format 包含关键字段
默认 log_format combined 通常够用,但如果你自定义过日志格式,漏掉 $http_user_agent 或 $http_referer,上面那些判断就全失效了。
- 检查 nginx 配置中是否包含
$http_user_agent(对应日志里的 UA 字段)和$http_referer(对应 Referer) - 如果用了 JSON 格式日志,确保解析工具能正确提取这些字段;否则 grep 会漏掉换行或转义内容
- 时间字段必须是标准格式(如
[21/Jan/2024:14:22:03 +0800]),否则按时间窗口聚合时会错乱
发现扫描后该立刻做什么?别急着封 IP
封单个 IP 效果有限,扫描器常走代理池或僵尸网络。更有效的是在 nginx 层加轻量拦截,同时确认 phpMyAdmin 是否暴露在公网。
- 先查 phpMyAdmin 是否真的需要外网访问:如果不是运维必需,应移至内网或加 HTTP Basic Auth,这是最根本的缓解
- 临时拦截可用
limit_req:对/phpmyadmin/路径限制每分钟 3 次请求,防暴力探测 - 不要依赖
deny指令硬封 IP——扫描器换 IP 太快,反而可能误伤 CDN 或爬虫正常回源
真正麻烦的不是识别,是日志里混着真实运维操作和扫描流量时,如何区分 token 登录成功后的合法请求和扫描器碰巧打中的 200。这时候得看后续请求链:真实用户会有 POST /import.php 或 GET /js/messages.php,扫描器基本只停在首页或 login.php。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










