《Web安全基础》07. 反序列化漏洞

web安全-反序列化漏洞 一 XSS漏洞产生的原因是javascript可以随时插入一段代码,而Java是一种先编译再执行的语言,所以开发者认为java可能原生比javascript更安全,在开发中关注逻辑安全即可。 2015 年,Java 曾被曝出一个严重的漏洞,很多经典的商业框架都因此受到影响,其中最知名的是WebLogic。据统计,在网络中公开的 WebLogic 服务有 3 万多个。其中,中国就有 1 万多个外网可访问的 WebLogic 服务。因此,WebLogic 的反序列化漏洞意味着,国内有 1 万多台服务器可能会 阅读详情


本系列侧重方法论,各工具只是实现目标的载体。
命令与工具只做简单介绍,其使用另见《安全工具录》。

靶场参考:pikachu,WebGoat。

1:基本概念

1.1:序列化&反序列化

序列化(Serialization),指将内存数据(数据结构或对象)转化为一种便于存储或传输的格式(字节序列)的过程。

反序列化(Deserialization),是序列化的逆过程,把字节序列恢复为原先的内存数据,以便在程序中进行进一步处理和使用。

在这里插入图片描述

作用:

  • 将内存中的数据转化为字节序列,以便于数据传递和恢复。

用途:

  • 把内存数据以字节序列形式永久保存到硬盘上,通常存放在一个文件中(序列化对象)。
  • 在网络上传送内存数据的字节序列(网络传输对象)。

不同语言,不同操作序列化生成的字节流格式一般不同。

1.2:反序列化漏洞

反序列化漏洞(Deserialization Vulnerability):用户可以控制或修改用来反序列化的数据,这可能使攻击者能够操纵序列化对象,将有害数据传递到应用程序中,从而产生安全问题。

漏洞成因:
在身份验证,文件读写,数据传输等功能处,未对反序列化接口做访问控制,未对序列化数据做加密和签名,加密密钥使用硬编码(如Shiro 1.2.4),使用不安全的反序列化框架库(如Fastjson 1.2.24)或函数的情况下,由于序列化数据可被用户控制,攻击者可以精心构造恶意的序列化数据(执行特定代码或命令的数据)传递给应用程序,在应用程序反序列化对象时执行攻击者构造的恶意代码,达到攻击者的目的。

反序列化漏洞一般都可执行任意命令或代码。

某些漏洞无法回显,所以一般情况下需要反弹 shell。
黑盒测试可以通过 http 头发现反序列化利用处。

参考文章:
常见的Web漏洞——反序列化漏洞

1.3:POP 链

POP(Property-Oriented Programing,面向属性编程),从现有运行环境中寻找一系列能够调用的代码或指令,然后根据需求将这些指令整合成有逻辑的、能实现需求的代码。称为 POP 链。

一般的 CTF 反序列化,存在漏洞的地方在魔术方法(或反射)中,可以通过自动调用魔术方法(或反射)来达到攻击效果。
但是当注入点存在普通的类方法中,通过自动调用的方法就失效了,此时需要找到普通类与魔术方法(或反射)之间的联系,理出一种逻辑思路,通过这种逻辑思路来构造一条 pop 链,从而达到攻击的目的。

参考文章:

php反序列化-POP链的构造利用

php反序列化之pop链构造

【Java安全】反序列化-CC3反序列化漏洞POP链分析

2:PHP 反序列化

在这里插入图片描述

2.1:序列化&反序列化

PHP 中的序列化与反序列化:

  • serialize():序列化。
  • unserialize():反序列化。

示例:

<?php 

	class Stu {
		public $name = 'Bob';
		public $age = 18;
	
		public function demo() {
			echo "Hello";
		}
	}

	$stu = new Stu(); 

	print_r($stu);
	echo "\n\n----------\n\n";

	// 进行序列化
	$stus = serialize($stu);

	print_r($stus);
	echo "\n\n----------\n\n";

	// 进行反序列化
	$stus = unserialize($stus);
	
	print_r($stus);
	echo "\n\n----------\n\n";
?>

在这里插入图片描述

序列化结果说明:

在这里插入图片描述

2.2:魔术方法

魔术方法是 PHP 面向对象中特有的特性,在特定的情况下被触发,然后在魔术方法中的命令代码就会被执行。

示例:

<?php
	class Stu {
		public $name = 'Bob';
		public $age = 18;

		function __construct() {
			echo "\n对象被创建了__construct()";
		}

		function __wakeup() {
			echo "\n执行了反序列化__wakeup()\n";
		}

		function __toString() {
			echo "\n对象被当做字符串输出__toString\n";
			return 'asdsadsad';
		}

		function __sleep() {
			echo "\n执行了序列化__sleep\n";
			return array('name', 'age');
		}

		function __destruct() {
			echo "对象被销毁了__destruct()\n";
		}
	}

	$stu = new Stu();

	echo "\n";

	// 序列化
	$stu_ser = serialize($stu);

	echo "\n";
	print_r($stu_ser);
	echo "\n";

	// 当成字符串输出
	echo "$stu";
	echo "\n";

	// 反序列化
	$stu_unser = unserialize($stu_ser);

	print_r($stu_unser);
	echo "\n";
?>

在这里插入图片描述

参考文章:

PHP反序列化漏洞详解
https://blog.youkuaiyun.com/LJH1999ZN/article/details/123338591

PHP反序列化与魔术方法:
https://www.cnblogs.com/20175211lyz/p/11403397.html

php反序列化完整总结:
https://xz.aliyun.com/t/12507#toc-15

3:JAVA 反序列化

在这里插入图片描述

3.1:序列化&反序列化

Java 中的序列化与反序列化:

  • 序列化:ObjectOutputStream -> writeObject()
  • 反序列化:ObjectInputStream -> readIObject()

序列化方法对参数指定的 obj 对象进行序列化,把字节序列写到目标输出流中,按 Java 的标准约定文件扩展名为 .ser。

反序列化方法从一个源输入流中读取字节序列,再把字节序列反序列化为一个对象,并将其返回。

示例:以下代码写在 Test.java 文件。
1、javac Test.java
2、java Test

import java.io.*;

public class Test {
    public static void main(String[] args) {
        try {
            // 序列化
            serialize();

            // 反序列化
            deserialize();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void serialize() throws IOException {
        Student student = new Student();
        student.setName("Bob");
        student.setAge(18);
        student.setScore(1000);

        ObjectOutputStream objectOutputStream =
                new ObjectOutputStream(new FileOutputStream(new File("student.txt")));
        objectOutputStream.writeObject(student);
        objectOutputStream.close();

        System.out.println("序列化成功!已经生成 student.txt 文件");
        System.out.println("==============================================");
    }

    public static void deserialize() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream =
                new ObjectInputStream(new FileInputStream(new File("student.txt")));
        Student student = (Student) objectInputStream.readObject();
        objectInputStream.close();

        System.out.println("\n反序列化结果为:");
        System.out.println(student);
    }
}

class Student implements Serializable {
    private String name;
    private Integer age;
    private Integer score;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student:" + '\n' +
                "name = " + this.name + '\n' +
                "age = " + this.age + '\n' +
                "score = " + this.score + '\n';
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Java 序列化的结果不可读。

Java 序列化的标志特征参考:

  • 数据以 aced 开头,那么这是一段 16 进制的 Java 序列化数据。
  • 数据以 rO0 开头,基本可以确定这是一段 base64 编码的 Java 序列化数据。

3.2:反射机制

Java 中没有魔术方法,但是有反射(Reflection)机制。

Java 反射机制是一种动态获取信息以及动态调用对象方法的功能。即在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个类的成员变量和方法,可以了解任意一个对象所属的类,可以调用任意一个对象的属性和方法。

Java 反射机制允许在运行时获取和操作类、对象、方法、字段等信息,而不需要在编译时知道这些信息的确切类型。反射机制为开发者提供了一种动态获取和操作类的能力,使得编写更灵活、通用和可扩展的代码成为可能。

一般利用反射机制来构造一个执行命令的对象或直接调用一个具有命令/代码执行功能的方法,以此实现任意代码执行。

示例:
1、javac Person.java ReflectionExample.java
2、java ReflectionExample

Person.java 文件:

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

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

    public void introduce() {
        System.out.println("My name is " + name + " and I am " + age + " years old.");
    }
}

ReflectionExample.java 文件:

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // 使用反射创建 Person 类的实例
        Class<?> personClass = Class.forName("Person");
        Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
        Object personObject = constructor.newInstance("John Doe", 30);

        // 使用反射调用 Person 类的 introduce 方法
        Method introduceMethod = personClass.getMethod("introduce");
        introduceMethod.invoke(personObject);
    }
}

在这里插入图片描述

3.3:相关资源

参考文章:
JAVA反序列化-反射机制

Java 反序列化工具 ysoserial:
https://github.com/frohoff/ysoserial

Java 反序列化工具 SerializationDumper:
https://github.com/NickstaDB/SerializationDumper/tree/1.12


非鬼亦非仙,一曲桃花水。

——《生查子 · 独游雨岩》(宋)辛弃疾

web安全不安全的反序列、命令执行漏洞解析 限制可执行命令的范围和使用权限。例如,限制可执行命令的用户、权限和执行路径等参数。 阅读详情

相关推荐

2023最全面网络安全面试题1000道附答案

2023最全面网络安全面试题1000道附答案

zxcvbnmasdflzl的博客 1872

反序列化漏洞

反序列化漏洞 1、概述 序列化是让Java对象脱离Java运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。 Java 序列化是指把 Java 对象转换为字节序列的过程,便于保存在内存、文件、数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化。反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化。 条件: 类必须实现反序列化接口,同时设置serialVers

金色%夕阳的博客 4607

常见的Web漏洞——反序列化漏洞

反序列化简介 序列化:把对象转换为字节序列的过程,即把对象转换为可以存储或传输的数据的过程。例如将内存中的对象转换为二进制数据流或文件,在网络传输过程中,可以是字节或是XML等格式。 反序列化:把字节序列恢复为对象的过程,即把可以存储或传输的数据转换为对象的过程。例如将二进制数据流或文件加载到内存中还原为对象。 反序列化漏洞首次出现在2015。虽然漏洞较新,但利用十分热门。主要原因是对用户可控制的数据进行反序列化时,攻击者能够操纵序列化的对象,从而将精心构造的恶意数据传递到应用程序代码中

江左盟的博客 1万+

13.反序列化

13.1什么是反序列化 就是把一个对象变成可以传输的字符串,目的就是为了方便传输。假设,我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果我们让这个class一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。当我们写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就和我们说,你可以把这个对象序列化了,存成一个字符串..

qq_45926195的博客 301

Web安全Day15 - 反序列化实战攻防

利用程序已有的一些函数在参数中注入一些代码,达到代码执行的效果。Typecho基于PHP5开发,支持多种数据库,是一款内核强健﹑扩展方便﹑体验友好﹑运行流畅的轻量级开源博客程序。

zhengke506868338的博客 1966

反序列化漏洞汇总

JAVA反序列化、PHP反序列化,场景容器反序列化利用过程

buffedon的博客 5307

【web安全】——反序列化漏洞快速入门

反序列化漏洞快速入门

Demo不是emo的博客 1万+

Web安全基础:反序列化漏洞详解(含PHP,Python示例)

当系统接收和处理外部输入的数据时,可能会通过反序列化过程执行恶意代码或操作。这个漏洞的根本原因在于,系统对反序列化数据的处理不够严格,导致攻击者能够将精心构造的数据注入到反序列化流程中,进而达到远程代码执行、数据篡改、权限提升等目的。

HackYourself的博客 1045

【Web安全】反序列化安全漏洞全解析:从原理到实战测试指南

反序列化漏洞作为横跨多语言的"通用型"安全风险,其危害之大、隐蔽性之强,一直是安全测试的重点和难点。随着攻防对抗的升级,攻击者不断发现新的利用链,防御技术也在持续演进(如更严格的默认配置、动态沙箱检测)。对于安全测试人员而言,需建立"全生命周期"的漏洞检测思维:在开发阶段参与代码审计,识别潜在风险;在测试阶段通过黑盒与白盒结合的方式挖掘漏洞。同时,需持续关注新漏洞披露和防御技术发展,不断更新知识体系。本文是「Web安全」系列内容,点击专栏导航查看全部内容。

水滴石穿 1802

网络安全之反序列化漏洞分析

FastJson 是 alibaba 的一款开源 JSON 解析库,可用于将 Java 对象转换为其 JSON 表示形式,也可以用于将 JSON 字符串转换为等效的 Java 对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。

lzhy666的博客 3548

Web漏洞学习手册

本文是对Web中最常见漏洞的一个小结,既然是Web漏洞,那自然而然不能忽略了OWASP Top10了。最新版的OWASP Top10还是2017年公布的。如下: 注入 失效的身份认证 敏感信息泄露 XML 外部实体(XXE) 失效的访问控制 安全配置错误 跨站脚本(XSS) 不安全的反序列化 使用含有已知漏洞的组件 不足的日志记录和监控 详情:OWASP Top 10 2017...

谢公子的博客 1万+

Web漏洞 | JAVA反序列化漏洞,从零基础到精通,收藏这篇就够了!

反序列化漏洞序列化和反序列化反序列化漏洞payloadJAVA Web反序列化漏洞的挖掘和利用Part 1反序列化漏洞JAVA反序列化漏洞到底是如何产生的?1、由于很多站点或者RMI仓库等接口处存在java的反序列化功能,于是攻击者可以通过构造特定的恶意对象序列化后的流,让目标反序列化,从而达到自己的恶意预期行为,包括命令执行,甚至 getshell 等等。2、Apache Commons Collections是开源小组Apache研发的一个 Collections 收集器框架。

yy1715713348的博客 1161

Materials Studio实战技巧(八)——利用片段库高效构建有机金属配合物

本文详细介绍了在Materials Studio中利用Fragment Browser(片段浏览器)高效构建有机金属配合物的实战技巧。通过调用预置的Metal Templates和Ligands库,用户可以快速搭建如茂金属催化剂等复杂分子骨架,并利用对称性操作精确控制Meso与Rac构型。文章还涵盖了自定义片段库的创建与使用,能显著提升建模效率,适用于计算化学与材料模拟领域的研究者。

wine的专栏 936

深入剖析 Shiro 反序列化漏洞原理

Shiro 框架是一个强大且易用的 Java 安全框架,它提供了一套全面的安全解决方案。在一个 Java Web 应用中,Shiro 可以帮助开发者轻松实现用户认证(判断用户是否合法登录)、授权(决定用户能访问哪些资源)、加密(保护敏感数据)以及会话管理(跟踪用户的会话状态)等功能。例如,在一个电商系统中,Shiro 可以用于验证用户登录信息,确保只有登录用户能查看订单信息,同时对用户密码进行加密存储,保障用户数据安全。

m0_67544876的博客 1255

信贷风控实战指南:Vintage分析表从数据建模到风险洞察

本文是一份信贷风控实战指南,详细阐述了Vintage分析从数据建模到风险洞察的全流程。文章深入解析了Vintage分析作为信贷资产“体检报告”的核心价值,并提供了从借据表与还款计划表设计、账龄计算、逾期口径判定到风险暴露计算与最终可视化透视的完整SQL实现方案,旨在帮助风控从业者构建精准的风险监控体系。

nft7creator的博客 321

数字IC后端设计实现之Innovus POD V2 Flow性能优化全解析

本文深入解析了数字IC后端设计中的Innovus POD V2 Flow性能优化方案。该流程通过整合place_opt_design与clock_opt_design命令,实现了布局与时钟树的协同优化,有效提升了时序收敛效率、改善了设计密度与拥塞,并显著减少了迭代次数,是应对先进工艺复杂设计的关键利器。

ik6789012的博客 1252

web安全漏洞总结

分析了一下漏洞造成的原因,怎么利用漏洞,怎么防御漏洞。漏洞分为两个部分,常见的漏洞:sql注入、文件上传漏洞、文件包含漏洞、代码执行漏洞、命令执行漏洞、代码执行漏洞、xxe、xss、csrf、ssrf漏洞、反序列化漏洞、中间件漏洞、解析漏洞、权限提升漏洞。 第二部分:敏感信息漏洞、授权访问漏洞、逻辑漏洞、未授权访问、中间件漏洞

weixin_49349476的博客 5212

数据资产目录(SailCatalog)和数据地图(SailMap)

笔者接下来准备开发大数据平台(XSailboat)中的数据资产目录(SailCatalog)和数据地图(SailMap)相关的功能,本文用以记录笔者关于此部分功能的概念梳理和主体功能设计。

OkGogooXSailboat的博客 2327

Shiro反序列化漏洞

文章目录一、漏洞介绍1.1 简介1.2 漏洞原理1.3 漏洞特征1.4 漏洞影响二、环境配置三、漏洞利用3.1 利用方法(一) 一、漏洞介绍 1.1 简介   Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。java中的权限框架有SpringSecurity和Shiro,由于Spring功能强大但复杂,Shiro的简单强大,扩展性好因此用的还是很多。 1.2 漏洞原理   Apache Shiro框架提供了记住我的功能(RememberMe),用户登录成功后会生成经过加密并

Kevin's Blog 1万+

Window10 intel realsense D435安装并实现opencv显示realsense读取的彩色和深度数据(QT+openCV+rsD35)

(1)点击"官方指南" 来到下载页,-&gt;最新的稳定版本发布 (本人下的2.16.5,现在最新2.17.0) 不需要做开发,只要下载Intel RealSense Viewer就好,这个就是相机的可视化界面,简洁明了。对应的安装包是Intel.RealSense.Viewer.exe。 本人的毕设要用到深度图做开发,所以安装Intel.RealSense.SDK.exe,SDK...

Pabebe的博客 1万+

2025反爬终极方案:Python破解Cloudflare v2行为指纹,设备伪装+轨迹模拟拦截率压至1%

Cloudflare v2的反爬逻辑越来越接近“人类行为识别”,单纯的技术破解已失效,核心竞争力变成“模拟真实用户的能力”。本文的终极方案本质是“全方位复刻人类行为”——从设备指纹到操作轨迹,从网络特征到交互模式,让爬虫成为“无法被区分的真实用户”。这套方案的优势是“通用性强”,不仅适用于Cloudflare v2,也能破解大多数高反爬网站(如小红书、知乎、跨境电商)的行为检测;且代码可直接复用,新手只需替换目标URL和数据提取逻辑,就能快速落地。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2354

PHP反序列化漏洞

这篇主要是学习介绍php反序列化漏洞基础。

2301_79096184的博客 1948

Claude Code Cli 源码泄露事件全解析:从51万行代码中拆解AI Agent的记忆护城河

2026年3月,Anthropic的AI编程助手Claude Code意外泄露51万行核心代码,暴露了其多Agent架构、六级权限验证系统及创新的记忆机制。记忆系统采用四层设计:用户自定义框架、自动记忆提取、智能上下文压缩和纯文件存储。最独特的是"自动做梦"功能,AI会定期整理记忆,类似人类睡眠记忆巩固。代码还揭示未发布功能如电子宠物系统,但也暴露权限系统漏洞和代码质量问题。这次泄露展现了AI助手核心技术的复杂性,特别是其记忆系统如何通过透明可编辑的设计建立用户信任。

program哲学 469
上一篇: 《Web安全基础》06. 逻辑漏洞&越权
下一篇: 《Web安全基础》08. 漏洞发现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值