2021-03-10-SSTI模板注入


layout: post
title: “SSTI模板注入”
categories: [网络安全CyberSecurity]
tags: [SSTI]


模板注入SSTI简介

何为模板引擎(SST)

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

从网上找了个小例子帮助我们更好的理解SST的作用,大波code来袭:

tpl.func.php

    '',
        '{else}'               =>    '',
        '{else if %%}'         =>    '',
        '{elseif %%}'          =>    '',
        '{/if}'                =>    '',
        '{$%%}'                =>    '',
        '{foreach %%} '        =>    '',
        '{/foreach}'           =>    '',
        '{for %%}'             =>    '',
        '{/for}'               =>    '',
        '{while %%}'           =>    '',
        '{/while}'             =>    '',
        '{continue}'           =>    '',
        '{break}'              =>    '',
        '{$%% = $%%}'          =>    '',
        '{$%%++}'              =>    '',
        '{$%%--}'              =>    '',
        '{comment}'            =>    '    '*/?>',
        '{/*}'                 =>    '    '*?>',
        '{section}'            =>    '    '?>',
        '{include %%}'         =>    '',
        ];
    
        $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 '';
    }

config.php

moban.html

    
    
    {$title}
    
    
        {$content}
    

2021-03-10-SSTI模板注入_第1张图片

为什么要模板引擎

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

为什么SST是危险的?

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

实例演示

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

2021-03-10-SSTI模板注入_第2张图片

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

2021-03-10-SSTI模板注入_第3张图片

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

2021-03-10-SSTI模板注入_第4张图片

显示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 %}

2021-03-10-SSTI模板注入_第5张图片

也可以用工具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

你可能感兴趣的:(网络安全,ctf,web安全)