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/