打开题目以后出现三个文件,查看源代码,突破口在于这三个文件都有特殊的格式
python的tornado漏洞
Tornado 是一个用 Python 编写的 Web 框架(和flask一样,只不过flask是轻量级的,而tornado可以处理高流量)
Tornado模板支持 控制语句(control statements) 和 表达式(expressions). 控制语句被包在 {%
和 %}
中间, e.g., {% if len(items) > 2 %}
. 表达式被包在 {
{
和 }}
之间, e.g., {
{ items[0] }}
.
做法
url为:实例无法访问 / Instance can't be reached at that time | BUUCTF
/file?filename=/flag.txt&filehash=2ef541d9054cf736a891c97923c0ccff
如果把filehash的值改为随便其他一个数则会出现Error界面:
我们发现在url中msg参数的值也是Error,把Error改为其他值:
回显成功,存在注入点
呃呃不能这么判断有没有注入点,应该输入{ {随便值}}看看能不能回显
如果是其他命令就会失败,应该是被过滤掉的事
输入{ {handler.settings}},可以查询到cookie_secret
cookie_secret在Application对象settings的属性中 ,访问它的话就需要知道它的属性名字
self.application.settings有一个别名是RequestHandler.settings
其中handler又是指向处理当前这个页面的RequestHandler对象
RequestHandler.settings指向self.application.settings
因此handler.settings指向RequestHandler.application.settings
因为框架为tornado,存在多个handler,且handler为RequestHandler的子类,RequestHandler.settings指向self.application.settings
关于RequestHandler:在 Tornado 里,所有的请求处理程序都需要继承自 tornado.web.RequestHandler
类(也就是RequestHandler类),RequestHandler
是 Tornado 提供的一个基类,它封装了处理 HTTP 请求的基本功能和方法
在 RequestHandler
的实例中,self.application
指向当前运行的 Tornado 应用实例(即 tornado.web.Application
的实例)。self.application.settings
:这是一个字典,用于存储应用的全局设置。
Handler
通常指的是继承自 tornado.web.RequestHandler
的自定义处理类,而 settings
是 RequestHandler
的一个属性,它指向当前 Tornado 应用的全局设置(即 self.application.settings
),全局设置是一个字典,包含了应用的各种配置信息,如数据库连接信息、调试模式、模板路径等。
什么是字典?字典是一种数据结构,用于存储键值对。如:
my_dict = {'name': 'John', 'age': 30}
所以构造payload直接使得handler指向settings:
根据hint.txt的提示进行加密: