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