一次漏洞挖掘过程中的SQL注入浅浅绕过记录
字数 928 2025-08-29 08:30:24
SQL注入绕过技术实战教学文档
0x00 背景介绍
本案例描述了一个针对CMS系统的SQL注入漏洞发现与绕过过程。目标网站存在SQL注入漏洞,但开发了多种安全防护措施,包括:
- 单引号转义(转换为
\') - 逗号过滤
- 引号限制
0x01 漏洞发现
初始发现
- 通过测试发现网站存在SQL注入漏洞
- 报错信息中返回了原始SQL语句片段:
in(\'\') - 推断原始SQL语句格式为:
select * from xlz where id in ($id)
安全防护分析
-
引号处理:
- 单引号、双引号、斜杠等特殊字符会被转义
- 例如:
'→\'
-
错误表现:
- 当注入特殊字符时,系统会直接报错
0x02 注入绕过技术
1. 基础Payload构造
初始有效Payload格式:
11)AND(CASE+WHEN(1=1)+THEN+1+ELSE+exp(710)+END
2. 绕过逗号过滤
发现substr()函数中的逗号被过滤,使用from for语法替代:
传统写法:
substr(database(),1,1)
绕过写法:
substr(database() from 1 for 1)
3. 绕过引号限制
由于引号被转义,使用ASCII码函数替代字符串比较:
传统写法:
substr(database(),1,1)='a'
绕过写法:
ascii(substr(database() from 1 for 1))=97
4. 完整Payload示例
获取数据库名的Payload:
11)AND(CASE+WHEN(ascii(Substr(database()+from+1+for+1))=1)+THEN+1+ELSE+exp(710)+END
0x03 注入流程
-
判断数据库名长度:
- 使用二分法判断长度
- 示例:判断长度为14
-
逐字符获取数据库名:
- 通过修改
from和for参数获取每个字符 - 使用ASCII码比较确定具体字符
- 通过修改
-
数据提取:
- 同样的方法可应用于获取表名、字段名和数据
- 只需修改
database()为相应查询语句
0x04 防御建议
针对此类注入攻击,建议采取以下防护措施:
-
输入验证:
- 严格限制输入数据类型和格式
- 使用白名单验证
-
参数化查询:
- 使用预处理语句和参数化查询
-
最小权限原则:
- 数据库账户使用最小必要权限
-
错误处理:
- 自定义错误信息,避免泄露系统细节
-
多层防护:
- 结合WAF和其他安全措施
0x05 总结
本案例展示了如何绕过多种SQL注入防护措施:
- 使用
CASE WHEN结构绕过基础过滤 - 使用
from for语法替代被过滤的逗号 - 使用ASCII码比较避免引号使用
- 通过报错信息推断原始SQL结构
这种技术适用于存在类似防护措施的Web应用,强调了安全防护需要多层次、多角度的考虑。