上一篇文章我们学习了布尔盲注。

布尔盲注的核心思路是通过页面返回结果的真假差异来推断数据库中的内容。

例如:

条件成立

页面正常


条件不成立

页面异常

但是现实中的很多网站更加严格,无论条件是否成立:页面内容都一样

既没有数据回显,也没有错误信息,甚至连页面显示效果都没有变化。

那么问题来了:

攻击者还能判断数据库中的数据吗?

答案是:可以。

这就是今天要学习的内容——时间盲注(Time-Based Blind SQL Injection)。

 

什么是时间盲注?

时间盲注是一种通过观察服务器响应时间变化来推断数据的方法。

简单来说:攻击者看不到数据,也看不到错误信息。

只能观察:页面返回得快还是慢

如果响应变慢:说明条件成立。

如果立即返回:说明条件不成立。

于是攻击者便可以通过时间差一步步推断数据库中的内容。

 

为什么需要时间盲注?

回顾之前学习的几种注入方式:

UNION注入

直接显示数据

 

报错注入

利用错误信息显示数据

 

布尔盲注

观察页面真假差异

 

但是如果网站:

  • 没有回显
  • 没有报错
  • 没有页面差异

那么前面的方法都会失效。

此时唯一还能利用的信息就是:响应时间

 

时间盲注是如何工作的?

假设数据库在满足某个条件时会额外执行一个耗时操作。

例如:

条件成立

等待5秒

返回页面

而条件不成立:立即返回页面

攻击者便可以根据时间差判断条件真假。

例如:

请求A

1秒返回

说明条件不成立。

 

请求B

6秒返回

说明条件成立。

 

于是:

攻击者就获得了一位“真假判断器”。

 

时间盲注与布尔盲注有什么区别?

很多新手容易把两者搞混,实际上它们思路非常接近。

布尔盲注观察:页面内容

例如:

页面正常
页面异常

 

时间盲注观察:响应时间

例如:

1秒返回
6秒返回

 

本质上都是:

构造条件

判断条件是否成立

推断数据

只是观察对象不同。

 

如何推断数据库名?

假设攻击者想知道数据库名称,但无法直接查看。

于是开始猜测:数据库名第一位字符是不是a?

如果响应时间没有变化:说明猜错。

 

继续猜:

b
c
d
...

 

当猜到:

s时。

页面明显延迟。

说明:

第一位字符 = s

 

继续猜第二位:

e

成立。

得到:

se

 

不断重复:

s
e
c
u
r
i
t
y

最终得到完整数据库名。

 

如何获取表名和字段名?

得到数据库名称后,攻击者会继续收集结构信息。

例如:

security

数据库中可能包含:

users
admin
orders
news

等表。

 

随后继续推断字段。

例如:

username
password
email

等字段名。

 

整个过程与布尔盲注完全类似。

只是依靠时间差完成判断。

 

为什么时间盲注速度更慢?

因为每一个字符都需要单独判断。

例如:

security

有8个字符。

每一位都需要进行大量猜测。

而每次判断还可能产生额外等待时间。

因此:

时间盲注>布尔盲注>报错注入>UNION注入

在效率上通常是最慢的一种。

 

时间盲注完整利用思路

整体流程如下:

 

 

如何防御时间盲注?

核心思想与其他 SQL 注入一致。

 

使用参数化查询

避免用户输入参与 SQL 逻辑。

 

输入校验

限制危险字符和异常输入。

 

关闭不必要的数据库功能

减少可被利用的执行逻辑。

 

设置请求频率限制

降低自动化探测效率。

 

部署安全防护设备

识别异常请求行为。

 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐