weblogic系列_Java反序列化_CVE-2015-4852
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 :参考链接
转自:https://blog.csdn.net/simonnews/article/details/105765017