SQL注入绕过技术与WAF防御实战解析

发布时间:2026/10/29 21:40:55
SQL注入绕过技术与WAF防御实战解析

1. SQL注入绕过的本质与防御逻辑

SQL注入绕过的核心在于理解WAF(Web应用防火墙)的检测机制与开发者的过滤逻辑。现代WAF通常采用多层检测策略,包括关键字黑名单、语法分析、行为模式识别等。以MySQL环境为例,当检测到union select、information_schema等敏感词时就会触发拦截。

我常把WAF比作机场安检——它依靠预设规则识别"危险物品",但总有方法通过拆解、伪装或特殊包装让"违禁品"通过检查。比如将select写成sEleCt利用大小写变异,或者用/*!50000select*/这种MySQL特有的内联注释语法。

重要提示:所有绕过技术都建立在目标存在SQL注入漏洞的前提下。如果开发人员正确使用预编译语句(PreparedStatement),这些绕过手法将全部失效。

2. 常规WAF绕过手法精析

2.1 编码与变形技术

  • 十六进制编码:select→0x73656c656374
  • URL编码:'→%27,"→%22
  • Unicode编码:'→%u0027
  • 大小写混合:UnIoN SeLeCt
  • 注释插入:sel/**/ect、se%00lect

实测案例:在某个CMS的搜索功能中,原始注入' union select 1,2,3--被拦截,改用' uni%6fn sel%65ct 1,2,3%23成功绕过。

2.2 等价替换方案

当常见关键词被过滤时,可用以下替代方案:

  • and 1=1→&& 1=1(MySQL逻辑与)
  • or 1=1→|| 1=1
  • =→like、rlike、regexp
  • sleep(5)→benchmark(10000000,md5('test'))

特殊场景下甚至可以用数学函数构造布尔条件:

' || ascii(substr(database(),1,1))>96 #

3. 高级绕过技术实战

3.1 HTTP参数污染(HPP)

利用服务器对重复参数的处理差异:

?id=1&id=2' union select 1,2,3--

某些WAF只检查第一个参数,而应用程序可能取最后一个参数值。

3.2 分块传输编码(Chunked)

通过修改HTTP头强制分块传输,可以绕过部分基于正则表达式的WAF检测:

POST /search.php HTTP/1.1 Transfer-Encoding: chunked 4 id=1 8 ' union 7 select 1 0

3.3 非常规注入点利用

  • User-Agent/X-Forwarded-For头注入:
GET / HTTP/1.1 User-Agent: ' and 1=convert(int,@@version)--
  • JSON格式注入:
{"username":"admin'-- ","password":"any"}

4. 云WAF专项绕过技巧

4.1 边界突破技术

云WAF如阿里云、Cloudflare等常采用前置流量分析,可通过以下方式突破:

  • 超长参数:构造超过8KB的参数值使WAF跳过检测
  • 畸形HTTP请求:故意制造非标准换行符(\x0b)、错误的内容类型

4.2 时间延迟盲注优化

当直接布尔盲注被拦截时,可采用分段延迟:

' || if(ascii(substr(user(),1,1))>100, benchmark(10000000,md5('test')), 0) #

5. 防御视角的深度思考

作为渗透测试人员,我总结出WAF绕过的三个黄金法则:

  1. 变形原则:通过编码、注释、空白符等改变特征
  2. 替代原则:使用功能等效但语法不同的表达式
  3. 环境适应原则:根据具体数据库类型(MySQL/MSSQL/Oracle)调整语法

而站在防御角度,建议开发者:

  • 严格使用参数化查询
  • 实施最小权限原则(数据库账户仅需SELECT权限时不要给UPDATE)
  • 对输入实施白名单验证而非黑名单过滤
  • 定期更新WAF规则库(如ModSecurity的OWASP CRS)

在一次金融系统渗透中,我通过组合/*!50000*/注释和分块传输编码,成功绕过了某商业WAF的防护。这再次证明:没有绝对的安全,只有持续攻防对抗中的动态平衡。