SSTI注入--服务器端模板注入

0x00 简介

SSTI又称服务器端模板注入,也是一种注入型漏洞,和sql注入的形成原因相似,都是由于没有对获取的数据进行有效的过滤。不同之处是SSTI利用的是现在的网站模板引擎,主要针对的是编程语言的一些网站框架,漏洞产生在这些框架运用渲染函数生成html的时候。

0x01 相关补充

模板引擎

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。
模板引擎提供生成指定html的引擎,我们只需要向里面填充我们的数据即可,以此来提高效率。

为什么使用模板引擎

上面我们已经介绍了使用模板引擎的一些好处,但是你可能对那些专业术语不是很明白,我们来进行进一步的介绍。为什么要实现界面和数据的分离?为什么要实现业务代码与逻辑代码的分离?

  • 影响代码的可观性
  • 不利于代码的复用

这和我们进行函数封装的目的是相同的

render

render是一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页

0x02 原理

下面这段代码,运用的是php的twig
很明显这段代码存在SSTI注入,因为他没有过滤获得的变量
直接将获得的变量填充到后端生成的html模板中,因为用户对这个变量可控
而且html是在后端生成的,那如果前端用户填写的是后端程序中的某个变量名
那渲染引擎会直接将变量名对应的值填充进生成的html模板中返回到前端进行展示
所以用户可以借此获得许多本不应该获得的数据,产生安全风险
用户还可以将变量填写成html标签等
例如

<script>alert(666)</script>

那就会形成XSS
但是下面这段代码就不存在,因为模版引擎一般都默认对渲染的变量值进行编码和转义,所以并不会造成跨站脚本攻击
通过用户对变量值的控制还可能造成更加危险的漏洞

    <?php

    require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php';

    Twig_Autoloader::register(true);

    $twig = new Twig_Environment(new Twig_Loader_String());

    $output = $twig->render("Hello {{name}}", array("name" => $_GET["name"]));  ## 将用户输入作为模版变量的值

    echo $output;

    ?>

虽然上面的代码不会形成XSS,但是下面的代码会形成

    <?php

    require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php';

    Twig_Autoloader::register(true);

    $twig = new Twig_Environment(new Twig_Loader_String());

    $output = $twig->render("Hello {$_GET['name']}");  ## 将用户输入作为模版内容的一部分

    echo $output;  

这两段代码的主要区别就在于render函数的应用
第一段代码将变量通过render函数的第二个参数带进去,render函数对变量进行了编码和转义,所以不会发生XSS
但是第二段代码中直接带入第一个参数中,没有经过render函数的编码和转移,相当于直接把原变量填充到模板中,所以会发生XSS

0x02 漏洞挖掘

    <?php

    require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php';

    Twig_Autoloader::register(true);

    $twig = new Twig_Environment(new Twig_Loader_String());

    $output = $twig->render("Hello {$_GET['name']}");  ## 将用户输入作为模版内容的一部分

    echo $output;  

我们以这个代码为例,假设服务地址为:

http://192.168.0.2/

首选就是验证漏洞,输入如下payload:

http://192.168.0.2/?name={{1+1}}
## 为什么要加{{}} 主要取决于后端服务的语法

如果在浏览器界面返回了 2
说明后端已经得到参数,并进行了渲染,及漏洞存在
我们就可以进一步取利用了

0x03 漏洞防范

想要防范好该漏洞主要就是对传入的阐述做好足够的过滤,充分利用好render函数的编码和转义
其实模板引擎也提供了沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术来进行绕过,所以也要注意沙箱机制的安全性

0x04 工具

Tplmap(Template Mapper)是一种自动化工具,可以检测和利用服务器端模板注入漏洞(SSTI)。
下载地址:https://github.com/epinna/tplmap
依赖:

pip install PyYaml

0x05 常见模板引擎

参考
posted @ 2020-08-09 16:13  she11s  阅读(438)  评论(0编辑  收藏  举报