内容简介:更多资讯和分析文章请关注银河安全实验室微信公众号(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.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、 我们直接看到 SoapProcessor 的 process 函数,判断请求为 POST 后将请求内容传入 handlePost 函数处理, handlePost 函数中获取 WsPort 等内容后传入关键函数 invoke() :
2、invoke 函数中实例化 ServerDispatcher 对象后调用关键函数 dispatch() :
3、dispatch 函数中从 WsPort 中获取 InternalHandlerList 进行 setHandlerChain 操作,后再调用 getHandlerChain.handleRequest():
4、getHandlerChain 函数返回对象为 HandlerIterator ,因此进入 HandlerIterator.handleRequest() 。 handleRequest 函数根据 handlers 列表依次调用每个 handler 的 handleRequest() 。但只要某个 handler 的 handleRequest() 返回 false 则直接 return ,后面 handler 的 handleRequest() 将不再被调用。
5、 我们可以看到迭代器中的 handlers 列表,共 21 个,其中需关键控制的有 4 个。控制的重点在于:执行到 WorkAreaServerHandler.handleRequest() 之前,前面任意 handler 的 handleRequest() 均不返回 false 。
6、 首先 ServerAddressingHandler.handleRequest() 中,我们先重点关注这俩函数:
7、 其中 setWSAVersion() 中获取请求中 Message 的 ActionHeader ,根据 ActionHeader 中 namespaceURI 的不同进行不同的处理,处理结果区别在于“ weblogic.wsee.addressing.version ”属性的值是否被设置。
8、 而接下来 validateWSAVersion 函数中判断“ weblogic.wsee.addressing.version ”属性若为空,则设置为 WSAVersion.WSA10 。
9、 那么“ weblogic.wsee.addressing.version ”属性的不同会有什么影响呢?回到 handleRequest() 往下看,主要影响 var24 的值,其中等于 WSAVersion.WSA10 时 var24 为 true 。
10、 继续往下看 handleRequest() ,判断 MsgHeader 中的 ActionHeader、RelatesToHeader 存在则对相应属性进行赋值。同时使 var23、var28 为true,而 var23、var28 跟 var24 直接影响是否抛出异常,抛出异常则函数无法往下进行,本次请求中断。
11、 下面来到 AsyncResponseHandler 的 handleRequest() ,关键部分判断了 Message 的 weblogic.wsee.addressing.RelatesTo 属性值为空则返回 false 。一旦返回 false 后面的 handler 的 handleRequest() 将不再被调用。该属性在上图中进行赋值。
12、 接着来到 OperationLookupHandler 的 handleRequest() ,判断 Message 内容中是否存在 OperationName ,不存在则抛出异常,抛出异常则函数无法往下进行,本次请求中断。
13、 然后调用 WorkAreaServerHandler 的 handleRequest() ,把 Header 的 WorkAreaHeader 部分传入 WorkContextXmlInputAdapter()进行实例化 ,然后调用 receiveRequest 处理。
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,operationName 在 AsyncResponseService.wsdl 中可查得,存在于 SOAP 消息的 Header 或 Body 均可。
最后根据分析过程 13 知 WorkAreaHeader 内容为反序列化部分。
因此 Poc 构造如下:
xxx
大致构造完成后,接下来就要考虑如何绕过 CVE-2017-10271 补丁的问题了。
首先看 CVE-2017-10271 补丁,限制了 object、new、method 元素以及 void、array 元素的属性:
但在“JavaBeans组件的长期持久性: XML 模式”文档中发现, class 元素可代替 object 元素来生成对象,且 class 元素未在补丁中限制。
由于 method 元素、 void 属性被限制,不能指定方法。但是我们可以尝试寻找可利用的构造函数,重点关注构造函数中存在可控的文件读写操作、存在使用可控内容进行反序化操作、存在可控的执命令的操作的类。
如 WebLogic10.3.6 中存在 UnitOfWorkChangeSet 类,其构造函数中使用传入的字节数组进行反序列化操作。
借助该类可成功触发 JAVA 反序列化远程命令执行漏洞。
Oracle 官方已在 2019 年 4 月 26 日发布紧急补丁,补丁显示在黑名单中添加了 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反序列化漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析
- Liferay portal java反序列化漏洞分析
- Apache Commons Fileupload 反序列化漏洞分析
- 一处反序列化任意文件写入的漏洞分析
- CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析
- Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编写可读代码的艺术
Boswell, D.、Foucher, T. / 尹哲、郑秀雯 / 机械工业出版社 / 2012-7-10 / 59.00元
细节决定成败,思路清晰、言简意赅的代码让程序员一目了然;而格式凌乱、拖沓冗长的代码让程序员一头雾水。除了可以正确运行以外,优秀的代码必须具备良好的可读性,编写的代码要使其他人能在最短的时间内理解才行。本书旨在强调代码对人的友好性和可读性。 本书关注编码的细节,总结了很多提高代码可读性的小技巧,看似都微不足道,但是对于整个软件系统的开发而言,它们与宏观的架构决策、设计思想、指导原则同样重要。编......一起来看看 《编写可读代码的艺术》 这本书的介绍吧!