SQL 注入绕过 WAF 的常见技巧与防御思路

SQL 注入作为 Web 安全领域最经典的攻击方式之一,至今仍然活跃在各类漏洞报告和实战攻防场景中。随着 WAF(Web 应用防火墙)的广泛部署,攻击者也在不断演化绕过手段。理解这些绕过技巧,不是为了攻击,而是为了更清醒地认识到 WAF 的能力边界,从而构建更深层的防御体系。

一、WAF 的检测逻辑与弱点

WAF 的核心检测手段通常包括三类:基于正则的特征匹配、基于语法语义的解析检测、以及基于机器学习的异常行为识别。其中,正则匹配是最常见也最容易被绕过的机制,因为它依赖预定义的攻击特征库,而 SQL 语法的灵活性远超特征库的覆盖范围。

WAF 的典型弱点集中在以下几个方面:

  • 解析差异:WAF 对 HTTP 请求的解析方式与后端数据库、应用服务器不一致,攻击者可以利用这种差异构造“WAF 看不懂但数据库能执行”的 payload。
  • 性能约束:WAF 需要在极短时间内完成检测,无法对每个请求做完整的语法分析,只能做浅层匹配。
  • 编码多样性:SQL 支持多种编码和字符集,WAF 很难穷举所有等价表达。

二、常见绕过技巧分类

1. 大小写与关键字拆分

最简单的绕过方式是改变关键字的大小写,例如将 UNION SELECT 写成 UnIoN SeLeCt。如果 WAF 的正则未使用大小写不敏感模式,即可绕过。更进一步的技巧是使用内联注释拆分关键字:

/*!UNION*/ /*!SELECT*/

MySQL 支持 /*!...*/ 形式的可执行注释,WAF 若直接过滤 union select 连续字符串,则会被这种写法绕过。

2. 注释与空白符替换

WAF 通常依赖空格来识别关键字边界,攻击者可以用注释、换行、制表符甚至特殊 Unicode 空白字符替代空格:

UNION/**/SELECT
UNION%0ASELECT
UNION%09SELECT

在 MySQL 中,/**/%0a%09%0b%0c 等都可以作为空白符使用,而 WAF 的正则可能只匹配了普通空格。

3. 编码绕过

URL 编码、双重 URL 编码、十六进制编码、Unicode 编码都是常见手段。例如:

  • SELECT%53%45%4C%45%43%54(URL 编码)
  • SELECT0x53454C454354(十六进制,适用于某些上下文)
  • 宽字节注入:%bf%27 在 GBK 编码下可能被解析为合法字符,从而“吃掉”转义反斜杠

宽字节注入是经典中的经典,其本质是字符集转换过程中的解析歧义,而非单纯的编码混淆。

4. 等价函数与语法替换

当 WAF 封禁了 SUBSTRINGASCIICONCAT 等常见函数时,可以使用等价函数替代:

  • SUBSTRING(str,1,1)MID(str,1,1)LEFT(str,1)
  • ASCII(str)ORD(str)HEX(str)
  • CONCAT(a,b)CONCAT_WS('',a,b)a||b(视数据库而定)
  • information_schema.tablesmysql.innodb_table_stats(MySQL 8.0 无 information_schema 权限时的替代)

5. 参数污染与分块传输

HPP(HTTP Parameter Pollution)通过提交同名参数干扰 WAF 与后端应用的参数取值一致性。例如提交 ?id=1&id=2 union select...,WAF 可能只检测第一个 id,而后端取的是最后一个。

分块传输编码(Chunked Transfer-Encoding)则利用 WAF 与后端对分块请求体解析的差异,将 payload 分散到多个 chunk 中,使 WAF 无法还原完整的攻击语句。

6. 利用数据库特性

不同数据库对同一语义的表达方式差异巨大。例如 MySQL 中 UNION SELECT 可以用 UNION DISTINCT SELECT 替代;SQL Server 中可以用 %00 截断;Oracle 中可以用 UTL_INADDR 等包进行带外通信。WAF 若只针对某一种数据库语法做规则,跨数据库场景下就会失效。

三、防御思路:从 WAF 依赖到纵深防御

1. 参数化查询是根本

无论 WAF 规则多完善,参数化查询(Prepared Statement)始终是防御 SQL 注入最有效的手段。它将 SQL 语句结构与数据分离,使注入 payload 无法改变语义。所有与数据库交互的入口都应强制使用参数化查询,杜绝字符串拼接。

2. 输入验证与白名单

对用户输入进行严格的类型和格式校验。例如 ID 参数只允许数字,排序字段只允许预定义的列名白名单。白名单策略比黑名单更可靠,因为它从根本上限制了输入空间。

3. 最小权限原则

数据库账户应遵循最小权限原则:Web 应用使用的账户不应具有 FILEDROPINTO OUTFILE 等高风险权限,也不应能访问 information_schema 以外的系统库。这样即使注入成功,攻击者的利用空间也被大幅压缩。

4. WAF 的正确使用姿势

WAF 应作为纵深防御的一层,而非唯一屏障。在部署时需要注意:

  • 定期更新规则库,关注新型绕过手法
  • 对 WAF 与后端解析差异进行专项测试
  • 结合 RASP(运行时应用自我保护)在应用层做语义级检测
  • 开启日志与告警,将 WAF 拦截事件纳入安全监控

5. 安全编码规范与代码审计

在开发阶段引入安全编码规范,对数据库操作代码进行定期审计。重点关注拼接 SQL 的代码路径、ORM 框架的 raw query 用法、以及动态表名/列名的处理逻辑。

四、结语

SQL 注入绕过 WAF 的技巧本质上是利用了解析差异和规则盲区。防守方如果只依赖 WAF 的正则拦截,就永远处于被动追赶的状态。真正有效的防御是将参数化查询、输入验证、最小权限、WAF 和运行时检测组合成多层防线,让攻击者即使绕过一层,也无法完成完整攻击链。安全不是一道墙,而是一张网。

未经允许不得转载:任鹏个人博客 » SQL 注入绕过 WAF 的常见技巧与防御思路

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏