BUU-Web-[护网杯 2018]easy_tornado
前言
每做一次新类型的题,就是一个新的知识点,将知识点弄通,就是对自己的一次提升。
开工
对3个url都进行访问


每个请求头都带有file_name和filehash
再看第三个文件hints.txt中明确写出了加密方式

这里我们就可以开始构建代码
但是我们发现输出结果于filehash中的结果不同
我这边误以为cookie_secret就是header中的Cookie,以至于加密结果错误
与此同时,我们试着直接访问/file?filename=/fllllllllllllag
得到了以下报错结果

这里试着对msg进行模版注入/error?msg={{1}}
模版注入:不正确的使用flask中的render_template_string方法会引发SSTI。
在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。
通过{{}}变量包裹符进行简单的表达式测试来判断是否存在SSTI漏洞
例如{{config}}(查看flask全局变量),{{2*2}}

这里对下划线做了过滤“_”因此无法直接通过命令获取flag

通过查阅tornado的官方文档


也就是说我们需要查找的cookie_secret是存放在对象self.application.settings["cookie_secret"]中

从后续的文档中获取到self.application.settings的别名为RequestHandler.setting



官方给出了能调用的对象的别名

可以发现我们需要调用的RequestHandler的别名是handler
因此settings的位置为[handler.settings]

获取到cookie_secret后就直接将其放入上面写好的加密程序中就可以计算出flag文件的hash值
最终获取到flag


总结
本次主要就是考察了模版注入的基本知识,做法也较为简单,起初一直没搞明白handler是怎么来的,通过逐步查阅官方文档发现这个是官方定义的别名。
主要知识点
模版注入(SSTI)
tornado中功能类的别名