zoukankan      html  css  js  c++  java
  • 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 常见模板引擎

    参考
  • 相关阅读:
    noi.openjudge——2971 抓住那头牛
    P1265 公路修建 洛谷
    P2330 [SCOI2005] 繁忙的都市 洛谷
    P1331 海战 洛谷
    P1464 Function 洛谷
    基于Manhattan最小生成树的莫队算法
    zoj3659
    poj1182
    hdu1325
    hdu3635
  • 原文地址:https://www.cnblogs.com/Wuser/p/13463180.html
Copyright © 2011-2022 走看看