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
但该链有一个坑:哈希碰撞