演示案例-Java 攻防-Gadget-CC2&CC4&CC5&CC7
复现配置:pom.xml 添加依赖 commons-collections 版本。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
1、CC2
cc2 中不通过实例化 TrAXFilter 进行类加载,而用 InvokerTransformer。调用流程为:PriorityQueue#readObject -> PriorityQueue#heapify -> PriorityQueue#siftDown -> PriorityQueue#siftDownUsingComparator -> comparator#compare -> TransformingComparator#compare -> InvokerTransformer#transform -> TemplatesImpl#newTransformer -> TemplatesImpl::getTransletInstance -> TemplatesImpl::defineTransletClasses -> TransletClassLoader::defineClass。
[图片:CC2 链调用流程]
这里 CC2 链跟 CC1 链不一样的是 CC1 链传递过来的值经过以上两个 ChainedTransformer#transform()、ConstantTransformer#transform() 才传到这个 InvokerTransformer#transform() 上,如果没有经过上面两个地方,是不会触发 RCE 的。CC2 链没有 ChainedTransformer#transform()、ConstantTransformer#transform() 这两个,所以需要换个对象。
[图片:CC2 链对象对比]
2、CC4
CC4 可以看成是对 CC2 的改造,用 InstantiateTransformer 来替代 InvokerTransformer。调用流程为:PriorityQueue::readObject -> PriorityQueue#heapify -> PriorityQueue#siftDown -> PriorityQueue#siftDownUsingComparator -> TransformingComparator::compare -> ChainedTransformer::transform -> ConstantTransformer::transform -> InstantiateTransformer::transform -> TrAXFilter::带参构造 -> TemplatesImpl::newTransformer -> TemplatesImpl::getTransletInstance -> TemplatesImpl::defineTransletClasses -> TransletClassLoader::defineClass。
[图片:CC4 链调用流程]
3、CC5
基本和 CC1 一致,入口点换成 BadAttributeValueExpException。 Gadget chain: BadAttributeValueExpException.readObject() -> TiedMapEntry.toString() -> LazyMap.get() -> ChainedTransformer.transform() -> ConstantTransformer.transform() -> InvokerTransformer.transform()
[图片:CC5 链调用流程]
4、CC7
基本和 CC1 一致,入口点换成 Hashtable。 Gadget chain: Hashtable.readObject -> Hashtable.reconstitutionPut -> AbstractMapDecorator.equals -> AbstractMap.equals -> LazyMap.get -> ChainedTransformer.transform -> ConstantTransformer::transform -> InvokerTransformer.transform


