上一篇文章我们学习了报错注入。
通过数据库返回的错误信息,我们依然能够获取数据库中的数据。
但现实中的很多网站更加严格:
没有回显位
❌
没有错误信息
❌
页面永远只会显示:查询成功
或者:页面正常
这时候攻击者还能获取数据库信息吗?
答案是:可以。
这就是今天要学习的内容——布尔盲注(Boolean-Based Blind SQL Injection)。
什么是布尔盲注?
布尔盲注中的:Boolean
意思是:
True(真)
False(假)
攻击者无法直接看到数据库内容。
只能通过页面返回结果的不同来判断条件是否成立。
简单来说:
攻击者是在和数据库玩“猜谜游戏”。
为什么叫盲注?
因为攻击者看不到真实数据。
例如,正常情况下:
数据库名称:
security
可以直接显示。
这属于有回显。
而布尔盲注环境,页面永远不会显示:
security
攻击者只能通过:页面正常
或者:页面异常
来猜测数据。
所以被称为:Blind Injection(盲注)
布尔盲注是如何工作的?
假设网站存在如下查询:
SELECT * FROM news WHERE id=1;用户访问:
?id=1页面正常显示新闻内容。
攻击者测试:
?id=1 and 1=1结果:页面正常
因为:1=1 成立。
继续测试:
?id=1 and 1=2结果:页面空白
因为:1=2 不成立。
此时说明:
页面会根据真假条件产生不同响应。
攻击者就能利用这一特点获取数据。
攻击者如何猜数据库名?
假设攻击者想知道:数据库名称是什么,但无法直接查看。
那么可以这样思考,数据库名称的第一个字符是不是:a?
如果成立:页面正常
如果不成立:页面异常
继续猜:
b
c
d
e
...
直到找到正确字符。
例如:
s
页面正常。
说明:数据库名第一位 = s
接下来猜第二位:
e
页面正常。
得到:
se
不断重复:
s
e
c
u
r
i
t
y
最终得到:
security
如何获取表名?
知道数据库名称后,攻击者会继续收集信息。
例如:
数据库中可能存在:
users
admin
orders
news
这些表。
攻击者依然通过真假判断:逐个字符猜测。
例如:第一个表名第一位是不是u成立。
继续猜:
s
e
r
s
最终得到:
users
如何获取字段名?
找到:
users
表后。
继续获取字段。
例如:
id
username
password
email
通过不断判断真假条件。
最终能够枚举出字段结构。
如何获取用户数据?
知道:users表。
以及:
username
password
字段后。
攻击者继续猜测数据内容。
例如:
用户名第一位是不是a
成立。
继续猜:
d
m
i
n
最终得到:
admin
密码也可以采用同样方式逐个字符获取。
虽然速度慢。
但理论上依然可以读取数据。
为什么布尔盲注效率很低?
因为:每个字符都需要猜。
例如:
security
共8个字符。
攻击者需要:大量请求
才能获取完整结果。
相比:UNION注入
直接返回结果。
布尔盲注会慢很多。
但它适用于:无回显无报错环境。
因此非常重要。
布尔盲注的完整利用流程
如何防御布尔盲注?
核心思想依然不变:不要拼接SQL语句。
使用:参数化查询避免用户输入进入SQL逻辑。
关闭:数据库错误信息减少信息泄露。
限制:异常请求频率降低暴力猜测成功率。
采用:WAF防护识别恶意请求。
学习时需要理解什么?
很多人学习布尔盲注时,会疯狂记各种语句。
实际上更重要的是理解:为什么页面会出现真假差异 ,为什么真假差异能够代表数据,为什么可以逐个字符猜测,理解这个逻辑后,面对不同数据库环境,依然能够举一反三。