Weblogic漏洞Java反序列化CVE-2015-4852解析

weblogic系列_Java反序列化_CVE-2015-4852

1:概述

1.1:官方概述

1.2:漏洞概述

2:漏洞原理分析

2.1:基本概念

2.2:漏洞代码审计

2.2.1:反射漏洞利用

2.2.2:反序列化漏洞利用

3:漏洞修复

4 :参考链接

 

1:概述

1.1:官方概述

The WLS Security component in Oracle WebLogic Server 10.3.6.0, 12.1.2.0, 12.1.3.0, and 12.2.1.0 allows remote attackers to execute arbitrary commands via a crafted serialized Java object in T3 protocol traffic to TCP port 7001, related to oracle_common/modules/com.bea.core.apache.commons.collections.jar. NOTE: the scope of this CVE is limited to the WebLogic Server product.

1.2:漏洞概述

虽说是weblogic的漏洞但是该漏洞的原理是org.apache.commons.collections组件存在潜在的远程代码执行漏洞,应用的是java的反序列化部分机制的问题。在Java反序列化中,对于传入的序列化数据没有进行安全性检查,将恶意的TransformedMap序列化,可能会导致远程命令执行。

2:漏洞原理分析

2.1:基本概念

什么是commons-collections组件:Java commons-collections是JDK 1.2中的一个主要新增部分。它添加了许多强大的数据结构,可以加速大多数重要Java应用程序的开发。从那时起,它已经成为Java中公认的集合处理标准。
Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有力的数据结构类型并且实现了各种集合工具类。作为Apache开源项目的重要组件,Commons Collections被广泛应用于各种Java应用的开发。
Commons Collections API

2.2:漏洞代码审计

2.2.1:反射漏洞利用

1:这次我们这样去理解这个漏洞吧,我先找了一份网上的POC;大家请看
 

在这里插入图片描述


然后我们跟着这个POC的调用流程,去看看这个漏洞的具体利用吧;

1.1:首先我们看黄色部分:这里构造了一个Transformer数组,数组中第一个类是ConstantTransformer类对象
 

在这里插入图片描述


该对象的transform方法只是返回Runtime.class对应的“java.lang.Runtime”常量字符串内容;

然后黄色的第二部分是InvokerTransformer类对象
 

在这里插入图片描述


这个对象的transform方法可以看到下面的整个方法是通过java反射机制
来进行函数的invoke调用的。

1.2:接着我们去看蓝色部分的调用,ChainedTransformer类,该类将我们之前构造的Transformer对象连接起来
 

在这里插入图片描述


1.3:接着我们可以看到将实例化的ChainedTransformer对象,被decorate方法包装成TransformedMap类,这个TransformedMap类重写了readObject方法,可以进行反序列化的操作;
 

在这里插入图片描述


 

在这里插入图片描述


1.4:下来我们可以看到POC执行到红色部分,我们跟进setValue,发现里面先调用了一个checksetValue方法,然后我们继续跟进checksetValue
 

在这里插入图片描述


我们发现调用了TransformedMap的checksetValue方法,这个方法实际返回了ChainedTransformer的transfom的结果,就是直接调用之前构造的调用链((Runtime)Runtime.class.getMethod(“getRuntime”,null).invoke(null,null).exec(“calc”));
 

在这里插入图片描述


 

在这里插入图片描述

2.2.2:反序列化漏洞利用

序列化定义:序列化是把java对象转换成字节序列的过程;反序列化是把字节序列恢复为java对象的过程。

漏洞原理:如果java应用没有对传入的序列化数据进行安全性检查,我们可以将恶意的TransformedMap序列化后,远程提交给Java应用,如果java应用可以触发变换,就可以成功进行远程命令执行。

反序列化原理:反序列化会调用ObjectInputStream类的readObject()方法,如果被反序列化的类重写了readObject(),那么该类在进行反序列化时,java会优先调用重写的readObject()方法。

综述,结合上面Common Collection的特性,
1、如果某个可序列化的类重写了readObject()的方法,
2、并且在readObject()中对Map类型的变量进行了键值修改操作,并且这个Map变量时可控的,就可以实现攻击链的调用。
通过网上信息,AnnotationInvocationHandler类刚好实现了readObject()方法,这个类readObject()具体实现:
 

在这里插入图片描述


漏洞利用:实例化一个AnnotationInvocationHandler类,将其成员变量memberValues赋值为精心构造的恶意TransformedMap对象。然后将其序列化,提交给未做安全检测的Java应用。Java应用在进行反序列化操作时,则会触发TransformedMap的变换函数,执行预设的命令。readObject方法中的成员变量memberValue为Map<String,Object>
类型,并且调用memberValue.setValue()的操作,正好可以触发该漏洞。AnnotationInvocationHanler,在触发漏洞时会对type进行检查,所以在transformer的时候我们要将type设置为annotation类型。

利用过程:POC的执行过程为TransformedMap -> AnnotationInvocationHandler.readObject() -> setValue() -> checkValue() -> transform() 漏洞成功触发,具体的POC为
 

在这里插入图片描述


 

在这里插入图片描述

3:漏洞修复

1:ApacheCommons Collections组件修复:ApacheCommons Collections已经在3.2.2版本中做了修复,对这些不安全的Java类的序列化支持增加开关,默认为关闭状态,涉及的类包括CloneTransformer, ForClosure, InstantiateFactiory,InstantiateTransformer,InvokerTransformer,PrototypeCloneFactory,PrototypeSerialiZationFactory,WhileClosure。

看一下InvokerTransformer类是如何修改的,该类重写了序列化相关方法的writeObject()和readObject().在序列化和反序列化方法中增加了安全检查,判断当前系统是否允许不安全的序列化。
 

在这里插入图片描述


CheckUnsafeSerialization代码
 

在这里插入图片描述


2:weblogic修复补丁:CVE-2015-4852补丁主要应用在三个位置上,主要是进行黑名单绕过
 

在这里插入图片描述

4 :参考链接

传送门:WebLogic Java反序列化漏洞终极建议

链接一

链接二

链接三

链接四

转自:https://blog.csdn.net/simonnews/article/details/105765017