Java安全--篇四-Java原生反序列化

news2024/12/22 18:33:45

Java原生序列化和反序列化

看理论:

序列化和反序列化的详解_tree_ifconfig的博客-CSDN博客_序列化和反序列化

java序列化与反序列化全讲解_mocas_wang的博客-CSDN博客_java反序列化

java 序列化和反序列化 - xbwang520 - 博客园

序列化和反序列化的简单图解:

我们编写三个类实现一下序列化和反序列化

package packet1;

import java.io.Serializable;

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

    public Person(){

    }

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }



}

这里需要注意的是Person需要实现Serializable接口,以此来标识该类可以序列化和反序列化。因为这个接口里面什么都没有,因此称作反序列化标记

package packet1;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializeTest{
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }

    public static void main(String[] args) throws Exception {
        Person person = new Person("a",18);
        System.out.println(person);
        serialize(person);
    }
}

package packet1;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class UnSerializeTest {
    public static Object unSerialize(String Filename) throws IOException , ClassNotFoundException{
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = (Person) unSerialize("ser.bin");
        System.out.println(person);
    }
}

运行serializeTest后会生成ser.bin文件:

之后运行UnserializeTest可以反序列化该文件:

这里用的是白日梦组长的文档:

为什么会产生安全问题?

只要服务段反序列化数据,客户端传递类的readObject中代码会自动执行,给予攻击者在服务器上运行代码的机会。

可能的形式:

1.入口类的readObject直接调用危险方法。

2.入口类参数中包含可控类,该类中有危险方法,readObject时调用

3.入口类参数中包含可控类,该类中又用其他有危险方法的类,readObject时调用

比如类型定义为Object,调用equals/hashcode/toString

重点:相同类型同名函数

4.构造函数、静态代码块等类加载时隐式执行

共同条件 继承Serializable

入口类 source(需要重写readObject 参数类型宽泛 最好jdk自带)

调用链 gadget chain

执行类 sink (rce ssrf 写文件等等)

0.入口类这里为什么要重写readObject呢?

因为入口类继承了Serializable,肯定是可以进行序列化和反序列化的。通常序列化和反序列化是满足在两台不同的JVM上进行通信的,但是反序列化的时候两台JVM的Hashcode计算值可能不一样,导致序列化前和反序列化后的内容不一致。因此要自己重写readObject以此来保障序列化和反序列化的内容基本一致

另外需要知道readObject在反序列化的时候会自动执行

具体可见:为什么HashMap要自己实现writeObject和readObject方法? - 掘金

1.入口类的readObject存在危险直接调用的方法

这种几乎不可能遇见,但毕竟是有还是要了解一下的。

我们在Person中重写readObject类

package packet1;

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

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

    public Person(){

    }

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        ois.defaultReadObject();
        Runtime.getRuntime().exec("calc");
    }


}

重新序列化和反序列化之后:

2.入口类参数中包含可控类,该类中有危险方法,readObject时调用(URLDNS)

见于URLDNS链子:URLDNS链_清风--的博客-CSDN博客

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django微录播室预约管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【计算机网络】超详细——VLAN、Trunk的配置

1、VLAN 1.1 什么是VLAN? VLAN:即Virtual Local Area Network(虚拟局域网),是物理设备上连接的不受物理位置限制的用户的一个逻辑组,将一个物理LAN划分成多个广播域的通信技术;每一个VLAN是一…

想要高效运行SolidWorks,云上设计了解一下

SolidWorks是达索系统(Dassault Systemes S.A.)旗下SolidWorks公司开发的,运行在微软Windows平台下的第一个三维机械设计软件,涵盖非常广泛的横截面制造业细分市场,目前广泛应用在航天、建筑、汽车生产企业、模具生产企…

[附源码]Python计算机毕业设计Django农产品销售网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

C语言学习之路(基础篇)—— 文件操作(下)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 文件的随机读写 1) fseek 表头文件&#xff1a;#include <stdio.h>定义函数&#xff1a;int fseek(FILE *stream, long offset, int whenc…

【网络层】BGP协议详解、三种路由协议总结

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录BGP协议------外部网关协议----BGP发言人交换网络可达性信息树形结构---防止兜圈子---交换完整路径信息---路径向量BGP格式---应用层协议-------TCP传送-----先建立TCP连接-----建立BGP session---利用会话交…

[附源码]JAVA毕业设计律师事务管理系统(系统+LW)

[附源码]JAVA毕业设计律师事务管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

MyBatisPlus_快速入门_笔记

MyBatisPlus_快速入门_笔记 文章目录MyBatisPlus_快速入门_笔记学习目标一、MyBatisPlus简介1. 入门案例问题导入1.1 SpringBoot整合MyBatisPlus入门程序①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息③&#xff1a;手动添加MyBati…

规避跑道安全事故,如何进行飞机跑道入侵检测

机场跑道入侵因为危险源综合而复杂&#xff0c;涉及方面很多&#xff0c;管制员、飞行员、环境等众多因素的影响导致&#xff0c;一直难以彻底消除&#xff0c;是全球民航面临的重要核心问题。本文围绕北斗RTK技术&#xff0c;探讨如何防止车辆入侵跑道。 机场跑道面积辽阔&am…

# Navicat报错:1045-Access denied for user root@localhost(using password:YES)怎么解决

文章目录1.删除mysql服务2.新建my.ini配置文件3.重新生成data文件4.重新安装mysql服务&#xff0c;同时绑定my.ini配置文件5.重新设置密码6.修改root用户密码1.删除mysql服务 以管理员身份运行cmd&#xff0c;进入安装目录下的mysql的bin文件下&#xff0c;运行命令&#xff1…

Executor框架

文章目录前言Executor框架简介ScheduledThreadPoolExecutor和ThreadPoolExecutor对比总结前言 在一些场景&#xff0c;我们常常会用到多线程&#xff0c;但是线程的管理又比较麻烦。所以我们通常使用线程池来进行线程的管理&#xff0c;而今天我们将介绍一个java中常常 用来创…

如何通过编码器信号计算输送线/输送带线速度(飞剪、追剪算法基础)

不同品牌PLC如何采集编码器的频率(速度)信号,专栏有系列文章和详细讲解,这里不再赘述,链接地址如下: PLC通过编码器反馈值计算速度的推荐做法(算法解析+ST代码)_RXXW_Dor的博客-CSDN博客_plc运算速度PLC如何测量采集编码器的位置数据,不清楚的可以参看我的另一篇博文:…

【docker】配置深度学习环境

目录基本环境搭建问题与解决容器启动后添加端口映射安装完虚拟环境后 CUDA调用不了opencv的使用问题自定义软件包的使用基本环境搭建 容器基本操作&#xff1a; # 按照服务器配置拉取对应的镜像 docker pull pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel# 查看主机端口 没有信…

网站部署SSL证书是否会影响网站流量?

给网站部署SSL证书的重要性想必很多站长用户都已知悉&#xff0c;SSL证书是数字证书的一种&#xff0c;由受信任的数字证书颁发机构CA&#xff0c;在验证服务器身份后颁发&#xff0c;具有服务器身份验证和数据传输加密功能。由于SSL证书是部署在服务器上&#xff0c;那么SSL证…

【第二阶段:java基础】第11章:Exception异常(P442-P459)

本系列博客是韩顺平老师java基础课的课程笔记&#xff0c;B站&#xff1a;课程链接&#xff0c;吐血推荐的一套全网最细java教程&#xff0c;获益匪浅&#xff01; 韩顺平P442-P4591. 异常的概念2. 常见的异常运行时异常编译异常3. 异常处理1️⃣try-catch-finally2️⃣throws4…

Java项目:SSM在线化妆品网站

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为前后台项目&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登…

Java入门笔记

目录Java入门笔记快捷键基础准备环境准备Java编译运行流程TODO自定义模板基础语法变量原理标识符标识符命名规则数据类型整数型浮点型类型转换引用数据类型面向对象类和对象判断一个对象是不是某个类方法传参可变参数基本数据类型传参字符串数据类型传参引用数据类型传参静态属…

MySQL索引事务——小记

文章目录索引概念page索引类型B树vsB树主键索引非聚簇索引覆盖索引复合索引/联合索引优化基于B树的索引hash索引事务事务的特性ACID问题隔离级别索引 概念 使用一定的数据结构&#xff0c;来保存索引字段&#xff08;一列或多列&#xff09;对应的数据。以后根据索引字段来检…

低代码常见场景【上】|如何解决业务问题

全文 2105 字 阅读时间约 7 分钟 首发于码匠技术博客 目录 低代码用例 用于解决业务问题的低代码用例 内部系统开发所面临的困境 低代码如何解决上述困境 关于码匠 低代码平台通过在开发和部署应用程序时最大限度地减少编程来减轻 IT 团队的压力&#xff0c;不仅可以帮助…

[附源码]Python计算机毕业设计Django农村人居环境治理监管系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…