ma4ter

Index | Photo | About | Friends | Archives

JAVA反序列化链

稍微整理一下利用链的原理

CC1 commons-collections<3.2.2

sink都是几个transformer的链式调用

TransformedMap版本

入口点在sun.reflect.annotation.AnnotationInvocationHandler#readObject()
JAVA反序列化链
AbstractInputCheckedMapDecorator$MapEntry#setValue()
JAVA反序列化链
TransformedMap#checkSetValue()
JAVA反序列化链
接下来就是transformer链的transform方法了

LazyMap版本

JAVA反序列化链
LazyMap#get()调用的transformer链的transform方法
JAVA反序列化链
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类
JAVA反序列化链
compare方法调用了transform

CC3

transformer链中用InstantiateTransformer代替InvokerTransformer 好处就是可以使用TemplatesImpl加载任意字节码 而不仅仅是执行命令

CC4

仍然是InstantiateTransformer 替代cc2中的InvokerTransformer

CC5

BadAttributeValueExpException#readObject()调用任意toString()
JAVA反序列化链
TiedMapEntry类调用LazyMap#get()

CC6

HashMap#readObject()->TiedMapEntry#hashCode()->LazyMap#get()

用的最多的还是TiedMapEntry类触发的,审计多了回头来看反序列化链比之前硬看简单多了~

CB

PriorityQueue#readObject()
JAVA反序列化链
实现Comparator接口的类变成了BeanComparator
compare方法调用任意getter->TemplatesImpl#getOutputProperties()
BeanComparator类的构造方法用到了cc依赖里面里的类
JAVA反序列化链
JAVA反序列化链
找一个jdk自带的类且实现了Comparator接口的类就可以不依赖CC
JAVA反序列化链