Transformer
(★★★)ConstantTransformer
类的transform
方法直接返回传入的类对象
ChainedTransformer
类中的transform
方法会链式调用其中的其他Transformer.transform
方法
InvokerTransformer
类根据传入参数可以反射调用对应的方法
InstantiateTransformer
类可以直接实例化对象
原理是LazyMap.get
可以触发构造的Transformer
链的transform
方法导致RCE
基于动态代理触发的LazyMap.get
,在AnnotationInvocationHanlder
中的invoke
方法中存在Map.get
操作
该链用到TemplatesImpl
类,生成恶意的字节码实例化
不过触发点是PriorityQueue
类,反射设置属性TransformingComparator
PriorityQueue
类是优先队列,其中包含了排序功能,该功能可以设置比较器comparator
,而TransformingComparator
的compare
方法会调用对象的transform
方法
于是通过InvokerTransformer
类的transform
方法调用TemplatesImpl.newTransformer
方法导致RCE
该链用到TemplatesImpl
类,生成恶意的字节码实例化
仍然是基于动态代理和LazyMap.get
触发InstantiateTransformer
的transform
方法导致RCE
和CC2链一致,不过触发时候不是InvokerTransformer
而是InstantiateTransformer
类直接实例化TrAXFilter
子类执行<init>/<clinit>
导致RCE
还是基于LazyMap.get
触发的,不过没有动态代理,是通过BadAttributeValueExpException.readObject()
调用TiedMapEntry.toString()
在TiedMapEntry.getValue()
中存在Map.get
导致LazyMap.get
触发transform
还是基于LazyMap.get
触发的,通过HashMap.readObject()
到达HashMap.hash()
方法,由于key是TiedMapEntry
所以调用TiedMapEntry.hashCode()
而hashCode
方法会调用到TiedMapEntry.getValue()
方法,由于Map.get
导致LazyMap.get
触发transform
还是基于LazyMap.get
触发的,通过Hashtable.readObject()
触发了key的equals
方法,跟入AbstractMap.equals
方法
其中包含了Map.get
导致LazyMap.get
触发transform
但该链有一个坑:哈希碰撞