本文目录导读:

盲注入漏洞(Blind SQL Injection)是指攻击者无法直接从页面输出中获取数据库查询结果,但可以通过观察应用程序的响应时间、HTTP状态码或布尔条件反馈来推断数据,下面是一套系统化的排查流程,结合了工具扫描与手动验证方法。
排查前的准备
- 确定测试范围:收集所有用户输入点(URL参数、表单字段、Cookie、HTTP头等)。
- 确认数据库类型:通过常见的数据库指纹(如报错信息、特有函数)或工具辅助判断(MySQL、Oracle、SQL Server等)。
使用自动化工具进行初步扫描
-
SQLMap(推荐):
sqlmap -u "http://example.com/page?id=1" --batch --level 3 --risk 2
- 添加
--time-sec调整延时检测敏感度。 - 使用
--threads提高扫描速度。
- 添加
-
Burp Suite配合插件:
- 拦截请求后发送到Intruder模块,使用SQL注入Payload列表(如SecLists)。
- 观察响应长度、状态码或延迟是否出现异常。
手动检测布尔盲注
测试点选择
- 输入 或 等特殊字符,观察响应是否与正常请求不同(如返回404、500或空白页)。
- 尝试
' AND 1=1--与' AND 1=2--,比较响应差异(如页面是否正常加载、错误信息是否变化)。
示例(PHP+MySQL场景)
正常:http://example.com/user?id=1 布尔测试 1:http://example.com/user?id=1' AND 1=1-- 布尔测试 2:http://example.com/user?id=1' AND 1=2--
- 若条件为真返回正常页面,条件为假返回错误或空白,则存在布尔盲注。
手动检测时间盲注
-
使用数据库特定的延迟函数:
- MySQL:
SLEEP(5) - SQL Server:
WAITFOR DELAY '0:0:5' - Oracle:
DBMS_LOCK.SLEEP(5)或UTL_INADDR.get_host_name('10.0.0.1')
- MySQL:
-
过滤掉网络延迟的干扰(如连续测试3次取平均值)。
示例
http://example.com/product?id=1' OR SLEEP(5)--
- 如果页面响应时间显著增加(约5秒),则存在时间盲注。
分析响应差异的细微区别
- HTTP状态码:200正常 vs 403/500异常。
- 响应长度:通过Burp Suite的“Size”列观察是否变化。
- 关键词:如“Not Found”“Error”“Warning”等。
进阶排查技巧
多语句拼接测试
- 尝试 或
UNION等分隔符,看是否能执行多条SQL。
绕过WAF/过滤
- 使用注释符()、十六进制编码(
0x...)、双重编码(URL编码)绕过简单关键词过滤。 - 经典Payload:
1' AND (SELECT 1 FROM users WHERE username='admin')--
结合日志分析
- 查看应用服务器日志中的SQL查询记录(如果可访问),确认输入是否被拼接到原始查询中。
利用Payload自动化验证
- 编写脚本(Python + requests)逐位提取数据:
import requests url = "http://example.com/user?id=1' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>64--" if "正常响应特征" in requests.get(url).text: # 字符 > 'A',继续二分法
文档与验证
- 明确标记存在盲注的具体接口和注入点。
- 提供重现步骤:Payload示例、预期响应、实际响应。
- 建议开发者采用参数化查询(PreparedStatement)或ORM框架修复。
注意事项
- 生产环境谨慎测试:时间盲注的SLEEP操作可能导致数据库连接池耗尽或应用崩溃。
- 不要触发逻辑删除或修改操作:避免使用
-- ; DROP TABLE等破坏性语句。 - 法律合规:确保拥有授权或在自建测试环境进行。
如果排查后仍无发现,可以检查是否存在二阶注入(如将输入存储到数据库再在其他页面回显)或NoSQL注入场景。