知识点

  • SSTI模板注入

render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页。

Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

在Tornado的前端页面模板中,Tornado提供了一些对象别名来快速访问对象,具体定义可以参考Tornado官方文档
本题中用到的是handler.settingshandler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量。

启动靶机

1. 打开题目

访问靶机,发现三个文件
image.png
访问flag.txt,提示flag在/fllllllllllllag
访问welcome.txt,提示render,模板注入
访问hints.txt,提示md5(cookie_secret+md5(filename))

2. 存在模板注入

尝试直接吧文件名改成 /fllllllllllllag
image.png
报错:
image.png
可以看到在报错的url中参数msg值为Error,然后界面就显示Error。
继续修改证实此处存在模板注入:
image.png
被过滤:
image.png
测试一下,发现被过滤的字符有:

  1. "%'()*-/=[\]_|

3. 获取cookie_secret

根据之前提示的md5(cookie_secret+md5(filename))以及之前打开文件的url参数,分析这个就是filehash的值,想获得flag只要我们在url中传入/fllllllllllllag文件和filehash。所以需要获取到cookie_secret。
在模板注入这里我们应该可以得到cookie_secret
handler.settings可以得到cookie_secretde的值
于是payload:

  1. ?msg={{handler.settings}}

得到cookie_secret
image.png

  1. 'cookie_secret': 'acfad1ff-3aff-420c-924d-f32691aab30c'}

4. 得到filehash

所以filehash为:

  1. md5(cookie_secret+md5(filename))
  2. ->
  3. md5(acfad1ff-3aff-420c-924d-f32691aab30c+md5(/fllllllllllllag))
  4. ->
  5. 得到:2f3ded1324b7d8b279dbc11c5fb95ecd

image.png

5. 最终payload

最终传参:

  1. http://33e999b7-7bfe-4586-8954-bf708048c9f0.node4.buuoj.cn:81/file?filename=/fllllllllllllag&filehash=2f3ded1324b7d8b279dbc11c5fb95ecd

得到flag
image.png