SSTI(模板注入)

SSTI简介

何为模板引擎(SST)

百度百科:模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。   
       个人理解就是:一个html页面中没有实际内容,但是有变量,访问这个页面时需要将这个变量转换成预期的内容,这时候就需要用到模板引擎。php(或者其他脚本语言)代码通过访问模板引擎,模板引擎通过正则匹配产生一个新的缓存的html页面,从而实现php和html代码的分离。
从网上找了个小例子帮助我们更好的理解SST的作用,大波code来袭:

tpl.func.php

<?php

    //两个参数 1,html 模板; 2,需要修改的参数
    function display($tplFile, $tplVars = null)
    {
        $tplFilePath = rtrim(TPL_PATH,‘/‘) . ‘/‘ . $tplFile;
        if (!file_exists($tplFilePath)) {
            exit(‘模版文件不存在‘);
        }
        $html = compile($tplFilePath);
        $cacheFileName = parsePath($tplFile);
        if (!check_cache_dir(TPL_CACHE)) {
            exit(‘缓存目录不可写‘);
        }
        if (!file_put_contents($cacheFileName, $html)) {
            exit(‘缓存文件写入失败‘);
        }
        if (is_array($tplVars)) {
            extract($tplVars);
            include $cacheFileName;
        }
    }
    function check_cache_dir($path)
    {
        if(!file_exists($path) || !is_dir($path)) {
            return mkdir($path,0755,true);
        }
        if(!is_writeable($path) || !is_readable($path)) {
            return chmod($path,0755);
        }
        return true;
    }
    function parsePath($tplFile)
    {
        $path = rtrim(TPL_CACHE,‘/‘).‘/‘.str_replace(‘.‘,‘_‘,$tplFile).‘.php‘;
        return $path;
    }
    function compile($path)
    {
        $keys = [
        ‘{if %%}‘              =>    ‘<?php if(\1): ?>‘,
        ‘{else}‘               =>    ‘<?php else : ?>‘,
        ‘{else if %%}‘         =>    ‘<?php elseif(\1) : ?>‘,
        ‘{elseif %%}‘          =>    ‘<?php elseif(\1) : ?>‘,
        ‘{/if}‘                =>    ‘<?php endif;?>‘,
        ‘{$%%}‘                =>    ‘<?=$\1;?>‘,
        ‘{foreach %%} ‘        =>    ‘<?php foreach(\1) :?>‘,
        ‘{/foreach}‘           =>    ‘<?php endforeach;?>‘,
        ‘{for %%}‘             =>    ‘<?php for(\1):?>‘,
        ‘{/for}‘               =>    ‘<?php endfor;?>‘,
        ‘{while %%}‘           =>    ‘<?php while(\1):?>‘,
        ‘{/while}‘             =>    ‘<?php endwhile;?>‘,
        ‘{continue}‘           =>    ‘<?php continue;?>‘,
        ‘{break}‘              =>    ‘<?php break;?>‘,
        ‘{$%% = $%%}‘          =>    ‘<?php $\1 = $\2;?>‘,
        ‘{$%%++}‘              =>    ‘<?php $\1++;?>‘,
        ‘{$%%--}‘              =>    ‘<?php $\1--;?>‘,
        ‘{comment}‘            =>    ‘<?php /* ‘,
        ‘{/comment}‘           =>    ‘*/?>‘,
        ‘{/*}‘                 =>    ‘<?php /* ‘,
        ‘{*/}‘                 =>    ‘*?>‘,
        ‘{section}‘            =>    ‘<?php ‘,
        ‘{/section}‘           =>    ‘?>‘,
        ‘{include %%}‘         =>    ‘<?php include \1;?>‘,
        ];

        $file = file_get_contents($path);
        foreach ($keys as $key => $val) {
            $pattern = ‘#‘. str_replace(‘%%‘, ‘(.+)‘, preg_quote($key,‘#‘)) .‘#imsU‘;
            $replace = $val;
            if (stripos($pattern,‘include‘)) {
                $file = preg_replace_callback($pattern, ‘parseInclude‘, $file);
            }
            else{
                $file = preg_replace($pattern, $replace, $file);
            }
        }
        return $file;
    }

    function parseInclude($data)
    {
        $path = str_replace(array(‘\‘‘,‘"‘),‘‘,$data[1]);
        //data[1]就是-------footer.html
        $cacheFileName = parsePath($path);
        display($path);
        return ‘<?php include "‘.$cacheFileName.‘";?>‘;
    }

config.php

<?php
    define(‘TPL_CACHE‘,‘./cache/‘);
    define(‘TPL_PATH‘,‘./views/‘);
#### test.php
    <?php
    include ‘config.php‘;
    include ‘tpl.func.php‘;

    $title = ‘圈子社区‘;
    $content = ‘圈子社区!圈子社区!‘;

    display(‘moban.html‘,compact(‘title‘,‘content‘,‘footercontent‘));

moban.html

    <html>
    <head>
    <title>{$title}</title>
    </head>
    <body>
        {$content}
    <br />
    <hr />
    </body>
    </html>

为什么要模板引擎

  如果在一个页面中php代码与html代码混合在一起,在很多时候都会造成不便,用模板引擎可以让php代码和html代码进行分离。

为什么SST是危险的?

  还是道哥的那句话,安全的本质是信任。SST信任了用户的输入,并且执行这些内容,包括执行本机函数。就像eval函数对传入的内容未加任何过滤一样。因此模板注入(SSTI)很容易导致远程代码执行(RCE)、信息泄露等漏洞。

实例演示

本来准备找CTF题的,但是一直没找到,如果有师傅找到源码,望分享!   
这里就用vuhub的ssti测试一下   
访问页面是hello guest

因为看过app.py的源码,所以直接在后面加参数?name=123,显示hello 123

说明这里的name我们是被信任的(当它什么都没过滤),猜测存在ssti。   
接着再输入一个表达式{{2*3}}

显示hello 6,验证了存在ssti。     
payload   
python3 :读取文件

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__==‘catch_warnings‘ %}{{ c.__init__.__globals__[‘__builtins__‘].open(‘/etc/passwd‘, ‘r‘).read() }}{% endif %}{% endfor %}

也可以用工具tplmap,挺好用   
https://github.com/epinna/tplmap

如何防御SSTI?

1.尽可能加载静态模板文件。

2.不要允许用户控制此类文件或其内容的路径。

参考

https://xi4or0uji.github.io/2019/01/17/2019-1-15-flask%E4%B9%8Bssti%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/   
https://blog.csdn.net/qq_40657585/article/details/83657220

原文地址:https://www.cnblogs.com/gzs-monkey/p/10727330.html

时间: 2024-08-30 00:55:43

SSTI(模板注入)的相关文章

SSTI模板注入

https://www.kingkk.com/2018/06/Flask-Jinja2-SSTI-python-沙箱逃逸/https://www.freebuf.com/column/187845.html 原文地址:https://www.cnblogs.com/clqnotes/p/12234234.html

2018护网杯easy_tornado(SSTI tornado render模板注入)

考点:SSTI注入 原理: tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式. 网上看到的例子: #!/usr/bin/env python # -*- coding:utf-8 -*- from tornado.web import UIModule from tornado import escape class cust

服务端模板注入(SSTI攻击)

服务端模板注入 1.模板注入原理 和常见Web注入的成因一样,也是服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露.代码执行.GetShell 等问题.其影响范围主要取决于模版引擎的复杂性. <?php require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php'; Twig_Autoloader::register(true); $twig

Confluence未授权模板注入/代码执行(CVE-2019-3396)

--- title: Confluence未授权模板注入/代码执行(CVE-2019-3396) tags: [poc,cve] num :g7y12 --- # 简介 --- Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息.文档协作.集体讨论,信息推送. # 影响范围 6.6.12版本之前所有版本 6.7.0-6.12.2版本 6.13.3之前的所有6.13.x版本 6.14.2之前的所有6

Word模板注入攻击

Word模板注入攻击 0x00 工具准备 phishery:https://github.com/ryhanson/phishery/releases office版本:office 2010 0x01 什么是Word模板注入攻击 Word模板注入攻击就是利用Word文档加载附加模板时的缺陷所发起的恶意请求而达到的攻击目的,所以当目标用户点开攻击者发给他的恶意word文档就可以通过向远程服务器发送恶意请求的方式,来盗取他的各类账号密码 0x02 通过远程模板注入盗取目标的各类普通账号密码 1.创

python SSTI tornado render模板注入

原理tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式.简单的理解例子如下:------------------------------------------------------------------------------------import tornado.ioloopimport tornado.web cla

如何动态地给vSphere虚拟机模板注入信息

在做vSphere自动化安装过程中,遇到这样一个需求:将vCenter Server做成模板,在给用户自动化装好vSphere后, 下载vCenter Server模板并启动虚拟机,然后将vCenter Server的IP返回给用户,用户即可使用vSphere集群. 可是vCenter Server的IP不是固定的,而是在自动化安装vSphere集群请求到来时由网络模块分配并发送过来的,因 此在做vCenter Server模板时是无法写入某个IP的.那如果在vCenter Server虚拟机启

Apache Solr Velocity模板注入RCE漏洞复现

一.Apache Solr介绍 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口,用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引,也可以通过http get操作提出查找请求,并得到XML格式的返回结果. 二.漏洞描述 Solr中存在VelocityResponseWriter组件,攻击者可以构造特定请求修改相关配置,使VelocityResponseWriter组件允许加载指定模板,进而导致Velocity模版注入远程命令

[WesternCTF2018]shrine

0x00 知识点 SSTI模板注入: 模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程 服务端把用户输入的内容渲染成模板就可能造成SSTI(Server-Side Template Injection) 0x01模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档.一些模板引擎:Smarty,Mako,Jinja2,Jade,Velocity,Freemake