布尔盲注原理
布尔盲注(Boolean-based Blind SQL Injection)是一种 SQL 注入攻击技术,利用数据库查询的布尔逻辑(真/假)来推断数据库中的数据。它适用于无法直接看到查询结果的场景,例如页面只返回“成功”或“失败”等简单状态。以下是布尔盲注的原理、步骤和示例。
原理¶
布尔盲注的核心思想是通过构造特定的 SQL 注入语句,观察应用程序的响应是否发生变化(例如页面内容、状态码或响应时间),从而推断数据库中的数据。攻击者通过逐位或逐字符猜测数据,利用布尔条件(真/假)来确认猜测是否正确。
关键点:
- 数据库查询的返回值会影响应用程序的行为(例如页面是否显示正常)。
- 攻击者通过注入条件语句(如 AND 1=1 或 AND ASCII(SUBSTR(...)) > 65),观察响应变化来推断数据。
- 通常需要多次请求,逐一测试每个字符或位的值。
步骤¶
确认注入点:
找到一个可以注入 SQL 语句的参数(例如 URL 参数、表单输入等)。
测试注入点是否支持布尔逻辑,例如:
如果响应不同,说明存在布尔盲注的可能性。
确定查询逻辑:
通过注入布尔条件,观察页面响应是否变化。例如:
确认可以通过布尔条件控制页面行为。
推断数据:
使用条件语句逐一猜测数据库中的数据,通常结合以下函数:
SUBSTR 或 SUBSTRING:提取字符串的子串。
ASCII 或 CHAR:将字符转换为 ASCII 值或反之。
LENGTH:获取字符串长度。
>, <, =:比较值。
示例:推断数据库版本的第一个字符:
id=1 AND ASCII(SUBSTR((SELECT @@version), 1, 1)) > 65
如果页面正常,说明第一个字符的 ASCII 值大于 65(即大于 'A')。
继续调整比较值(如 > 66, = 66),缩小范围,直到确定具体字符。
自动化或手动枚举:
手动测试效率低,通常使用二分法或自动化工具(如 Burp Suite、SQLMap)来加速猜测。
例如,通过二分法确定 ASCII 值:
id=1 AND ASCII(SUBSTR((SELECT @@version), 1, 1)) > 100 -- 正常
id=1 AND ASCII(SUBSTR((SELECT @@version), 1, 1)) > 110 -- 异常
说明 ASCII 值在 100 到 110 之间,继续细分。
提取完整数据:
重复上述步骤,逐位提取字符串(如表名、列名、数据内容)。
例如,提取整个数据库版本字符串需要循环测试每个位置的字符。
示例¶
假设有一个 Web 应用,URL 为:
目标是提取数据库的版本信息(@@version)。
测试注入点:
http://10.16.2.3:8081/Less-8?id=1 AND 1=1
*页面正常显示。*
http://10.16.2.3:8081/Less-8?id=1 AND 1=2
*页面显示错误或空白。*
*确认存在布尔盲注漏洞。*
确定版本字符串长度:
`http://10.16.2.3:8081/Less-8?id=1 AND LENGTH((SELECT @@version)) = 10`
*页面正常,说明版本字符串长度为 10。*
*如果不正常,尝试其他长度(如 9、11)。*
提取第一个字符:
http://10.16.2.3:8081/Less-8?id=1 AND ASCII(SUBSTR((SELECT @@version), 1, 1)) > 65
*页面正常,说明第一个字符的 ASCII 值大于 65。*
http://10.16.2.3:8081/Less-8?id=1 AND ASCII(SUBSTR((SELECT @@version), 1, 1)) = 77
*页面正常,说明第一个字符的 ASCII 值是 77(即 'M')。*
*确认第一个字符为 'M'。*
提取后续字符:
重复步骤,测试 SUBSTR((SELECT @@version), 2, 1)、 SUBSTR((SELECT @@version), 3, 1) 等。
最终可能提取到版本字符串,如 Microsoft SQL Server。
特点与难点¶
特点:
不需要直接看到查询结果,适合“盲”场景。
依赖应用程序的响应差异(页面内容、HTTP 状态码等)。
可以通过自动化工具高效执行。
难点:
需要多次请求,效率较低(尤其手动测试时)。
响应差异可能微妙(如仅文本变化),需要仔细分析。
可能受限于网络延迟或应用程序的防御机制(如 WAF)。