如何通过魔改sqlmap,研究流量特征以对抗WAF?
摘要:🔧 sqlmap 魔改研究 —— 从流量特征到 WAF 对抗 本文记录了对 sqlmap 进行源码级魔改的完整过程,目标是通过修改流量特征、请求头、payload 混淆等手段,降低被 OWASP ModSec
🔧 sqlmap 魔改研究 —— 从流量特征到 WAF 对抗
本文记录了对 sqlmap 进行源码级魔改的完整过程,目标是通过修改流量特征、请求头、payload 混淆等手段,降低被 OWASP ModSecurity CRS 规则集检测到的概率。所有测试均在本地靶场(DVWA)环境下进行,仅用于学习和安全研究。
🧠 思路
很多人用 sqlmap 跑 SQL 注入,结果一跑就被 WAF 拦得死死的,403 一片。
其实 WAF 拦截 sqlmap 不是魔法,靠的是规则匹配——它认识 sqlmap 的"味道":固定的 UA、特定的请求头、可预测的 payload 结构。
所以思路也很简单:把 sqlmap 改得不像 sqlmap。
改哪里?大概分三层:
第一层:身份特征 → UA、版本字符串、Banner
第二层:流量特征 → 请求头、请求间隔、Host
第三层:Payload → 关键字大小写、空格混淆、随机 padding
下面一层一层来。
🏗️ 环境搭建
靶场:DVWA(phpstudy 本地部署,端口 8564)
WAF:OWASP ModSecurity CRS(Docker 部署,端口 8080)
工具:sqlmap 1.10,Python,Wireshark/小蓝鲨
WAF 启动命令(检测模式,只记录不拦截):
docker run -d \
--name modsec-waf \
-p 8080:8080 \
-e BACKEND=http://172.30.240.1:8564 \
-e PROXY_SSL=off \
-e PROXY_TIMEOUT=60 \
-e MODSEC_RULE_ENGINE=DetectionOnly \
owasp/modsecurity-crs:nginx
流量走向:
sqlmap → localhost:8080 → ModSecurity → phpstudy:8564 → DVWA
保存日志:
docker logs modsec-waf > waf_log.txt 2>&1
🔍 先看原版的"指纹"
用小蓝鲨抓一下原版 sqlmap 的包,过滤条件:
http.request && ip.dst == 127.0.0.1
一眼就能看到问题:
User-Agent: sqlmap/1.9.10#pip (https://sqlmap.org) —— 这不就是自报家门吗 🤦
Accept: */* —— 正常浏览器不会这么发
没有 Accept-Language、Accept-Encoding、Referer 等正常请求头
WAF 看到这个请求,直接触发 913100(扫描器 UA 检测)规则,得分 +5,超过阈值直接拦截。
📊 原版 WAF 检测基准数据
先跑一遍原版 sqlmap,记录 WAF 触发了哪些规则,作为对比基准:
sqlmap -u "http://127.0.0.1:8080/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="..." --batch --level=3
结果:
规则ID
触发次数
描述
913100
100次
UA 含 sqlmap 字样
920350
100次
Host 头是纯数字 IP
942100
92次
libinjection SQL注入检测
949110
100次
入站总分超阈值
942190
28次
UNION SELECT 特征
942360
20次
SQL 注入混淆特征
951230
18次
MySQL 错误信息泄露
汇总:
规则触发总数:516次
平均每请求触发:5.2 条规则
平均异常分:15.2 分(WAF 阈值只有 5 分)
🛠️ 开始魔改
第一步:消除身份特征(lib/core/settings.py)
这是最核心的改动,把所有 sqlmap 字样从流量里抹掉。
