SSTI模板注入
SSTI模板注入
一、前言
1、模板引擎
模板引擎(这里特指用于WEB开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的HTML代码,模板引擎会提供一套生成HTML代码的此程序,然后只需要获取用户的数据,然后放到渲染函数里,从而生成模板+用户数据的前端HTML页面,发送给浏览器加载,呈现在用户面前。
2、SSTI(模板注入)
SSTI就是服务器模板注入(Server-Side Template Injection)
当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的MVC模式,用户的输入先进入Controller控制器,然后根据请求类型和请求指令发送给对应的Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
漏洞成因就是服务端接受了用户的恶意输入以后未经任何处理就将其作为Web应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell等问题。其影响主要取决于模板引擎的复杂性。
凡是使用模板的地方都可能会出现SSTI的问题,SSTI不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞。模板引擎的一种防护机制是不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。
二、Php中的SSTI
php常见的模板引擎:twig,smarty,blade
1、Twig
Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。
可以用PHP的composer依赖库管理软件来自动下载Twig
1 | composer require "twig/twig:^3.0" #下载3.0以上版本的twig(需要PHP7.2.5以上运行) |
这是一个无漏洞的官方文档给出的演示代码,很好的展示了模板的基本使用。你也许会想到这里或许存在一个XSS漏洞,但实际上模板自带的保护机制,会把用户传入的参数进行HTML实体化,例如>
;
1 |
|
但是如果用户传入的参数没有经过模板的渲染函数render的第二个参数传入使用,而是直接在定义模板时就使用了用户的传参,这就造成了代码任意执行的风险,因为用户可以构造代码,让twig的模板引擎去解析执行。以下展视了有漏洞的代码段。
1 |
|
此时输入xss代码,形成了攻击。
对于一个疑似有SSTI的网站,我们可以使用不用引擎的独有语句进行测试,来判断它是什么模板引擎,从而运用对应的Payload。Twig引擎的独特语句有,这是一个注释语句。
三、判断模板引擎的方法
You can try to probe {{7*'7'}}
to see if the target is vulnerable. It would result in 49
in Twig, 7777777
in Jinja2, and neither if no template language is in use.
四、模板常用payload
1、flask
命令执行(flask1.1.2 python3.7.7):
1 | {{''.__class__.__mro__[1].__subclasses__()[134].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')}} |