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,而TransformingComparator的compare方法会调用对象的transform方法
于是通过InvokerTransformer类的transform方法调用TemplatesImpl.newTransformer方法导致RCE
谈谈CC3(★★★)
该链用到TemplatesImpl类,生成恶意的字节码实例化
仍然是基于动态代理和LazyMap.get触发InstantiateTransformer的transform方法导致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
但该链有一个坑:哈希碰撞
