[护网杯 2018]easy_tornado
首先出来三个链接
查看flag.txt
提示flag在/fllllllllllllag中
OK,知道了第一个条件,filename=/fllllllllllllag
查看welcome.txt
查看hints.txt
分析一下
这里有两个参数,第一个参数filename,文件的名称,我们通过查看flag.txt文件知道,藏flag的文件名为fllllllllllllag;第二个参数filehash,翻译一下:文件哈希,也就是加密了
加密方法在第三个文件中md5(cookie_secret+md5(filename))
,将cookie_secret+filename的值md5加密后的值,整体再md5加密;然后把最后的值赋给filehash
现在最重要的一步就是获取cookie_secret的值,这个我不会。看一下大佬们怎么做
在试的过程中,尝试只输入filename的值而忽略filehash,结果出来以下内容,URL变成/error?msg=Error
我们前面忽视了第二个文件内容render
。我以为只是个没用的信息,结果一查,还是个挺重要的东西,怪我见得太少
render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 ,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
以上是我的分析过程,下面看一下大佬的解法
由于是python的一个模板,首先想到的就是模板注入{{}},最终找到的位置是报错网页(随便访问一个文件是更改它的签名就可以进入),里面的参数msg。
render是模板注入,经过测试发现过滤了。构造payload:/error?msg={{1*2}}
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量
构造payload/error?msg={{handler.settings}}
找到cookie_secret为6e6e371d-7445-46db-8066-46e0e25c8b7a
filename的值md5加密后为3bf9f6cf685a6dd8defadabfb41a03a1
cookie_secret+filename加密后的值为9ff081746c35f525a315a313ac1a00d8
构造payload:/file?filename=/fllllllllllllag&filehash=9ff081746c35f525a315a313ac1a00d8