Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

栏目: IT技术 · 发布时间: 4年前

内容简介:这个利用链看着很简单,实际上很难挖,值得好好研究和学习。Oracle官方在1月补丁中修复了CVE-2020-2555漏洞,该漏洞位于

这个利用链看着很简单,实际上很难挖,值得好好研究和学习。

0x01 漏洞概述

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

Oracle官方在1月补丁中修复了CVE-2020-2555漏洞,该漏洞位于 Oracle Coherence 组件中。该组件是业内领先的用于解决集群应用程序数据的缓存的解决方案,其默认集成在Weblogic12c及以上版本中。

该漏洞提出了一条新的反序列化gadget,未经身份验证的攻击者通过精心构造的T3请求触发可以反序列化gadget,最终造成远程命令执行的效果。

0x02 漏洞分析

ZDI已经给出了一部分的 分析 ,根据ZDI发出的diff图,不难看出补丁是将 extract 的利用全部移除了,具体的代码可以在 com.tangosol.util.filter.LimitFilter#toString 中找到:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

所以只要跟踪 extract() 的执行流,就能理解漏洞产生的原理。其实总体来说该漏洞应该分为两部分来分析:

  • 反射调用链
  • 反序列化触发点

2.1 反射调用链

首先先来具体看一下 com.tangosol.util.filter.LimitFilter#toString 的逻辑:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

红线所标注的就是漏洞触发的关键点,这里的 m_comparatorm_oAnchorTopm_oAnchorBottom 是我们能通过 LimitFilter 的构造函数进行构造的。当 m_comparator 是继承于 ValueExtractor 接口的类时,会尝试调用 m_comparator.extract() 方法,并将结果放入StringBuffer中。

我们接着来看一下 ValueExtractor 的实现类:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

其中 ReflectionExtractorChainedExtractor 值得我们关注。通过名字不难想到这两个类一个是用于完成反射相关操作的,一个是用于执行链式操作的。

ReflectionExtractor#extract 中,可以很明显的看到存在反射调用的流程:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

简单来说就是获取 oTargetMethod ,并反射调用该对象的具体方法。具体方法由 this.getMethodName() 来控制:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555) Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

同样,这个值也是可以通过 ReflectionExtractor 的构造函数来去指定的。现在我们可以指定任意一个方法通过反射调用该方法。但是想要执行代码的话并不是单次反射就能完成的,我们还需要找到一个方法将多条反射调用串起来(就如CommonCollections的利用链相同)。 ChainedExtractor 就完成了这个工作:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

这里的 ValueExtractor 数组是通过 this.getExtractors() 获得的,同样也可以通过 ChainedExtractor 构造函数进行指定:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555) Oracle Coherence 反序列化漏洞分析(CVE-2020-2555) Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

也就是说现在我们只需要构造多条 ReflectionExtractor ,将其置于 ValueExtractor 数组中,就可以触发链式反射调用流程。这一点和CommonCollections的利用链也非常像,最终的执行流可以大致简化为:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

2.2 反序列化触发点

上面我们分析了具体的反射调用流程,这一切都是建立在 LimitFilter#toString 触发时所发生的,为了利用反射调用流程,我们还需要找到一个能够在反序列化时触发 toString 方法的触发点。ZDI这篇文章中说到了一个触发点—— BadAttributeValueExpException#readObject

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

所以只需要设置 BadAttributeValueExpException 的成员变量 valLimitFilter 就可以完成触发。

0x03 漏洞利用

通过上面的分析,我们来梳理一下整体的构造流程:

  1. 构造能串联起来完成命令执行的多条 ReflectionExtractor 反射调用
  2. 利用 ChainedExtractor 将多条 ReflectionExtractor 串联起来
  3. ChainedExtractor 设置为 LimitFilter 的成员变量 m_comparator 的值
  4. 为了完成链式反射调用链,将 LimitFilter 的成员变量 m_oAnchorTop 设置为相应的值(如 Runtime.class
  5. 将构造完成的 LimitFilter 设置为 BadAttributeValueExpException 的成员变量 val 的值
  6. 序列化 BadAttributeValueExpException
  7. 构造包含序列化数据的T3请求,发送请求完成攻击

攻击效果:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

0x04 其他利用方式

抛砖引玉的说一个其他的利用方式。由于我并不是非常喜欢这样串联利用链的方式(因为不好理解),所以简单的看了下其他的Extractor,看看有没有更加简单的利用方式。这里找到另外一个非常好理解的利用方式。前面的流程都是一样的,唯一不同的是可以不利用 ReflectionExtractorChainedExtractor 这样的组合,同样能完成命令执行。

漏洞产生的原因也从链式反射调用改为表达式注入。相信一说到表达式注入各位就已经知道是用的什么链了,这里就不再过多赘述,就放一张利用效果图:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ajax修炼之道

Ajax修炼之道

(美)哥特兰、高伯瑞斯、艾米亚 / 徐锋,胡冰 / 电子工业出版社 / 2006-4 / 29.8

Ajax将静态Web页面转变为充满交互的应用。现在您不需要牺牲Web应用程序部署的简单性,就可以将“胖”客户端应用程序部署到客户端。不过对于很多人业说,Ajax看起来很难。这就是我们撰写本书的原因。作为实践的指导,本书揭开了Ajax神秘的面纱,教您如何以简单的方式使用Ajax。本书内容覆盖了DHTML、Javascript和闻名已久的XmlHttp Request回调技术的基础知识。您将了解如何将......一起来看看 《Ajax修炼之道》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试