1.初步思路

题目给出了一下信息:

  • flag在/fllllllllllag
  • 访问文件需要/file?filename=文件名&filehash=文件签名
  • 文件签名长32位,规则为md5(cookie_secret+md5(filename)),看了下cookie发现本地没有cookie_secret,因此可以猜测cookie_secret是存储在服务端的
  • 题目名字为easy_tornado,tornado是一个python的框架。/welcome.txt内容为render,render是一个用来渲染模板的函数。两者结合可以猜测是利用tornado框架的ssti模板注入去获取cookie_secret

把filename更改会跳出一个错误页面/error?msg=Error,可以发现msg参数存在一个ssti,下一步有两个思路:

  1. 从python语言的角度进行攻击,也就是python沙盒逃逸,但这里会发现很多特殊字符都被过滤了,比如

    “%’()*-/=[]_|+

_被过滤意味着没有办法去调用python的魔术方法,很难去沙盒逃逸
2. 从tornado框架的角度进行攻击
_被过滤也很难调用tornado的方法,应该是去读一个变量

2.利用tornado框架

在tornado的文档上搜索cookie_secret可以发现它是tornado.web.Application类的属性settings字典的一个键值,在
“tornado.web — RequestHandler 和 Application 类”这一章中:

cookie_secret: 被 RequestHandler.get_secure_cookie 使用, set_secure_cookie 用来给cookies签名.

接下来就是要找到方法去访问tornado.web.Application.settings[‘cookie_secret’]
查看tornado文档中模板的部分

发现没有办法访问到Application
在”tornado.web — RequestHandler 和 Application 类”中搜索settings发现了这一条

RequestHandler.settings
self.application.settings 的别名.

而我们可以在模板中可以通过handler访问当前的 RequestHandler 对象
于是用?msg=就可以得到cookie_secret
然后计算出/fllllllllllllag的文件签名就可以得到flag

还有一个方法是不看文档,直接下载tornado的源码去搜索cookie_secret,可以参见
https://www.k0rz3n.com/2018/11/12/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8BSSTI%E6%BC%8F%E6%B4%9E/#3-Tornado