Java 反序列化漏洞

反序列化漏洞是指程序在反序列化期间,通过特殊的调用链引发的一系列安全问题。编程语言中只要存在序列化,反序列化功能就可能存在反序列化的安全问题。这里只针对Java和PHP进行讨论。

序列化漏洞概述

序列化的存在主要是为了存储和传输,将这些在程序内存中的对象转换成数据字节流。由对象转换得到字节流的过程就称作是序列化。反序列化就是由字节流转换得到对象的过程。

反序列化漏洞就是指当目标程序对攻击者可控的数据进行反序列化处理时产生的安全问题。

在各种编程语言的反序列化漏洞中,Java是最引人瞩目的,因为Java的开发生态中各种第三方库组件相互依赖,经常出现开发中常用的基础底层组件出现安全问题时,会引发核弹式反应,进而影响到上层得操作系统。

Java序列化基础知识

在Java中,如果想要对一个对象实现序列化,反序列化,那么这个对象的类必须要实现java.io.Serializable接口。序列化的实现由两种方法:

使用java.io.ObjectOutputStream类的方法

通过writeObject方法实现对象序列化

FileOutputStream f = new FileOutputStream("date.ser");
ObjectOutput s = new ObjectOutputStream(f);
s.writeObject(new Date());
s.flush();

通过readObject方法实现字节流反序列化

FileInputStream in = new FileInputStream("date.ser");
ObjectInputStream s = new ObjectInputStream(in);
Date date = (Date)s.readObject();

类实现Serializable接口

类实现接口会重写两个方法,writeObject和readObject。

Person类:

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

public class Person implements Serializable {

    private String name;

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

    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
        // 反序列化时会调用此方法
        System.out.println("Person.readObject method is being called");
        // 这里从输入数据流里解码读取一个字符串,并将其设置为 name 属性
        name = s.readUTF();
    }

    private void writeObject(ObjectOutputStream s) throws IOException {
        // 序列化时会调用此方法
        System.out.println("Person.writeObject method is being called");
        // 这里将 name 属性字符串编码写入到输出数据流里
        s.writeUTF(name);
    };

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

创建Person对象

Person person = new Person("hacker");

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(person);    // 对 Person 对象进行序列化
byte[] bytes = baos.toByteArray();  // 得到序列化后得到的字节数组

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
Person p = (Person) ois.readObject();   // 对 bytes 字节数组进行反序列化,得到 Person 对象

其它编程语言的序列化和反序列化也大体类似。

Java反序列化漏洞原理

当Java应用程序对来自外部输入的不可信数据进行反序列化时,就会形成反序列化漏洞。

java反序列化漏洞检测思路

数据包内出现字符串:0xaced 00 05(二进制数据的16进制数据表示) 或者 rO0AB(二进制数据的Base64编码)

测试代码:

package Example4;

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

public class Dummy implements Serializable {

    private String cmd;

    public Dummy(String cmd) {
        this.cmd = cmd;
    }

    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
        cmd = s.readUTF();	// 这里从输入数据流里解码读取一个字符串,并将其设置为属性 cmd
        Runtime.getRuntime().exec(cmd);	// 以属性 cmd 作为系统命令进行执行
    }

    private void writeObject(ObjectOutputStream s) throws IOException {
        s.writeUTF(cmd);
    };

}

攻击代码:

package Example4;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class Exploit {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Dummy dummy = new Dummy("calc");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(dummy);
        byte[] bytes = baos.toByteArray();

        // 使用指定字符编码将 byte 数组转换为字符串
        String str = new String(bytes, StandardCharsets.UTF_8);
        // 打印字符串
        System.out.println(str);

        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(bais);
        Dummy d = (Dummy) ois.readObject();
    }
}

结果:弹出计算器

 

Java反序列化漏洞利用

在现实世界的反序列化的利用往往时复杂的,往往需要多个组合多个不同的Serializable接口实现类的方阿飞调用,形成复杂的利用链。

对于实际测试时,推荐一个GITHUB项目:GitHub - frohoff/ysoserial: A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.

运行下面这条命令可以查看这个工具支持的利用链类型:

java -jar ysoserial-all.jar

payload生成命令:

java -jar ysoserial-all.jar payload 命令

需要注意的是工具集成的paylaod需要依赖的组件,当我们测试时发现它有依赖这些组件,就可以进行测试反序列化漏洞。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何设置工业设备的振动监测阈值

工业设备的振动阈值设置是确保设备正常运行和及时维护的关键步骤。本文将介绍一些常见的方法和策略,帮助您正确设置工业设备的振动阈值。 1. ISO 10816 振动烈度表格: ISO 10816 是一项国际标准,提供了设备振动水平的参考值。该标准将设备按…

【移动计算技术(Android)】期末复习

目录 选择题 选择题知识点汇总 Activity Intent Broadcast BroadcastReceiver 如何自定义Receiver 如何注册接收器 Service SharedPreferences 三种访问模式 如何创建 如何存储/修改 如何读取 内部存储 openFileOutput openFileInput SD卡 资源文件 SQLite…

Java学习路线(13)——Collection集合类:List集合与Set集合

一、集合类体系结构 二、部分Collection类型对象 Collection集合特点 List系列集合是有序、可重复、有索引。 ArrayList:有序、可重复、有索引LinkedList:有序、可重复、有索引 Set系列集合是无序、不重复、无索引。 HashSet:无序、不重复…

下载YouTube视频的一种方法

文章目录 工具名称下载方法使用方法1.只下载音频2.下载音频转换成mp3(加上-x –audio-format参数)3.下载视频(带音频)ID:22 | EXT:mp4 | 1280*720 下载的数据集:YouCook2 工具名称 yt-dlp 下载…

ajax使用

说明:ajax是一门异步处理请求的技术;可以实现不重新加载整个页面的情况下,访问后台后服务;比如百度搜索引擎,输入关键字后,下面会实时出现待选项,这就是一种异步处理请求的技术。 原生Ajax 原…

chatgpt赋能python:Python中未定义变量的默认值

Python中未定义变量的默认值 在Python编程中,有时候我们会使用未经定义的变量。如果这些变量没有被定义,那么它们将没有任何值。在这篇文章中,我们将讨论Python中未定义变量默认值的问题,并深入研究为什么这些默认值如此重要。 …

如何保证三个线程按顺序执行?不会我教你

👨‍🎓作者:bug菌 ✏️博客:CSDN、掘金、infoQ、51CTO等 🎉简介:CSDN|阿里云|华为云|51CTO等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12…

linux内核内存管理slab

一、概述 linux内存管理核心是伙伴系统,slab,slub,slob是基于伙伴系统之上提供api,用于内核内存分配释放管理,适用于小内存(小于1页)分配与释放,当然大于1页…

基于html+css的图展示99

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

运动员最佳配对问题——算法设计与分析(C实现)

目录 一、问题简述 二、分析 三、代码展示 四、结果验证 一、问题简述 问题描述:羽毛球队有男女运动员各n人。给定2个n*n矩阵P和Q。P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞争优势;Q[i][j]是男运动员i和女运动员j配合的女运动员竞…

SSM框架学习-拦截器

1. 简介 在Spring框架中,拦截器是一种很重要的组件,它们允许在请求到达控制器之前或之后执行一些代码。拦截器在请求处理的特定点进行拦截,然后通过逻辑来决定是否将控制器的处理传递给下一个处理程序。 在Spring中,拦截器是由实现…

KVM虚拟化技术学习-基础入门

1.虚拟化技术概述 虚拟化[Virtualization]技术最早出现在 20 世纪 60 年代的 IBM ⼤型机系统,在70年代的 System 370 系列中逐渐流⾏起来,这些机器通过⼀种叫虚拟机监控器[Virtual Machine Monitor,VMM]的程序 在物理硬件之上⽣成许多可以运⾏…

Codeforces Round 764 (Div. 3)

比赛链接 Codeforces Round 764 A. Plus One on the SubsetB. Make APC. Division by Two and PermutationD. Palindromes ColoringE. Masha-forgetful A. Plus One on the Subset Example input 3 6 3 4 2 4 1 2 3 1000 1002 998 2 12 11output 3 4 1题意: 你可…

计算机网络考试多选题汇总Ⅱ

https://cadyin.blog.csdn.nethttps://blog.csdn.net/qq_38639612?spm1010.2135.3001.5421 计算机网络考试多选题汇总 1、在Windows中,任务管理器的作用是() A.终止未响应的应用程序 B.终止进程的运行 C.查看系统当前的信息 …

车载网络测试 - CANCANFD - 基础篇_01

目录 问题思考: 一、为什么需要总线? 二、什么是CAN总线? 三、为什么是CAN总线? 四、曾经的车用总线 1、SAEJ1850(Class2) 2、SAEJ1708 3、K-Line 4、BEAN 5、 byteflight, K-Bus 6、D2B 五、当前的车用总线 1、CAN 2、LIN 3、FlexRay 4、MOST 六…

python-sqlite3使用指南

python下sqlite3使用指南 文章目录 python下sqlite3使用指南开发环境sqlite3常用APICRUD实例参考 开发环境 vscode ​ 开发语言: python vscode SQLite插件使用方法: 之后在这里就可以发现可视化数据: sqlite3常用API Python 2.5.x 以上…

E往无前 | 腾讯云大数据 ElasticSearch 高级功能:Cross Cluster Replication实战

前言 Elasticsearch在platinum版本中,推出了Cross Cluster Replication特性(以下简称CCR),也即跨集群远程复制。 该特性可以解决两类问题: 1,数据迁移; 2,异地备份。 本文以实战为主…

微服务和领域驱动

一、微服务 1.1 什么是微服务 微服务就是一些协同工作的小而自治的服务。 关键词: 小而自治 -- 小 “小”这个概念,一方面体现在微服务的内聚性上。 内聚性也可以称之为单一职责原则:“把因相同原因而变化的东西聚合到一起,…

企业电子招投标采购系统源码之登录页面-java spring cloud

​ 信息数智化招采系统 服务框架:Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光,艰难的生活里,诗歌是那陡峭的另一面

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光,艰难的生活里,诗歌是那陡峭的另一面 《赶时间的人》 作者王计兵,一个外卖员的诗,饱含对生活的热情,向上的力量,仿若身在炼狱,心…