CC

谈下CC链中三个重要的Transformer(★★★)

ConstantTransformer类的transform方法直接返回传入的类对象

ChainedTransformer类中的transform方法会链式调用其中的其他Transformer.transform方法

InvokerTransformer类根据传入参数可以反射调用对应的方法

InstantiateTransformer类可以直接实例化对象

谈谈CC1(★★★)

原理是LazyMap.get可以触发构造的Transformer链的transform方法导致RCE

基于动态代理触发的LazyMap.get,在AnnotationInvocationHanlder中的invoke方法中存在Map.get操作

谈谈CC2(★★★)

该链用到TemplatesImpl类,生成恶意的字节码实例化

不过触发点是PriorityQueue类,反射设置属性TransformingComparator

PriorityQueue类是优先队列,其中包含了排序功能,该功能可以设置比较器comparator,而TransformingComparatorcompare方法会调用对象的transform方法

于是通过InvokerTransformer类的transform方法调用TemplatesImpl.newTransformer方法导致RCE

谈谈CC3(★★★)

该链用到TemplatesImpl类,生成恶意的字节码实例化

仍然是基于动态代理和LazyMap.get触发InstantiateTransformertransform方法导致RCE

谈谈CC4(★★★)

和CC2链一致,不过触发时候不是InvokerTransformer而是InstantiateTransformer类直接实例化TrAXFilter子类执行<init>/<clinit>导致RCE

谈谈CC5(★★★)

还是基于LazyMap.get触发的,不过没有动态代理,是通过BadAttributeValueExpException.readObject()调用TiedMapEntry.toString()

TiedMapEntry.getValue()中存在Map.get导致LazyMap.get触发transform

谈谈CC6(★★★)

还是基于LazyMap.get触发的,通过HashMap.readObject()到达HashMap.hash()方法,由于key是TiedMapEntry所以调用TiedMapEntry.hashCode()

hashCode方法会调用到TiedMapEntry.getValue()方法,由于Map.get导致LazyMap.get触发transform

谈谈CC7(★★★)

还是基于LazyMap.get触发的,通过Hashtable.readObject()触发了key的equals方法,跟入AbstractMap.equals方法

其中包含了Map.get导致LazyMap.get触发transform

但该链有一个坑:哈希碰撞