首页 > 编程语言 >java反序列化漏洞原理

java反序列化漏洞原理

时间:2023-06-29 18:45:41浏览次数:53  
标签:java String 漏洞 IOException new byte 序列化 public

1.首先是序列化的过程

序列化:  ObjectOutputStream类 --> writeObject()

将对象进行序列化,把字节序列写到一个目标输出流中.ser

2.反序列化

反序列化: ObjectInputStream类 --> readObject()

从一个源输入流中读取字节序列,再把它们反序列化为一个对象

 

如果序列化字节序列内容可控,那么即可执行恶意类

参考代码:

这段diamante中exec本来是去序列化一个String类型对象,并存储序列化流文件,之后读取序列化流文件展示。

如果对象改变,变成一个恶意类evil,则反序列化,还原对象时则会还原成恶意类,而执行构造函数中的恶意代码

import java.io.*;

public class main {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        new main().exec();

    }

    public void exec() throws IOException, ClassNotFoundException {
        //String s="hello";
        evil s=new evil();
        byte[] ObjectBytes=serialize(s);
        File file = new File("test.ser");
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(ObjectBytes);
        File file2 = new File("test.ser");
        FileInputStream fis = new FileInputStream(file);
        byte[] byteArray = new byte[(int) file.length()];
        fis.read(byteArray);
        String s2=(String)deserialize(byteArray);
        System.out.println(s2);
    }

    private byte[] serialize(final Object obj) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream objOut = new ObjectOutputStream(out);
        objOut.writeObject(obj);
        return out.toByteArray();
    }

    private Object deserialize(final byte[] serialized) throws IOException, ClassNotFoundException {
        ByteArrayInputStream in = new ByteArrayInputStream(serialized);
        ObjectInputStream objIn = new ObjectInputStream(in);
        return objIn.readObject();
    }

}

  

import java.io.IOException;

public class evil {
    public evil() throws IOException {
        Runtime rt = Runtime.getRuntime();
        rt.exec("calc");
    }
}

  

标签:java,String,漏洞,IOException,new,byte,序列化,public
From: https://www.cnblogs.com/fczlm/p/17514959.html

相关文章

  • Java基础-Day06
    Java基础-Day06多维数组如何理解二维数组?数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则次数组称为二维数组二维数组的属性:int[][]arr3=newint[][]{{1,2,3,4},{4,5,6,7,8},{9,10}};Syste......
  • 亚马逊国际获得AMAZON商品详情API接口采集sku商品规格信息列表Java调用演示案例
    ​亚马逊商品详情API接口的作用是获取Lazada电商平台上的某一商品的详情信息,包括商品的名称、销售价格、库存数量、图片、商品描述、品牌、产地、售后保障等信息。开发者可以使用该API接口获取到商品的原始数据,进行分析、筛选等操作。通过该接口获取到的商品详情数据可以结合其......
  • C# 序列化大小写 序列化对象为大小写 JsonConvert.SerializeObject
    关于C#序列化Json对象框架:.Net插件:Newtonsoft.Json最近有人问我序列化对象还区分大小写?我当时心想我都是通过Bejson格式化然后转换为C#类然后直接复制。没有关心过序列化成什么大小写。因为这样的话可以保持一致。直到有人问我才自己研究了一下。如下:usingNewtonsoft.......
  • Java连接MQ集群
    Java代码创建仲裁队列点击查看代码@BeanpublicQueuequorumQueue(){returnQueueBuilder.durable("cluster.quorum.queue").quorum().build();}......
  • Java获取数据库的列名、列数、标题、类型等信息, ResultSetMetaData
    importjava.sql.*;publicclassjdbcTest{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{//1、加载驱动Class.forName("com.mysql.jdbc.Driver");//2、用户信息和urlStringurl="......
  • 如何获得 java项目下面所有的文件名
     要获取Java项目中所有的文件名,可以通过以下步骤实现:使用递归遍历获取项目中所有的文件://获得所有的文件名publicclassgetfilename{//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args){List<String>fileNames=newArrayList<>(......
  • 如何获得 java项目下面所有的文件名
     要获取Java项目中所有的文件名,可以通过以下步骤实现:使用递归遍历获取项目中所有的文件://获得所有的文件名publicclassgetfilename{//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args){List<String>fileNames=newArrayList<>(......
  • 利用JAVA的AOP运行时注解实现请求VO的复杂组装
    背景上一篇介绍了关于JAVA的AOP编译时注解的开发经验,因此,这里则接着来讲讲AOP运行时注解,摘取的是利用运行时注解实现微服务对请求对象(VO)中的指定字段特殊处理的统一封装,典型场景就是SpringCloudGateway对用户请求经过鉴权、过滤、路由等处理之后,将必要信息添加到消息头中,转发到相......
  • 如何获得 java项目下面所有的文件名
    ​ 要获取Java项目中所有的文件名,可以通过以下步骤实现:使用递归遍历获取项目中所有的文件://获得所有的文件名publicclassgetfilename{//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args){List<String>fileNames=newA......
  • 【后端面经-Java】公平锁和加锁流程
    目录1.公平锁和非公平锁1.1基本概念1.2ReentrantLock的公平锁和非公平锁2.加锁流程2.1ReentrantLock和AQS的关系2.2公平锁-加锁流程2.3非公平锁-加锁流程2.4加锁流程和性能的关系3.面试问题模拟参考文献1.公平锁和非公平锁1.1基本概念公平锁:线程按照到来的先后......