Java反序列化漏洞Apache CommonsCollections分析

本文深入分析了Java反序列化漏洞中Apache CommonsCollections库的使用,特别是TransformedMap链。通过Transformer接口、ConstantTransformer、InvokerTransformer、ChainedTransformer等类的解析,揭示了如何构造反射链来执行任意命令。最后,讨论了如何利用AnnotationInvocationHandler在特定条件下触发TransformedMap的checkSetValue方法,从而执行恶意代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java反序列化漏洞Apache CommonsCollections分析

cc链,既为Commons-Collections利用链。此篇文章为cc链的第一条链CC1。而CC1目前用的比较多的有两条链,LazyMap和TransformedMap。在ysoserial工具中,利用的是LazyMap链,而我们此篇分析的则是TransformedMap链。

1.本文所需前置知识

java反序列化基础

java反射基础

文章参考:https://github.com/Maskhe/javasec/blob/master/3. apache commons-collections中的反序列化.md

2.实验环境

JDK1.7.0_80

commons-collections-3.2.1

3.分析

3.1 Transformer接口

打开org.apache.commons.collections.Transformer类,可以看到源码中对该类的解释是从一个对象变为另一个对象(Transforms the input object (leaving it unchanged) into some output object.),如下图所示:

image-20210512103708407

下面我们使用一个例子来解释这个类的作用:

image-20210512110816960

当输入Runtime.class时输出了类的类型

image-20210512110924563

我们要进行对象的转变时候,对应的操作应该在transform方法中。

Ctrl+H 查找实现了Transformer接口的类,重点关注以下几个类ConstantTransformer,invokerTransformer,ChainedTransformer。我们通过分析这几个类来构造payload。

3.2 ConstantTransformer

该类使用了Transformer的接口,重写了transformer的方法

image-20210512112137502

transformer返回了iConstant变量,而这个变量在ConstantTransformer方法中被赋值。我们使用这个方法看下作用。

image-20210512113216183

在return iConstant;处设置断点,运行程序查看返回值,发现这里返回的是Runtime.class

image-20210512141826906

3.3 InvokerTransformer

查看源码说是通过反射创建一个新的对象(Transformer implementation that creates a new object instance by reflection.)

来到InvokerTransformer的transform方法:

image-20210512142854359

可以明显看到这里使用了反射的方式来调用对象的方法,还有有几个变量iMethodName,iParamTypes,iArgs

这几个变量是通过public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args)这个构造函数传入。

image-20210512143121411

利用构造函数传入值,调用transform方法

查看InvokerTransformer源码找到

iParamTypes为Class[]集合

iArgs为Obeject[]集合

image-20210512204221239

再查看getMethod源码得知getMethod要传入二个参数,类型为String,Class[]

image-20210512204352368

同理invoke也要传入两个参数Object,Object[]

image-20210625203236670

构造出方法并执行:

image-20210512205207876

可以看到这里反射出了Runtime.getRuntime()的方法,而我们要构造出Runtime.getRuntime().exec();怎么办呢,这里再介绍一个类ChainedTransformer

3.4 ChainedTransformer

查看源码transf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值