easy_tornado
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,下一步有两个思路:
- 从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