如何通过魔改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 字样从流量里抹掉。
阅读全文