首页 > 编程语言 >java反序列化与反序列化

java反序列化与反序列化

时间:2023-06-27 23:14:48浏览次数:39  
标签:java 方法 Person 序列化 重写 public

java反序列化漏洞

JAVA反序列化漏洞是由于开发者重写了readObject方法,该readObject方法方法调用了别的方法,最终执行到了例如Transfrom方法的危险方法

java序列化过程:

调用一个函数进行序列化,存放到一个文件内,再将文件反序列化回来,涉及到文件的读写

序列化与反序列化

序列化:
ObjectOutputStream --> writeObject ()

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

java内进行序列化反序列化,需要先和序列化反序列化存在继承关系才可以使用方法

涉及到方法的重写,子类继承父类的方法,子类需要方法更加精细,需要扩展一些功能,重写这个方法使其更加适合自己,当重写父类某个方法后,调用子类的方法

假设开发者在java反序列化的代码内加入了一行调用计算器的代码,代指那些被重写以后的反序列化方法里存在的危险代码

image

Person

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Person implements Serializable {
public int age;
public String name;

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        Runtime.getRuntime().exec("calc");
        // 默认的反序列化操作
        in.defaultReadObject();
    }
}

test

import java.io.*;

public class Test {	
    public static void main(String[] args) throws IOException, ClassNotFoundException {
    Person p=new Person();//获取一个Person对象,赋两个值给person对象
    p.age=18;
    p.name="xiu";
		//调用serialize函数,对象p为刚创建的Person对象,路径没有绝对路径,没有相应的文件,会在当前路径创建一个文件,把对象序列化存入
        serialize(p,"xiu.bin");

		//输出
        System.out.println("反序列化结果:" + deserialize("xiu.bin"));
    }
		//serialize接收两个参数,一个对象,一个文件路径,把序列化后的obj对象,存储到filePath指定的文件路径里
    public static void serialize(Object obj, String filePath) throws IOException {
        try (FileOutputStream fileOut = new FileOutputStream(filePath);
             ObjectOutputStream objectOut = new ObjectOutputStream(fileOut)) {
            objectOut.writeObject(obj);
        }
    }
  //给deserialize一个文件路径,该函数会把这个文件内的内容反序列化回对象
     public static Object deserialize(String filePath) throws IOException, ClassNotFoundException {
        try (FileInputStream fileIn = new FileInputStream(filePath);
             ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {
            return objectIn.readObject();
        }
    }
}

先把Person内的重写反序列化注释掉,使用系统的原生反序列化操作

image

执行后的结果如下,创建了一个xiu.bin文件,输出了反序列化的结果

image

查看xiu.bin里序列化的内容

image

取消掉注释后执行Test文件计算器调用,意味着危险代码被执行

image

重写了某个readObject方法,实现链式调用,导致java的反序列化

标签:java,方法,Person,序列化,重写,public
From: https://www.cnblogs.com/2210z/p/17510134.html

相关文章

  • 【Java】讲讲StreamAPI
     预设场景:从Mybatis调用Mapper得到的用户集合List<UserDTO>userList=newArrayList<>(); 常用的几种API用法示例:Map方法,转换为某一个字段的集合:List<Integer>userIdList=userList.stream()/*map转换成某个类型来处理,比如这个场景是为了快速......
  • JavaBlog-3
    前言第三次也是最后博客文章主要是关于java课程第三阶段关于PTA题目集、超星作业以及在实验平台上布置的一些题型。相较于第一、二阶段的作业总结而言此次作业更加针对于总结在面向对象过程中的三大技术特性,即封装性、继承性和多态性,类图的设计更加普遍。在不断深入学习Java......
  • JavaScript 中模块的导入和导出
    模块简介html文档一般在标签中引入外部js文件<script>标签引入的脚本中创建的变量,都会被注册为window对象下全局变量,这样做会污染全局命名空间这就衍生除了模块化的解决方案,比如CommonJS等,但是这些解决方案都不是JavaScript原生的,直到ES6支持JavaScript模块的使用。......
  • Java学习——IDEA编辑器 导出项目对应Java Doc文件
    IDEA生成JavaDoc帮助文档方法一:使用命令行生成1.选中项目右键showinExplor。。2.选中地址栏cmd3.输入命令javadoc-encodingUTF-8-charsetUTF-8Doc.java4.在项目地址中查看生成html等文件方法二:使用idea生成1.(选中要生成文档的类)找到工具栏tools-->......
  • Java学习3——第七至十 一次题目集以及第三阶段学习的分析与总结
    一.前言   本次Blog是对java学习中第三阶段的一个总结,作为刚学习JAVA不久的小白,以下依旧只是本人作为普通学生,以当前能力和状态所做出的总结和分析,不足之处也欢迎各位大佬的指正! 第七至第十一次题目集,总体题量都比较少,其中较多的也就5道题,其它的就1道。总体难度较第四-六......
  • Java ssh 访问windows/Linux
    工作中遇到的问题:Javacode运行在一台机器上,需要远程到linux的机器同时执行多种命令。原来采用的方法是直接调用ssh命令或者调用plink的命令。google下java的其他ssh方法,发现有个包。具体介绍如下:GanymedSSH2forJavaisalibrarywhichimplementstheSSH-2protocolinpure......
  • Java中WebService实例
    WebServices是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。WebService的关键技术和规则:1.XML:描述数据的标准方法.2.SOAP:表示信息交换的协议(简单对象访问协议).3.WSDL:Web服务描述语言.4.UDDI:通用描述、发现与集......
  • Java并发(十二)----线程应用之多线程解决烧水泡茶问题
    1、背景统筹方法,是一种安排工作进程的数学方法。它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用。怎样应用呢?主要是把工序安排好。比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶、茶杯要洗;火已生了,茶叶也有了。怎么办?办法甲......
  • 阿里的Java开发规范插件验证
    阿里最近有点“烦”,但是作为技术人,更多关注的还是技术层面,其他的就交给有关机构和时间来证明。最近有项工作借鉴了阿里的Java开发规范,为了能让其落地,需要验证方案,而这个Java开发规范提供了对应的验证插件,因此从使用层面,了解一下。目前该插件实现了开发手册中的的53条规则,大部分基于......
  • PHP序列化与反序列化
    PHP反序列化漏洞序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令。序列化与反序列化seriallization序列化:将对象转化为便于传输的格式,......