打开靶场页面除了三个超链接似乎没有别的线索,我们先点击这几个超链接看看有什么提示

这个说真正的flag在/fllllllllllllag文件中

结合题目的名字Tornado的render模板渲染引擎,可能存在SSTI漏洞

这个给出了filehash的公式所以我们现在要找到cookie_secret
然后拼接在file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))
后端代码在处理 /error 路由时,通常会接收一个名为 msg 的参数,用来向用户展示错误提示信息
tornado 模板引擎的语法规定,双大括号 {{ ... }} 内部的内容会被当作 Python 表达式执行并输出。因此,当你输入 {{ ... }} 时,服务器会去计算括号里面的 Python 代码
在 Tornado 模板中,handler 是一个内置的全局变量,它指向当前处理该 HTTP 请求的 RequestHandler 实例。通过它,模板可以访问到当前请求的所有上下文信息
RequestHandler 实例持有一个 settings 属性,它对应的是整个 Tornado 应用初始化时传入的全局配置字典
在 Tornado 中,像 cookie_secret(用于 Cookie 加密签名的密钥)、debug 模式等全局配置,都是存放在这个 settings 字典里的
基于这几点我们可以开始构造payload:/error?msg={{handler.settings}}

得到cookie_secret
接着使用python脚本来得到filehash
python
import hashlib
cookie_secret = "c0796d82-a2c4-4615-a7da-3d9e326c58fd"
filename = "/fllllllllllllag"
# 计算 md5(filename)
md5_filename = hashlib.md5(filename.encode()).hexdigest()
# 计算 token
token = hashlib.md5((cookie_secret + md5_filename).encode()).hexdigest()
print(f"token = {token}") # 例如: "d41d8cd98f00b204e9800998ecf8427e"

