SSTI
什么是SSTI模版注入
当前使用的一些框架,例如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入通过View视图层接收,再进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
凡是使用模板的地方都可能会出现SSTI的问题,SSTI不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。
产生原因
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。
其影响范围主要取决于模版引擎的复杂性。
常见的模版引擎
1、php
- Smarty,Smarty算是一种很老的PHP模板引擎了,非常的经典,使用的比较广泛。
- Twig,Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。
- Blade,Blade 是 Laravel 提供的一个既简单又强大的模板引擎
和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP 代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何额外负担
2、Java
- Freemarker,FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
- Velocity,Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。
3、Python
Flask Jinja2,Flask是一个轻量级的Python Web框架,支持Jinja2模板引擎。
Jinja2是一个流行的Python模板引擎,它可以使用Flask来创建动态Web应用程序。
- Django,django 应该使用的是专属于自己的一个模板引擎,我这里姑且就叫他 django,我们都知道 django 以快速开发著称,有自己好用的ORM,他的很多东西都是耦合性非常高的,你使用别的就不能发挥出 django 的特性了。
- Tornado,也有属于自己的一套模板引擎,tornado 强调的是异步非阻塞高并发。
相关属性
- \_class_
python中的新式类(即显示继承object对象的类)都有一个属性__class__
用于获取当前实例对应的类,例如"".__class__
就可以获取到字符串实例对应的类 - \_mro_
python中类对象的__mro__
属性会返回一个tuple对象,其中包含了当前类对象所有继承的基类,tuple中元素的顺序是MRO(Method Resolution Order) 寻找的顺序。 - \_globals_
保存了函数所有的所有全局变量,在利用中,可以使用__init__
获取对象的函数,并通过__globals__
获取file
os
等模块以进行下一步的利用 \_subclasses_()
python的新式类都保留了它所有的子类的引用,
__subclasses__()
这个方法返回了类的所有存活的子类的引用(是类对象引用,不是实例)。因为python中的类都是继承object的,所以只要调用object类对象的
__subclasses__()
方法就可以获取想要的类的对象。
检测思路
同常规的 SQL 注入检测,XSS 检测一样,模板注入漏洞的检测也是向传递的参数中承载特定 Payload 并根据返回的内容来进行判断的。每一个模板引擎都有着自己的语法,Payload 的构造需要针对各类模板引擎制定其不同的扫描规则,就如同 SQL 注入中有着不同的数据库类型一样。
简单来说,就是更改请求参数使之承载含有模板引擎语法的 Payload,通过页面渲染返回的内容检测承载的 Payload 是否有得到编译解析,有解析则可以判定含有 Payload 对应模板引擎注入,否则不存在 SSTI。
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论