WebLogic | CVE-2019-2725反序列化漏洞分析

栏目: Java · 发布时间: 5年前

内容简介:更多资讯和分析文章请关注银河安全实验室微信公众号(Galaxy-Lab)及网站(http://galaxylab.com.cn)近日,注意本文内容仅用于学习与研究,请勿非法利用。

更多资讯和分析文章请关注银河安全实验室微信公众号(Galaxy-Lab)及网站(http://galaxylab.com.cn)

近日, Oracle 公司发布了安全警报( Oracle Security Alert Advisory - CVE-2019-2725 ),修复了此前国家信息安全漏洞共享平台披露的 WebLogic 反序列化远程代码执行漏洞( CNVD-C-2019-48814 )。由于补丁发布已经有一段时间,我们将对该漏洞进行详细分析。

注意本文内容仅用于学习与研究,请勿非法利用。

漏洞介绍

---------------------------------------------------------

漏洞编号

CNVD-C-2019-48814

CVE-2019-2725

漏洞描述

漏洞位于 Weblogic 内置的“ wls9_async_response ”组件与“ wls-wsat ”组件。漏洞产生的根本原因是 CVE-2017-10271 的补丁可被绕过,导致允许攻击者构造恶意 SOAP 消息内容进行 XMLDecoder 反序列化。由于互联网上关于 CVE-2017-10271 漏洞的分析文章已经非常丰富,所以我们此次主要针对 wls9_async_response 组件进行漏洞分析。

影响范围

WebLogic Server 10.3.6.0.0

WebLogic Server 12.1.3.0.0

漏洞分析

----------------------------------------------------------

调用链

我们可以简单请求下接口使其产生空异常,因此通过报错信息来跟踪调用过程。所示函数的调用顺序从下到上:

WebLogic | CVE-2019-2725反序列化漏洞分析

过反复调试,重点关注的函数如下。所列函数的调用顺序从上到下:

weblogic.wsee.server.servlet.SoapProcessor.process()

weblogic.wsee.server.servlet.SoapProcessor.handlePost()

weblogic.wsee.ws.WsSkel.invoke()

weblogic.wsee.ws.dispatch.server.ServerDispatcher.dispatch()

weblogic.wsee.handler.HandlerIterator.handleRequest()

weblogic.wsee.addressing.ServerAddressingHandler.handleRequest()

weblogic.wsee.async.AsyncResponseHandler.handleRequest()

weblogic.wsee.ws.dispatch.server.OperationLookupHandler.handleRequest()

weblogic.wsee.workarea.WorkAreaServerHandler.handleRequest()

weblogic.workarea.WorkContextMapImpl.receiveRequest()

weblogic.workarea.WorkContextLocalMap.receiveRequest()

weblogic.workarea.spi.WorkContextEntryImpl.readEntry()

weblogic.wsee.workarea.WorkContextXmlInputAdapter.readUTF()

调用过程

1、 我们直接看到 SoapProcessorprocess 函数,判断请求为 POST 后将请求内容传入 handlePost 函数处理, handlePost 函数中获取 WsPort 等内容后传入关键函数 invoke()

WebLogic | CVE-2019-2725反序列化漏洞分析

2、invoke 函数中实例化 ServerDispatcher 对象后调用关键函数 dispatch()

WebLogic | CVE-2019-2725反序列化漏洞分析

3、dispatch 函数中从 WsPort 中获取 InternalHandlerList 进行 setHandlerChain 操作,后再调用 getHandlerChain.handleRequest():

WebLogic | CVE-2019-2725反序列化漏洞分析

4、getHandlerChain 函数返回对象为 HandlerIterator ,因此进入 HandlerIterator.handleRequest()handleRequest 函数根据 handlers 列表依次调用每个 handlerhandleRequest() 。但只要某个 handlerhandleRequest() 返回 false 则直接 return ,后面 handlerhandleRequest() 将不再被调用。

WebLogic | CVE-2019-2725反序列化漏洞分析

5、 我们可以看到迭代器中的 handlers 列表,共 21 个,其中需关键控制的有 4 个。控制的重点在于:执行到 WorkAreaServerHandler.handleRequest() 之前,前面任意 handlerhandleRequest() 均不返回 false

WebLogic | CVE-2019-2725反序列化漏洞分析

6、 首先 ServerAddressingHandler.handleRequest() 中,我们先重点关注这俩函数:

WebLogic | CVE-2019-2725反序列化漏洞分析

7、 其中 setWSAVersion() 中获取请求中 MessageActionHeader ,根据 ActionHeadernamespaceURI 的不同进行不同的处理,处理结果区别在于“ weblogic.wsee.addressing.version ”属性的值是否被设置。

WebLogic | CVE-2019-2725反序列化漏洞分析

8、 而接下来 validateWSAVersion 函数中判断“ weblogic.wsee.addressing.version ”属性若为空,则设置为 WSAVersion.WSA10

WebLogic | CVE-2019-2725反序列化漏洞分析

9、 那么“ weblogic.wsee.addressing.version ”属性的不同会有什么影响呢?回到 handleRequest() 往下看,主要影响 var24 的值,其中等于 WSAVersion.WSA10var24true

WebLogic | CVE-2019-2725反序列化漏洞分析

10、 继续往下看 handleRequest() ,判断 MsgHeader 中的 ActionHeader、RelatesToHeader 存在则对相应属性进行赋值。同时使 var23、var28 为true,而 var23、var28var24 直接影响是否抛出异常,抛出异常则函数无法往下进行,本次请求中断。

WebLogic | CVE-2019-2725反序列化漏洞分析

11、 下面来到 AsyncResponseHandlerhandleRequest() ,关键部分判断了 Messageweblogic.wsee.addressing.RelatesTo 属性值为空则返回 false 。一旦返回 false 后面的 handlerhandleRequest() 将不再被调用。该属性在上图中进行赋值。

WebLogic | CVE-2019-2725反序列化漏洞分析

12、 接着来到 OperationLookupHandlerhandleRequest() ,判断 Message 内容中是否存在 OperationName ,不存在则抛出异常,抛出异常则函数无法往下进行,本次请求中断。

WebLogic | CVE-2019-2725反序列化漏洞分析

13、 然后调用 WorkAreaServerHandlerhandleRequest() ,把 HeaderWorkAreaHeader 部分传入 WorkContextXmlInputAdapter()进行实例化 ,然后调用 receiveRequest 处理。

WebLogic | CVE-2019-2725反序列化漏洞分析

14、 最后执行到 WorkContextXmlInputAdapter.readUTF() 进行反序列化。

漏洞复现

根据上述分析内容尝试构造 Poc ,暂不考虑绕过补丁部分,如何能成功执行到 WorkAreaServerHandler 漏洞触发的关键。

我们先来认识 SOAP 消息的基本结构:

分析过程发现关键内容主要在 Header 部分,根据上述分析过程 7、8、9、10、11 处,我们知道 SOAP 消息的 Header 部分的 ActionHeader、RelatesToHeader 需存在,且 ActionHeader 中的 namespaceURI 需为“ http://www.w3.org/2005/08/addressing ”。

另外分析过程的 12 也说明了要求 SOAP 消息中需存在 operationName,operationNameAsyncResponseService.wsdl 中可查得,存在于 SOAP 消息的 HeaderBody 均可。

最后根据分析过程 13WorkAreaHeader 内容为反序列化部分。

因此 Poc 构造如下:

xxx

大致构造完成后,接下来就要考虑如何绕过 CVE-2017-10271 补丁的问题了。

首先看 CVE-2017-10271 补丁,限制了 object、new、method 元素以及 void、array 元素的属性:

WebLogic | CVE-2019-2725反序列化漏洞分析

但在“JavaBeans组件的长期持久性: XML 模式”文档中发现, class 元素可代替 object 元素来生成对象,且 class 元素未在补丁中限制。

WebLogic | CVE-2019-2725反序列化漏洞分析

由于 method 元素、 void 属性被限制,不能指定方法。但是我们可以尝试寻找可利用的构造函数,重点关注构造函数中存在可控的文件读写操作、存在使用可控内容进行反序化操作、存在可控的执命令的操作的类。

WebLogic10.3.6 中存在 UnitOfWorkChangeSet 类,其构造函数中使用传入的字节数组进行反序列化操作。

WebLogic | CVE-2019-2725反序列化漏洞分析

借助该类可成功触发 JAVA 反序列化远程命令执行漏洞。

WebLogic | CVE-2019-2725反序列化漏洞分析

Oracle 官方已在 2019426 日发布紧急补丁,补丁显示在黑名单中添加了 class 元素。

修复建议

1、 及时安装官方发布的紧急补丁。

2、 通过访问策略禁止对 /_async/*/wls-wsat/* 路径的访问。

3、 若明确不使用 wls9_async_response.war

wls-wsat.war

,建议删除并重启。

参考链接

https://www.oracle.com/technetwork/security-advisory/alert-cve-2019-2725-5466295.html

https://www.oracle.com/technetwork/java/persistence3-139471.html

http://www.cnvd.org.cn/webinfo/show/4999

平安银河实验室 提醒您 道路千万条,谨慎第一条;渗透不规范,亲人两行泪。


以上所述就是小编给大家介绍的《WebLogic | CVE-2019-2725反序列化漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

编写可读代码的艺术

编写可读代码的艺术

Boswell, D.、Foucher, T. / 尹哲、郑秀雯 / 机械工业出版社 / 2012-7-10 / 59.00元

细节决定成败,思路清晰、言简意赅的代码让程序员一目了然;而格式凌乱、拖沓冗长的代码让程序员一头雾水。除了可以正确运行以外,优秀的代码必须具备良好的可读性,编写的代码要使其他人能在最短的时间内理解才行。本书旨在强调代码对人的友好性和可读性。 本书关注编码的细节,总结了很多提高代码可读性的小技巧,看似都微不足道,但是对于整个软件系统的开发而言,它们与宏观的架构决策、设计思想、指导原则同样重要。编......一起来看看 《编写可读代码的艺术》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具