一、
-
打开题目,有3个txt文件
-
分别访问
-
flag.txt
-
welcome.txt
-
hints.txt
-
三个txt文件得知三个有用信息,其中通过题目easy_tornado和welcome.txt中的render可以得知,这里应该是ssti(服务端模板注入)。
-
再可以通过访问三个文件的url变化发现有用信息。
- flag.txt http://a94b8b6d-b92a-4343-8a35-d8bd8498a002.node3.buuoj.cn/file?filename=/flag.txt&filehash=c521f8ce0c1d93546587d4f5d3b8465b - welcome.txt http://a94b8b6d-b92a-4343-8a35-d8bd8498a002.node3.buuoj.cn/file?filename=/welcome.txt&filehash=35282a33c5ba2e39187575e96f35085e - hints.txt http://a94b8b6d-b92a-4343-8a35-d8bd8498a002.node3.buuoj.cn/file?filename=/hints.txt&filehash=3a7f053104fbb0665b08f71d8fbf7f94
-
可以看到存在变量 filename 和 filehash 。
-
并且 变量 filename 的值总是为要访问的文件,再根据提示三和 filehash 三个不同的值猜测 filehash 的值为MD5加密后的字符串。
-
先尝试访问提示一中的 fllllllllllllag ,让filename的值为 /fllllllllllllag,发现url发生变化并且提示错误。
-
接下来就必须先了解一下ssti(服务端模板注入)才能往下做。
二、
1、首先就是什么是服务端模板
- 我的理解是相当于很多公式,根据变量输出结果。这里的模板就是模板引擎根据数据自动生成前端页面。
- 这里就是基于 Python 开发的 一种 Web 模板 Tornado 。
- 具体参考 Tornado 官方文档 https://tornado-zh.readthedocs.io/zh/latest/
2、然后就是什么是ssti(服务端模板注入)
- 我的理解是错误的执行了用户输入。类比于 sql 注入。
- 具体参考 https://xz.aliyun.com/t/3679
3、再就是这里的提示二中的render是什么
- 是 Tornado 中的一个渲染函数 ,我的理解就是一个公式,能输出前端页面的公式。
- 具体参考 https://xz.aliyun.com/t/3679
https://www.jianshu.com/p/aef2ae0498df
4、最后是提示三中的cookie_secret是什么。
- 就是一个参数,也就是 cookie ,所以我们需要获取 cookie 。
- 这里就有一个这题最主要的一个知识点
- 在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量。
- 其实这里就很难理解为什么,找了很多博客包括官方文档也没有更详细的解释。
- 暂时当做一个知识点来记,以后如果详细了解了再回来更。
三、
1、根据上面的提示,想要得到flag, filename= /fllllllllllllag , filehash=md5(cookie_secret+md5( /fllllllllllllag))。
2、所以还需要解决一个问题就是得到cookie_secret。
3、根据上面内容得到cookie
- http://6063a0f4-4006-4d36-8520-b6e058648b47.node3.buuoj.cn/error?msg={{handler.settings}}
4 、最后可以自己写一个脚本获取md5后的字符串,这里我用的PHP。运行一下就行。
<?php
echo md5('f03d04f0-456b-4577-b431-bd29fd3292d2'.md5("/fllllllllllllag"));
?>
5、 payload:
- http://6063a0f4-4006-4d36-8520-b6e058648b47.node3.buuoj.cn/file?filename=/fllllllllllllag&filehash=5aa9f0f37f8fce2753303bae0ea18436
- 这里的filename值为动态,具体需根据cookie用脚本算出。
6、最终得到flag
四、
- 这题不难吧,主要是 handler.settings 这个知识点
- 附上原题链接 https://buuoj.cn/challenges#[%E6%8A%A4%E7%BD%91%E6%9D%AF%202018]easy_tornado
- 持续更新BUUCTF题解,写的不是很好,欢迎指正。
- 最后欢迎来访个人博客 http://ctf-web.zm996.cloud/