关键要结合UA字符串特征与行为模式交叉判断:含扫描器标识、危险字符、异常长度的UA,叠加高频404、敏感路径访问、空Referer等行为即可精准识别刷量。

直接看User-Agent字段本身没用,关键要结合行为模式和字符串特征交叉判断。刷量行为往往暴露在“不合常理”上——比如一个标着“curl/7.68.0”的请求,却在1分钟内扫了你300个后台路径;或者一个UA里混着$()、base64片段,还带空格和乱码。工具只是放大镜,逻辑才是准绳。
抓特征:哪些UA字符串本身就很可疑
不用等流量爆发,日常日志里就能筛出高危线索:
- 含已知扫描器标识:
sqlmap、nuclei、gobuster、dirb、whatweb - 无浏览器但堆操作系统信息:
curl/.*linux、wget/、python-requests/(注意写成curl/而非curl,避免误匹配curling) - 长度异常:
UA为空("-")、超短(仅-或?)、超长(>512字符) - 含危险字符:
$()、;、|、&、base64、eval(、system(
看行为:单靠UA不够,得盯IP+路径+频率
同一个UA可能合法也可能恶意,必须叠加行为维度:
- 同一IP在1分钟内发起>50次请求,且UA是
curl或wget,基本可断定是脚本刷量 - 高频访问非公开路径:如
/wp-admin/、/api/v1/internal、/phpmyadmin/ - 大量404响应伴随相同UA,说明在暴力探测目录结构
- Referer为空(
"-")且UA无浏览器特征,90%以上是自动化工具
用awk快速定位源头(不装新工具也能干)
假设日志是标准combined格式,先确认UA在第几列:
head -1 /var/log/apache2/access.log | awk '{print NF}'
再执行筛选(以第12列为UA为例):
awk ' ~ /sqlmap|nuclei|gobuster|curl\/|wget|python-requests|$\(|base64/ && == "404" {print , }' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -15
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
说明:
• $9 == "404"只看探测失败的请求,更聚焦攻击意图
• $1输出IP,方便后续封禁
• 正则中curl\/带斜杠转义,\$\(匹配$()防止shell注入
用goaccess做可视化验证
启动实时报表,重点关注三个信号:
- “User Agents”页里
Requests值极高,但Browsers显示Unknown -
OS列是Other,且Browsers为空或为None - 点开某条可疑UA,看其
Requested URLs是否集中于/admin、/api、/backup等敏感路径
命令示例(需确保UA字段被双引号包裹):
goaccess /var/log/apache2/access.log --log-format=COMBINED --agent-list --real-time-html --ws-url=192.168.1.100:7890
自动封禁:fail2ban联动阻断
在/etc/fail2ban/filter.d/apache-bad-ua.conf里定义规则:
[Definition]
failregex = ^<host> -.*"(GET|POST).*" [45][0-9][0-9] .*"(sqlmap|nuclei|gobuster|curl\/|wget|python-requests|\$\(|base64)"
ignoreregex =
要点:
• 状态码限定[45][0-9][0-9],只封4xx/5xx的恶意探测,避免误伤正常POST
• 正则末尾不加$,兼容UA末尾带空格或URL参数的情况
• 配合jail.local设置maxretry = 3、findtime = 60、bantime = 3600

















