打开题目
打开flag.txt
告诉我们flag在 /fllllllllllllag下
打开welcome.txt
我们看到了render渲染函数,联想到ssti
打开hints.txt
然后我们留意到每个打开url上面都有filehash
告诉我们如果想要访问/fllllllllllllag下的flag文件,是需要filehash这个GET参数需要被mad5加密的filename(也就是/fllllllllllllag)与cookie_secret的md5加密才能访问最终的flag值
我们要想办法获取cookie_secret的值
我们将URL上的文件名修改替换为/fllllllllllllag试试
得到如下界面
提示?msg=Error
把url上的修改为?msg=/fllllllllllllag
但是我们随便写内容都能在页面上回显
包括我们加上{{}},模板注入必须通过传输型如{{xxx}}的执行命令
我们知道handler.settings是内置的环境配置信息名称
所以访问一下得到cookie_secret
cookie_secret: 1beaa4a8-aee4-4b8f-8b56-63b60cf13c24
这里需要注意的是三个url上的filehash都是小写字母
接下来我们构造payload就行
注意选择是32位小写
先是md5(filename)
接下来md5(cookie_secret+md5(filename))
1beaa4a8-aee4-4b8f-8b56-63b60cf13c24+3bf9f6cf685a6dd8defadabfb41a03a1
去掉加号加密得到78503f8a3e173f0546c4d6f35a52b713
组合一下得到payload
file?filename=/fllllllllllllag&filehash=78503f8a3e173f0546c4d6f35a52b713
得到flag
这里看到有别的师傅wp上用python脚本加密
这里借用一下师傅的
import hashlib #选用哈希模块
filename = '/fllllllllllllag' #文件名
cookie_secret = '76fc62a3-fea5-46ab-8f95-4b7262246f8c'#cookie_secret值
filename = hashlib.md5(filename.encode()).hexdigest()#/fllllllllllllag进行32位小写哈希md5加密
a = cookie_secret + filename#md5值进行拼接
filehash = hashlib.md5(a.encode()).hexdigest()#计算拼接后的md5值的md532小写的值
print(filehash)#输出加密后的md532位小写的值
知识点:
- render函数和template函数
render 函数 跟 模板(template) 都是用来创建 html 模板的,Vue 推荐在绝大多数情况下使用模板(template)来创建你的 HTML
template是一种类HTML的语法,它定义了组件的结构和展示,包括HTML标签、属性、事件和插值等。Vue将template编译成render函数,最终将render函数渲染成虚拟DOM,并将其渲染到页面上。
render函数则是一个函数式组件,它的参数是一个createElement函数和上下文对象。render函数用代码方式描述组件的结构和展示,并返回一个虚拟DOM节点,最终也会被渲染到页面上。
相对于template,render函数更加灵活和强大,可以更精细地控制组件的展示。同时,由于render函数是JavaScript代码,因此它可以被更好地集成到其他代码中。template则更加容易编写和理解,但可能会受到HTML标签和属性的限制。
在实际开发中,我们可以选择使用template或render函数来定义组件,具体取决于组件的需求和开发者的习惯。如果组件需要较为复杂的展示逻辑和动态交互,可以使用render函数来实现。如果组件比较简单,可以使用template来编写。
- 什么是模版注入?
模版注入就是存在于web应用中的注入漏洞,例如:
template = "Bio: {{ user.bio }}"
render(template)
如果使用此模板显示用户的输入,那么它是完全安全的,因为我们所做的只是从数据库中获取当前用户的信息,然后将其返回给用户,但下面这个例子就不太一样了:
template = "Bio: " + USER_INPUT
render(template)
如果用户的输入的成为模板的一部分,就构成了ssti漏洞,因为模板有能力执行任意代码,所以用户可以在服务器上获得一个shell。攻击者可以在其中注入恶意模板代码来获得shell,但需要注意的一点是,该漏洞不仅限于服务器,只要模板可用,漏洞就可以存在于任何地方
- 常见的模版
C#(StringTemplate,Sharepoint上动态使用的ASPX)。
Java(Velocity、Freemarker、Pebble、Thymeleaf和Jinjava)
PHP(Twig、Smarty、Dwoo、Volt、Blade、Plates、Mustache、Python、Jinja2、Tornado、mustache和String Template)。
Go (text/template)
- tornado框架特点
cookie_secret在Application对象settings的属性中 ,访问它的话就需要知道它的属性名字
self.application.settings有一个别名是RequestHandler.settings
其中handler又是指向处理当前这个页面的RequestHandler对象
RequestHandler.settings指向self.application.settings
因此handler.settings指向RequestHandler.application.settings
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量。
简单理解handler.settings即可,可以把它理解为tornado模板中内置的环境配置信息名称,通过handler.settings可以访问到环境配置的一些信息,看到tornado模板基本上可以通过handler.settings一把梭
收获:
1.了解到md5加密的python脚本
2.了解到handler.settings是tornado框架的环境配置文件
3.了解到模板注入必须通过传输型如{{xxx}}的执行命令
知识点源于:
buuctf easy-tornado(cookie_secret)_-栀蓝-的博客-CSDN博客
详解模板注入漏洞(上)_程序猿DD_的博客-CSDN博客
服务端模板注入攻击原理以及实战(SSTI)_服务器端模板注入-CSDN博客