常见扫描器特征与日志分析
公网上的每个站点每天都在被扫。看懂访问日志里的攻击特征,是安全运维的基本功——多数入侵在得手前都有可识别的前奏。
常见特征清单
目录与敏感文件探测:
GET /.env
GET /.git/config
GET /admin/login.php
GET /phpmyadmin/
GET /wp-login.php
已知漏洞利用探测(特定 URL 或超长 UA):
GET /index.php?s=/Index/\x5Cthink...
POST /api/jsonws/invoke
UA: sqlmap/1.7 / Nikto / masscan
爆破:同一 IP 对登录接口高频 POST,失败状态码(401/403/200+错误码)密集重复。
Webshell 探测与残留:
GET /uploads/shell.php # 上传目录里出现 php 请求
POST /xx.php 密码参数特征 # 菜刀/蚁剑连接
巡检脚本的最小实现
# 昨日 TOP 请求路径
awk -F'"' '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -rn | head -20
# 失败登录 TOP IP(结合应用日志)
grep 'login' app.log | grep -c 'failed' | sort -rn | head
# 上传目录的脚本类请求(正常应为 0)
grep -E 'uploads/.*\.(php|phtml|asp)' access.log
从日志到动作
| 发现 | 动作 |
|---|---|
| .env/.git 探测 | 确认文件不可访问(403/404),无需恐慌,属常态噪音 |
| 登录高频失败 | IP 临时封禁 + 启用账号锁定 |
| 上传目录出现脚本请求 | 立即检查该目录文件,可疑即隔离,查上传校验逻辑 |
| sqlmap UA | 检查对应接口的参数化情况,WAF 拦截 |
关键是把巡检做成例行:每天或每周一条 cron 汇总异常计数发到通知群,比事后翻几万行日志有效得多。
日志本身的卫生
- 访问日志保留 30-90 天,安全事件需要回溯;
- 日志里别记录密码、完整令牌——日志库的访问控制通常比数据库松;
- 多机部署时日志集中(rsyslog/文件同步),否则攻击者打一台、删一台的日志,证据链就断了。
一个心态提醒:扫描本身不可怕,可怕的是扫描到的弱点真实存在。日志巡检的价值不是「看见攻击者」,而是用攻击者的视角,提前找到自己的疏漏。