CC2
0x01 Preface
CC链提出时官方有两个Commons Collections版本
commons-collections:commons-collections
org.apache.commons:commons-collections4
两者的命名空间不冲突,可以共存在同⼀个项⽬中。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>之前的利用链CC1、CC3、CC6在commons-collections4均能正常使用,不过方法名可能稍有变动。
CC链实际上就是一条Serializable#readObject()到Transformer#transform()的调用链
0x02 PriorityQueue
CC2中用到的两个类:
java.util.PriorityQueueorg.apache.commons.collections4.comparators.TransformingComparator
PriorityQueue#readObject() => heapify() => siftDown() => siftDownUsingComparator() => comparator.compare() => transformer.transform()
heapifyint i = (size >>> 1) - 1得非负siftDownUsingComparatorhalf = size >>> 1得大于上面的i
PriorityQueue构造函数不会给size赋初值,需要用反射去赋值
0x03 Weave POC
0x04 Patch
org.apache.commons.collections4.comparators.TransformingComparator 在commons-collections4.0以前是版本没有实现 Serializable接口
官方发布的新版本4.1和3.2.2用于修复CC链 3.2.2中 增加了⼀个⽅法FunctorUtils#checkUnsafeSerialization ⽤于检测反序列化是否安全,其会检查常⻅的危险Transformer类,当我们反序列化包含这些对象时就会抛出异常。 若开发者没有设置全局配置 org.apache.commons.collections.enableUnsafeSerialization=true 即默认情况下会抛出异常
4.1中 这几个危险的Transformer类不再实现 Serializable 接口,直接不能序列化和反序列化
因此CC2只能在commons-collections4.0上跑通。
Last updated
Was this helpful?