JAVA反序列化链
稍微整理一下利用链的原理
CC1 commons-collections<3.2.2
sink都是几个transformer的链式调用
TransformedMap版本
入口点在sun.reflect.annotation.AnnotationInvocationHandler#readObject()
AbstractInputCheckedMapDecorator$MapEntry#setValue()
TransformedMap#checkSetValue()
接下来就是transformer链的transform方法了
LazyMap版本
LazyMap#get()调用的transformer链的transform方法
AnnotationInvocationHandler#invoke()调用了get()
AnnotationInvocationHandler#readObject()调用了this.memberValues.entrySet()
使this.memberValues为一个动态代理 InvocationHandler为AnnotationInvocationHandler即可触发invoke()
CC2 commons-collections4=4.0
PriorityQueue#readObject()
可以触发实现了Comparator接口的compare方法
cb链也是该原理
刚好cc4中有一个TransformingComparator类
compare方法调用了transform
CC3
transformer链中用InstantiateTransformer代替InvokerTransformer 好处就是可以使用TemplatesImpl加载任意字节码 而不仅仅是执行命令
CC4
仍然是InstantiateTransformer 替代cc2中的InvokerTransformer
CC5
BadAttributeValueExpException#readObject()调用任意toString()
TiedMapEntry类调用LazyMap#get()
CC6
HashMap#readObject()->TiedMapEntry#hashCode()->LazyMap#get()
用的最多的还是TiedMapEntry类触发的,审计多了回头来看反序列化链比之前硬看简单多了~
CB
PriorityQueue#readObject()
实现Comparator接口的类变成了BeanComparator
compare方法调用任意getter->TemplatesImpl#getOutputProperties()
BeanComparator类的构造方法用到了cc依赖里面里的类
找一个jdk自带的类且实现了Comparator接口的类就可以不依赖CC