2018 TokyoWesterns CTF WriteUp
2018 年 TokyoWesterns CTF,即第四届 TokyoWesterns CTF,是一场由 TokyoWesterns 团队主办的线上 CTF 比赛
比赛时间:2018 年 9 月 1 日 01:00 - 9 月 3 日 01:00 (UTC)
比赛形式:线上 Jeopardy(解题)模式
题目类型:包括 Crypto(密码学)、Pwning(二进制漏洞利用)、Reversing(逆向工程)、Web 等
赛事语言:题目提供英语和日语两个版本
Flag 格式:TWCTF{something}
特殊奖励:冠军队伍将获得 CODE BLUE CTF 2018 Finals 的参赛资格
赞助商:Google Cloud
Web
shrine(Flask 模板注入 + .__globals__ 绕过 + .config 绕过)

网页直接给了源码,考察 Flask/Jinja2 服务端模板注入
1 | import flask |
确认存在漏洞

WAF 过滤掉了空格,因此下面这些常规 SSTI payload 都会失效
1 | {{config.items()}} |
WAF 没有执行 s.replace('config', ''),也没有禁止 payload 中出现字符串 config,只是给模板添加了前缀
1 | {% set config=None %} |
因此以下表达式中的裸变量会失效
1 | {{config}} |
但其他对象的 .config 属性仍然可以访问
1 | {{some_object.config}} |
Flask 默认会向 Jinja 模板上下文提供以下对象
1 | config |
其中 config 被覆盖,self 被覆盖,但 request、g 和 url_for 仍然可用
在 Python 中,每个函数对象都有一个 __globals__ 属性,它指向该函数定义时所处模块的全局命名空间
利用 {{url_for.__globals__}} 构造 Payload
1 | {{url_for.__globals__['current_app'].config['FLAG']}} |
