🔧 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
结果:
| 913100 | 100次 | UA 含 sqlmap 字样 |
| 920350 | 100次 | Host 头是纯数字 IP |
| 9 |

