
1. 绕过WAF的SQL注入Fuzz字典构建基础在当今Web应用防火墙WAF高度普及的环境下传统的SQL注入攻击手段往往会被立即拦截。作为一名渗透测试工程师我经常遇到这样的情况明明知道目标系统存在SQL注入漏洞但常规的Payload就是无法绕过WAF的检测。这时候一个精心设计的Fuzz字典就显得尤为重要。Fuzz字典本质上是一个包含各种变形Payload的集合它的核心思想是通过大量尝试不同的字符组合、编码方式和语法变形来寻找能够绕过WAF规则的有效Payload。我习惯把这些Payload称为变形金刚因为它们需要在保持原有功能的前提下通过各种伪装来骗过WAF的检测。构建这样一个字典需要考虑几个关键因素首先是Payload的多样性要包含各种大小写变形、编码方式、注释插入等其次是Payload的针对性要根据目标数据库类型MySQL、MSSQL、Oracle等选择特定的语法最后是Payload的隐蔽性要尽可能减少触发WAF规则的可能性。2. 常见WAF绕过技术与字典构建策略2.1 大小写变形与特殊字符插入这是最基本的绕过技术之一但效果往往出人意料。很多WAF规则是基于简单的字符串匹配通过改变大小写就能轻松绕过。比如SELECT * FROM users → sElEcT * FrOm uSeRs在实际构建字典时我会使用Python脚本自动生成各种大小写组合。同时插入特殊字符也是有效的绕过手段SEL/*xxx*/ECT * FR/*!*/OM users2.2 编码与十六进制转换编码转换是绕过WAF的利器。我常用的编码方式包括URL编码SELECT→%53%45%4c%45%43%54十六进制SELECT→0x53454c454354Unicode编码SELECT→\u0053\u0045\u004c\u0045\u0043\u0054在实战中我发现混合使用多种编码方式效果最好。比如%53%45%4c%45%43%54 * FROM users WHERE id0x312.3 注释与空白符技巧合理使用注释和空白符可以打乱WAF的语法分析。MySQL中的注释方式特别丰富SELECT/*!50000*/ * FROM/**/users空白符也不仅限于空格还包括%0a换行%0d回车%09制表符%a0不换行空格3. 高级Fuzz字典构建技巧3.1 报错注入专用Payload报错注入是绕过WAF的有效手段特别是updatexml和extractvalue这类函数AND updatexml(1,concat(0x7e,(SELECT version),0x7e),1)在字典中我会准备各种变形的报错注入Payload包括改变函数名大小写插入注释使用不同的连接符改变参数顺序3.2 宽字节注入技巧宽字节注入是针对特定编码环境的绕过技术最经典的就是%dfid%df AND 11--在构建字典时我会考虑不同的宽字节组合%df%27%bf%27%8f%273.3 系统表与函数利用现代WAF通常会过滤information_schema但MySQL 5.7提供了替代方案SELECT * FROM sys.schema_table_statistics_with_buffer在字典中我会包含各种系统表和函数的变形sys.schema_auto_increment_columnsperformance_schema.table_io_waits_summary_by_tablemysql.innodb_table_stats4. 实战中的字典优化与自动化4.1 字典的迭代与优化一个好的Fuzz字典不是一成不变的。在实际测试中我会根据目标响应不断调整字典内容记录哪些Payload被拦截分析拦截规律关键词、长度、特殊字符等生成新的变形Payload重复测试这个过程可以使用Python脚本自动化完成。比如def generate_variations(payload): variations [] # 大小写变形 variations.append(payload.swapcase()) # 插入注释 variations.append(payload.replace(SELECT, SEL/*123*/ECT)) # URL编码 variations.append(urllib.parse.quote(payload)) return variations4.2 智能Payload生成真正的Fuzz字典不应该只是静态的文本列表。我通常会开发智能Payload生成器根据目标环境动态调整探测数据库类型识别WAF特征选择最可能绕过的Payload类型动态生成测试Payload这种方法的成功率远高于使用固定字典。比如检测到MySQL环境后可以优先尝试/*!*/这种MySQL特有注释语法。4.3 实战案例分析去年在一次渗透测试中我遇到了一个配置严格的WAF。经过分析发现它对UNION SELECT拦截很严但对大小写变形注释的Payload检测较弱。最终使用的Payload是uNiOn/*!50000%0a*/SeLeCt 1,2,3,4,group_concat(table_name)FrOm/*!*/sys.schema_table_statistics_with_buffer/**/WhErE/**/table_schemadatabase()--%20这个案例让我深刻认识到好的Fuzz字典必须包含足够多的变形组合同时也要有针对性。