反序列化漏洞详解

用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技术操作,可能对目标系统造成数据损坏、服务中断等风险。读者需充分评估技术能力与潜在后果,在合法合规前提下谨慎实践。

这次我们主要介绍反序列化漏洞,其中两种比较常见的反序列化漏洞,Java反序列化漏洞和php反序列化漏洞,接下来着重介绍这两种反序列化漏洞。

、Java 反序列化漏洞

Java 作为面向对象的编译型语言,其序列化格式为二进制流(不可直接阅读),漏洞触发依赖readObject()方法(反序列化核心方法),且通常需要构造 “利用链(Gadget Chain)”—— 串联多个类的方法,最终触发恶意代码执行,比 PHP 反序列化更复杂但危害范围更广。

1. 漏洞核心原理

(1)Java 序列化机制

Java 通过java.io.Serializable接口标记可序列化类,序列化由ObjectOutputStream.writeObject()完成(生成二进制流),反序列化由ObjectInputStream.readObject()完成(恢复对象)。
关键特性:若类重写了readObject()方法,反序列化时会优先执行该方法中的逻辑—— 这是漏洞的核心触发点。

(2)利用链(Gadget Chain)的必要性

Java 的安全设计较严谨,单个类的readObject()通常无法直接执行命令(如无Runtime.getRuntime().exec()这类危险代码)。因此,攻击者需要 “串联多个合法类的方法”,形成一条 “利用链”:从readObject()出发,通过调用链触发反射(Java 的反射机制可动态调用任意类的任意方法),最终执行恶意命令。
简单理解:利用链 = readObject() → 类 A 方法 → 类 B 方法 → ... → 反射执行命令。

(3)漏洞触发流程

攻击者分析目标 Java 程序依赖的第三方库(如 Apache Commons Collections、Jackson)或框架(如 Struts2、WebLogic),寻找可串联成利用链的类;

构造恶意对象:基于利用链,创建包含恶意逻辑的序列化对象(如通过反射执行calc.exe的对象);

将恶意二进制流通过请求(如 HTTP POST、T3 协议)传入目标程序;

目标程序调用readObject()反序列化该流,触发利用链,执行恶意代码。

2. 典型代表案例

(1)里程碑漏洞:Apache Commons Collections 反序列化漏洞(CVE-2015-7501)

漏洞背景:2015 年披露,影响 Apache Commons Collections 3.1~3.2.1 版本(该库是 Java 生态中最常用的工具库之一,几乎所有企业级 Java 项目都会依赖),是 Java 反序列化漏洞的 “开山之作”,直接推动了后续所有 Java 反序列化漏洞的研究。

漏洞原理(核心利用链):
关键类:TransformedMap( Commons Collections 中的映射类)、InvokerTransformer(实现Transformer接口,可通过反射调用方法)。

TransformedMap在反序列化时,会调用其transformValue()方法,而该方法会执行Transformer接口的transform()方法;

攻击者将TransformedMap的Transformer设置为InvokerTransformer,并指定InvokerTransformer通过反射调用Runtime.getRuntime().exec()(执行系统命令);

当TransformedMap被反序列化时,transform()触发InvokerTransformer的反射逻辑,最终执行命令。

利用方式:
攻击者通过工具(如 ysoserial,专门生成 Java 反序列化利用链的工具)生成包含TransformedMap和InvokerTransformer的恶意二进制流,通过 HTTP 参数或协议(如 Struts2 的params参数)传入目标程序,触发readObject()后执行命令。

危害:覆盖全球数百万依赖 Commons Collections 的 Java 应用(如 Struts2、WebLogic、JBoss),导致大规模 RCE 攻击,至今仍是渗透测试中的 “必测漏洞”。

(2)企业级漏洞:WebLogic T3 协议反序列化漏洞(CVE-2017-10271)

漏洞背景:影响 Oracle WebLogic Server 10.3.6.0、12.1.3.0、12.2.1.1、12.2.1.2 版本(WebLogic 是 Oracle 推出的企业级应用服务器,广泛用于金融、政府、大型企业)。

漏洞原理:WebLogic 的T3协议(用于 WebLogic 服务器与客户端 / 其他服务器通信)在处理序列化数据时,会调用readObject()反序列化数据。攻击者可利用 WebLogic 内部的wls9_async_response组件,构造包含恶意利用链(如基于 Commons Collections 或 WebLogic 自身类的链)的序列化数据,通过 T3 协议发送给服务器。

利用方式:
攻击者无需认证,直接向 WebLogic 的 T3 端口(默认 7001)发送恶意二进制流,服务器反序列化时触发利用链,执行命令(如nc反弹 shell)。

危害:企业级服务器直接被远程控制,可能导致核心业务数据泄露、业务中断,甚至内网横向渗透(因为 WebLogic 通常部署在企业内网)。

一、PHP 反序列化漏洞

PHP 作为脚本语言,其序列化格式为明文可阅读的字符串,漏洞触发高度依赖 PHP 的 “魔术方法”(具有特殊功能的预定义方法,通常以__开头),本质是 “可控输入触发危险魔术方法”。

1. 漏洞核心原理

(1)PHP 序列化格式

PHP 对象序列化后会生成类似如下的字符串,结构清晰(便于攻击者构造恶意数据):

php

// 格式:O:类名长度:"类名":属性个数:{属性1类型:属性1值;属性2类型:属性2值;...}O:5:"User":2:{s:8:"username";s:5:"admin";s:8:"password";s:6:"123456";}// 含义:类名User(长度5),2个属性:username(字符串,值admin)、password(字符串,值123456)

(2)关键触发点:魔术方法

PHP 在反序列化过程中会自动触发特定魔术方法,若这些方法中包含 “危险操作”(如eval()、system()、文件写入等),且方法依赖的属性值可由攻击者控制,则漏洞成立。常见危险魔术方法:

__wakeup():反序列化之前触发(最核心的触发点之一);

__destruct():对象被销毁时触发(反序列化后若对象无引用,会自动触发);

__toString():对象被当作字符串使用时触发(如echo $obj、字符串拼接);

__call():调用不存在的方法时触发;

__get():访问不存在的属性时触发。

(3)漏洞触发流程

攻击者分析目标 PHP 程序,找到包含 “危险魔术方法” 的类(如存在__wakeup()调用eval($this->cmd)的类);

构造恶意对象:将危险方法依赖的属性(如$cmd)设为恶意代码(如system("whoami"));

将恶意对象序列化为字符串,通过请求参数(如 Cookie、POST 参数)传入目标程序;

目标程序接收该字符串并执行unserialize()(反序列化),触发魔术方法,执行恶意代码。

2. 典型代表案例

(1)PHP 原生漏洞:CVE-2016-7124

漏洞背景:影响 PHP 5.6.25 之前、7.0.10 之前的版本,源于 PHP 的Session反序列化机制缺陷。

漏洞原理:
PHP 的Session存储依赖session.serialize_handler(序列化处理器),默认值为php(格式:键名|序列化数据),而若配置为php_serialize(格式:序列化数据),且session.save_handler为自定义处理器(如user),则Session数据的反序列化过程可控。

利用方式:
攻击者通过 Cookie 设置PHPSESSID对应的Session数据,构造包含恶意对象的序列化字符串(如触发__wakeup()执行命令的对象)。当 PHP 读取Session并反序列化时,直接触发漏洞,实现 RCE。

危害:直接攻击 PHP 解释器本身,无需依赖第三方框架,影响所有使用存在漏洞版本 PHP 的网站。

(2)框架漏洞:ThinkPHP 5.x 反序列化漏洞(如 CNVD-2018-24942)

漏洞背景:影响 ThinkPHP 5.0.0~5.0.23、5.1.0~5.1.30 版本,是 PHP 框架中最典型的反序列化漏洞之一(ThinkPHP 是国内使用最广泛的 PHP 框架)。

漏洞原理:
ThinkPHP 框架的Request类(处理 HTTP 请求)中存在__destruct()魔术方法,该方法会调用filterValue(),而filterValue()会执行call_user_func()(调用指定函数)。攻击者可通过控制filter属性(指定要调用的函数)和params属性(函数参数),构造恶意序列化数据。

利用方式:
攻击者通过cookie或GET/POST参数传入恶意序列化字符串(如O:10:"think\Request":2:{s:8:"filter";s:6:"system";s:6:"params";a:1:{i:0;s:6:"whoami";}}),当框架对该数据反序列化时,__destruct()触发call_user_func("system", "whoami"),执行系统命令。

危害:覆盖大量使用 ThinkPHP 的中小型网站,攻击者可直接获取服务器权限,植入后门或窃取数据。

、PHP 与 Java 反序列化漏洞的核心区别

对比维度

PHP 反序列化漏洞

Java 反序列化漏洞

序列化格式

明文字符串(易构造、易调试)

二进制流(需工具生成,如 ysoserial)

核心触发点

魔术方法(__wakeup()、__destruct()等)

重写的readObject()方法

利用链复杂度

低(多为单个类的魔术方法直接触发)

高(需串联多个类形成利用链,依赖第三方库)

影响范围

主要影响 PHP 脚本 / 框架(如 ThinkPHP、Laravel)

影响所有 Java 应用(含企业级服务器、框架)

典型依赖

自身语法特性(魔术方法)

第三方库(Commons Collections)或框架组件

、两类漏洞的共同危害

无论 PHP 还是 Java 反序列化漏洞,其核心危害均为远程代码执行(RCE) ,攻击者可实现:

完全控制服务器:执行任意系统命令(如whoami、rm -rf /),获取服务器权限;

数据窃取 / 破坏:读取数据库配置、下载核心业务数据,或删除关键文件;

植入后门:上传 webshell(如 PHP 的一句话后门、Java 的jspx后门),长期控制服务器;

内网横向渗透:若服务器位于内网,攻击者可通过该服务器攻击内网其他机器,扩大攻击范围

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

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

相关文章

SQL数据分析原代码--创建表与简单查询

CREATE TABLE:创建表,定义字段名、类型、注释INSERT INTO:插入数据,支持单条或批量插入SELECT:查询数据,*表示所有字段,AS可起别名,DISTINCT去重WHERE:条件筛选&#xff…

k8s查询ServiceAccount有没有列出 nodes 的权限

要检查 ServiceAccount xxxxxx:default 是否具有列出 nodes 的权限,可以使用以下方法:1. **使用 kubectl auth can-i 命令**这是最直接的方法,可以检查特定用户或 ServiceAccount 是否具有特定权限:kubectl auth can-i list nodes…

调试Python程序时,控制台一直打印SharedMemory read faild

from tkinter import filedialog filedialog.askopenfilename()在使用 tkinter 时,只要一处罚,控制台就不停打印 SharedMemory read faild ,虽然能用,但是大大的破坏了调试体验,看到如下的提示,你说烦不烦&…

QRCode React 完全指南:现代化二维码生成解决方案

前言 在数字化时代,二维码已经成为连接线上线下的重要桥梁。无论是分享链接、支付码、还是身份验证,二维码都扮演着不可或缺的角色。qrcode.react 是一个专门为 React 应用设计的二维码生成库,它能够快速、灵活地生成各种样式的二维码&#…

xxe外部实体注入漏洞

https://owasp.org/www-project-top-ten XXE基础 xxe外部实体注入 外部实体 xml(用于传输和存储数据) html(用于显示数据) 注入: SQL注入:用户输入数据被当做代码执行 1输入点 2.输入数据可以结合到数据库…

ros2获取topic信息解析

ros2 ros_discovery_info topic 发布逻辑疑问: 在运行ros2 topic info -v /topic时,运行的是p3,如何与p1进程通讯的呢? 进程间理论上应该是IPC

FFmpeg合成mp4

本章主要介绍如何使用FFmpeg来将一个音频文件和一个视频文件合成一个MP4文件,以及在这个过程中我们如何对编码过程进行封装以及sample_rate 重采样的过程(由于提供的音频文件的编码类型为S16,所以我们需要转化为MP4支持的FLTP浮点类型&#x…

第十九章 使用LAMP架构部署动态网站环境

第十九章 使用LAMP架构部署动态网站环境 文章目录第十九章 使用LAMP架构部署动态网站环境一、安装Httpd服务1、安装httpd服务2、启动httpd服务3、设置允许通过防火墙4、验证http服务是否成功二、安装Mariadb服务1、安装Mariadb服务2、启动Mariadb服务三、安装PHP服务1、列出可用…

Selenium应用中的核心JavaScript操作技巧

Selenium是一款强大的浏览器自动化测试工具,其操作浏览器的能力部分来自于其内嵌的JavaScript执行引擎。这使得Selenium不仅能够模拟用户在浏览器中的各种操作,还能执行复杂的JavaScript脚本,以实现更为精细的控制。本文将探讨如何通过Seleni…

《Linux 基础指令实战:新手入门的命令行操作核心教程(第一篇)》

前引:当你第一次面对 Linux 系统中那片闪烁着光标、只有黑白字符的终端界面时,或许会和很多初学者一样感到些许茫然:这些由字母和符号组成的 “指令” 究竟该如何输入?它们又能完成哪些神奇的操作?其实,Lin…

03.【Linux系统编程】基础开发工具1(yum软件安装、vim编辑器、编辑器gcc/g++)

目录 1. 软件包管理器 1.1 什么是软件包 1.2 Linux软件生态 1.3 yum具体操作 1.3.1 查看软件包 1.3.2 安装软件 1.3.3 卸载软件 1.3.4 注意事项(测试网络) 1.3.5 yum指令集总结 1.4 yum源目录、安装源 2. Vim编辑器的使用 2.1 Linux编辑器-vim使用 2.2 vim的基本概…

3DMAX自动材质开关插件AutoMaterial安装和使用方法

3DMAX自动材质开关AutoMaterial,是一个3dMax脚本插件,它根据材质编辑器中当前活动的材质自动将材质应用于3dMax中新创建的对象,也适用于您复制的没有材质的对象。它作为一个开关,可以绑定到按钮或菜单来打开和关闭它。该工具的创建…

Linux内核调优实战指南

内核调优通常通过修改内核运行时参数来实现,这些参数的配置文件是 Linux 系统中核心的性能调整点。 内核调优配置文件名称 /etc/sysctl.conf: 这是最传统和主要的内核参数配置文件。系统启动时或手动执行 sysctl -p 命令时会读取并应用其中的设置。/etc/sysctl.d/*.…

Java基础常见知识点

Java 中 和 equals() 的区别详解_java中与equals的区别及理解-CSDN博客https://blog.csdn.net/m0_64432106/article/details/142026852深入理解Java中方法的参数传递机制 - 悟小天 - 博客园https://www.cnblogs.com/sum-41/p/10799555.html浮点型精度是什么意思?为…

OD C卷 -【高效货运】

文章目录高效货运高效货运 货车的额定载货量为wt;货物A单件重量为wa,单件运费利润为pa;货物B单件重量wb,单件运费利润为pb;每次出车必须包含A、B货物,且单件货物都不可分割,总重量达到额定的载货量wt;每次出车能够获取…

手动解压并读取geo 文件 series_matrix_table_begin series_matrix_table_end之间的数据

手动解压并读取geo 文件 series_matrix_table_begin series_matrix_table_end之间的数据 1. 手动解压并读取文件内容 file_path <- “K:/download/geo/raw_data/GEO/GSE32967_series_matrix.txt.gz” 使用latin1编码读取文件所有行 con <- gzfile(file_path, “r”) all_…

主板硬件研发基础--DP/DP++

现在的主板大多数使用的是比DP功能更加强大的DP++。 DisplayPort++(DP++)是 DisplayPort 技术的增强版,旨在提升与多种视频接口的兼容性和连接性能。以下是关于它的详细介绍: 功能特性 多协议兼容:DP++ 接口不仅支持 DisplayPort 标准的信号传输,还可以通过内部的转换电…

科技行业新闻发布平台哪家好?多场景推广专业方案服务商推荐

面对海量得新闻发布平台和碎片化的传播场景&#xff0c;如何精准选择推广方案无疑是企业主面临的一大难题&#xff0c;对于技术迭代迅速的科技行业更是如此。针对复杂的市场环境&#xff0c;一些专业的新闻发布平台往往能够针对性地给出营销方案&#xff0c;并提供一定技术支持…

SystemVerilog 学习之SystemVerilog简介

SystemVerilog简介SystemVerilog是一种硬件描述和验证语言&#xff08;HDVL&#xff09;&#xff0c;由Accellera开发并于2005年成为IEEE标准&#xff08;IEEE 1800&#xff09;。它在传统Verilog基础上扩展了高级验证和设计功能&#xff0c;广泛应用于数字电路设计、验证及系统…

JavaWeb--day3--AjaxElement路由打包部署

&#xff08;以下内容全部来自上述课程及课件&#xff09; Ajax &#xff08;此章节纯粹演示&#xff0c;因服务器端url链接失效&#xff0c;所以无法实战&#xff09; 1. 同步与异步 同步&#xff1a; 浏览器页面在发送请求给服务器&#xff0c;在服务器处理请求的过程…