首页
社区
课程
招聘
[原创]CC1利用链分析
发表于: 2024-8-30 15:45 4395

[原创]CC1利用链分析

2024-8-30 15:45
4395

CC是“Commons Collections”的缩写,是 Apache Commons Collections 库的一部分。

jdk8u65


maven依赖:


全类名:org.apache.commons.collections.Transformer,是 Apache Commons Collections 库中的一个接口,它定义了如何将一个输入对象转换为另一个输出对象,接口中只声明了一个方法:public Object transform(Object input);

在CC1利用链中需要用到的Transformer实现类有如下几个:

作用:输入一个对象,通过反射调用对象中的方法并返回。

示例:

在调用transform方法时传入一个Runtime对象,InvokerTransformer会通过反射调用exec方法,来看看它的transform实现:

它的作用是不管你输入什么,它只给你输出一个由构造器传入的对象:

链式转换器,可以链式调用多个Transformer,构造器参数是一个Transformer数组,由上一个Transformer的输出作为下一个Transformer的输入。

示例:

new一个ChainedTransformer,同时传入一个Transformer数组,第一个元素是ConstantTransformer,输出一个Runtime对象,第二个元素是InvokerTransformer,反射调用Runtime的exec方法。

其transform实现:

org.apache.commons.collections.map.TransformedMap可以对原生Map类型对象做增强,采用了装饰者设计模式,用法如下:

使用原生map时,会原样put键值:

使用transformedMap时,会将key转为小写,value×2

debug看其源码实现,调用put方法时,会先调用transformKey,

然后又调用keyTransformer的transform方法:

继而调用到我们自定义的keyTransformer:

接下来调用transformValue,再调用valueTransformer.transform:

继而调用到自定义的valueTransformer:


还有一种触发valueTransformer的方式是通过entry调用setValue方法:

跟进去这里调用了parent.checkSetValue,parent就是transformedMap:

再步入到checkSetValue中,可见调用了valueTransformer.transform:

cc1链最终就是通过调用ChainedTransformer的transform方法触发RCE,那我们就寻找哪里调用了它,在方法名上按ALT + F7,



这里有上文分析的TransformedMap.checkSetValue方法,点进去:

再按ctrl点击checkSetValue,跳转到AbstractInputCheckedMapDecorator.MapEntry的setValue方法里,


再按ALT + F7,寻找调用setValue的地方:

虽然结果有很多,但是我们要构造的是反序列化利用链,自然要关注readObject方法里的调用,就是这里点进去。



此时来到了AnnotationInvocationHandler类的readObject方法中,这里的memberValue对象调用了setValue方法,而memberValue是memberValues的entrySet中的元素。memberValues是通过构造器传入的,同时传入的还有type:

要想执行到memberValue.setValue,需要满足外层两个条件:

memberType 不等于 null

value不是memberType类的实例

为了理解这段代码,我们需要调试一下,先准备一段测试代码:

上面代码先序列化了一个AnnotationInvocationHandler,然后再反序列化触发readObject方法调用,在readObject方法里打个断点:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-8-30 19:36 被米龙·0xFFFE编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//