PHP反序列化_1

目录

一、基本概念

1. 序列化

2. 反序列化

二、反序列化漏洞

1. 漏洞产生原因

2. 魔术方法

3.利用魔术方法进行攻击的示例:


一、基本概念

什么是 PHP 反序列化

  • PHP 反序列化是将序列化后的字符串恢复为原始 PHP 数据类型(如对象、数组等)的过程。序列化是把数据结构转化为可存储或传输的字符串格式,而反序列化则是其逆操作,将这个字符串重新转换回原来的数据结构,以便在程序中继续使用。

1. 序列化-serialize() 函数

序列化在 PHP 中是一种将复杂数据结构转换为字符串以便存储或传输的重要机制。它使得可以轻松地保存和恢复对象、数组等数据类型。

通过使用 serialize() 函数实现、例如:

$arr = array('key1' => 'value1', 'key2' => 'value2');
$serializedData = serialize($arr);
echo $serializedData; 
// 输出:a:2:{s:4:"key1";s:6:"value1";s:4:"key2";s:6:"value2";}
  • 序列化的过程

    • php中的serialize()函数负责将给定的数据结构转换为序列化字符串。例如,对于一个包含多个键值对的关联数组,序列化后的字符串会清晰地展示每个键值对的表示形式。序列化的格式通常以特定的字符开头,后面跟着数据结构的描述信息。例如,对于数组,通常以a:开头,接着是数组元素的数量,然后是一系列键值对的描述。如一个简单的数组$arr = array('name' => 'John', 'age' => 30);,序列化后可能是a:2:{s:4:"name";s:4:"John";s:3:"age";i:30;}。其中,a:2表示这是一个包含两个元素的数组,s:4:"name";s:4:"John"表示键为长度为 4 的字符串name,对应的值为长度为 4 的字符串Johns:3:"age";i:30表示键为长度为 3 的字符串age,对应的值为整数 30。
    • 对于对象的序列化,会包含对象的类名以及各个属性的信息。如果对象的类中定义了魔术方法,这些方法也会在序列化过程中被考虑进去,但通常不会直接体现在序列化后的字符串中,而是在反序列化时根据特定的规则触发相应的魔术方法执行。
  • 序列化的用途

    • 数据存储:在需要将数据保存到文件、数据库或其他持久存储介质时,序列化可以将复杂的数据结构转换为易于存储的字符串形式。例如,在一个用户信息管理系统中,可以将用户对象序列化后存储到数据库中,以便在需要时恢复用户的状态。
    • 网络传输:当需要在不同的系统或组件之间传输数据时,序列化可以确保数据以一种通用的格式进行传输。例如,在一个分布式应用中,客户端可以将请求数据序列化后发送给服务器,服务器再将接收到的序列化数据反序列化以处理请求。
2. 反序列化-unserialize() 函数

反序列化则是将序列化后的字符串还原为原始数据结构的操作,使用 unserialize() 函数。例如:

$serializedData = 'a:2:{s:4:"key1";s:6:"value1";s:4:"key2";s:6:"value2";}';
$originalArr = unserialize($serializedData);
print_r($originalArr); 
// 输出:Array ( [key1] => value1 [key2] => value2 )
  • 反序列化的过程

    • php 中的unserialize()函数用于执行反序列化操作。它接受一个序列化后的字符串作为参数,并尝试将其转换回原始的数据结构。在反序列化过程中,PHP 解析器会根据序列化字符串的格式,逐步还原出数据结构的各个部分。对于数组,会根据字符串中的键值对信息重新构建数组。对于对象,会根据类名创建对象,并恢复对象的属性值。如果序列化字符串中包含对象的引用,反序列化过程也会正确处理这些引用,确保恢复后的对象之间的关系与序列化前一致。
    • 例如,对于前面序列化得到的字符串a:2:{s:4:"name";s:4:"John";s:3:"age";i:30;},使用unserialize()函数后,将得到原始的数组array('name' => 'John', 'age' => 30)
  • 反序列化的用途

    • 数据恢复:从数据库或文件中读取先前存储的序列化数据,并将其反序列化以恢复数据的原始状态。例如,在一个电子商务网站中,用户的购物车信息可以在用户登录时从数据库中读取并反序列化,以便继续上次的购物流程。
    • 网络通信:在接收来自其他系统的序列化数据时,进行反序列化以获取原始的数据结构,以便进行进一步的处理。例如,在一个微服务架构中,服务之间的通信可能会涉及到序列化和反序列化数据。

二、反序列化漏洞

1. 漏洞产生原因

PHP 反序列化漏洞主要是由于应用程序在处理用户输入的序列化数据时没有进行充分的验证和过滤,导致攻击者可以构造恶意的序列化数据来执行任意代码或进行其他恶意操作。

  • 用户输入的不可信性

    • 在很多应用程序中,用户可以通过各种方式提供数据,这些数据可能会被序列化和反序列化。例如,用户提交的表单数据、从外部 API 接收的数据或者从文件中读取的数据。如果应用程序没有对这些数据进行严格的验证,攻击者就可以构造恶意的序列化数据并将其提交给应用程序进行反序列化。
    • 例如,一个社交网络应用允许用户上传自定义的头像图片,并将图片的元数据(如尺寸、格式等)序列化后存储在数据库中。如果攻击者能够篡改上传的图片元数据,使其包含恶意的序列化数据,那么当应用程序从数据库中读取并反序列化这些数据时,就可能触发漏洞。
  • 危险的反序列化操作

    • 当应用程序在反序列化过程中执行了一些敏感操作时,就可能存在安全风险。例如,如果一个类的魔术方法(如__wakeup()__destruct()等)中包含了危险的操作,如执行系统命令、访问敏感文件或进行数据库操作,而应用程序又对用户输入的序列化数据进行反序列化,那么攻击者就可以构造恶意的序列化数据来触发这些危险操作。
    • __destruct()方法为例,这个方法在对象被销毁时自动调用。如果一个类的__destruct()方法中包含了执行系统命令的代码,攻击者可以构造一个包含该类对象的序列化字符串,并通过某种方式让应用程序反序列化这个字符串。当应用程序销毁这个对象时,就会执行__destruct()方法中的恶意代码。
2. 魔术方法

在 PHP 中,魔术方法是一些以双下划线开头和结尾的特殊方法,它们在特定的情况下会自动被调用。在反序列化过程中,一些魔术方法可能会被恶意利用来执行攻击代码。

  • 常见的魔术方法及其作用

    • __construct():在对象创建时调用。通常用于初始化对象的属性。在反序列化过程中,如果一个类定义了__construct()方法,并且反序列化的对象是该类的实例,那么在反序列化完成后,会自动调用这个方法。攻击者可以通过构造恶意的序列化数据,使得在反序列化过程中创建的对象的__construct()方法执行恶意代码。
    • __destruct():在对象销毁时调用。这个方法可以用于释放资源或执行一些清理操作。如果一个类的__destruct()方法中包含了危险的操作,如执行系统命令或访问敏感文件,攻击者可以通过反序列化包含该类对象的序列化数据,然后等待对象被销毁时触发__destruct()方法中的恶意代码。
    • __wakeup():在使用unserialize()时自动调用。这个方法通常用于在反序列化过程中重新初始化对象的属性或执行一些其他的操作。攻击者可以在类的__wakeup()方法中插入恶意代码,当应用程序反序列化包含该类对象的序列化数据时,就会执行__wakeup()方法中的恶意代码。
    • __sleep():在使用serialize()时调用。这个方法可以用于指定在序列化过程中需要保存哪些属性,或者进行一些其他的准备工作。攻击者可以通过分析类的__sleep()方法,了解哪些属性会被序列化,然后构造恶意的序列化数据来修改这些属性的值,从而在反序列化后执行恶意操作。
  • 3.利用魔术方法进行攻击的示例
    • 以下是一个利用__destruct()方法进行攻击的示例代码:
class EvilClass {
    public function __destruct() {
        // 恶意代码,比如执行系统命令
        system('rm -rf /'); 
    }
}

$evilObj = new EvilClass();
$serializedEvil = serialize($evilObj);
// 假设这里攻击者可以控制传入 unserialize 的数据
unserialize($serializedEvil); 

在这个例子中,EvilClass类的__destruct()方法中包含了执行危险系统命令的代码。如果攻击者能够将序列化后的$evilObj对象传递给应用程序进行反序列化,那么当对象被销毁时,就会执行__destruct()方法中的恶意代码,删除系统中的所有文件。

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

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

相关文章

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档:https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask,Django,其它 您可以挂载多个 WSGI 应用,正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

gdb调试redis。sudo

1.先启动redis-server和一个redis-cli。 2.ps -aux|grep reids查看redis相关进程。 3.开始以管理员模式附加进程调试sudo gdb -p 2968.注意这里不能不加sudo,因为Redis 可能以 root 用户启动,普通用户无法附加到该进程。否则就会出现可能下列情形&#…

Python安装(ubuntu)

一:安装指定版本的python python3 --version直接返回ubuntu自带的3.8.10的版本 radarswradarsw-Precision-5560:~$ python3 --version Python 3.8.10通过指令直接安装,会报错如下; radarswradarsw-Precision-5560:~$ sudo apt install python3.11 正在…

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5 1. 安装 Oracle Database 23ai2. 连接 Oracle Database 23c3. 重启启动后,手动启动数据库4. 重启启动后,手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开…

在VMware虚拟机环境下识别U盘

文章目录 前言一、在自己的计算机上(非虚拟机)按【winR】键→输入【services.msc】→点击【确定】二、找到服务名称为【VMware USB Arbitration Service】确保为启动状态三、VMware虚拟机设置四、启动虚拟机系统,插入U盘查看是否能识别到U盘 …

数据库范式、MySQL 架构、算法与树的深入解析

一、数据库范式 在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端&#…

Leetcode 存在重复元素II

这段代码的算法思想可以用以下步骤来解释: 算法思想 使用哈希表(HashMap)存储每个元素的索引: 遍历数组 nums 时,使用一个 HashMap 来记录每个元素的值和它的索引位置。这样可以快速查找之前出现过的相同元素的索引。…

Vue3.js - 一文看懂Vuex

1. 前言 Vuex 是 Vue.js 的官方状态管理库,用于在 Vue 应用中管理组件之间共享的状态。Vuex 适用于中大型应用,它将组件的共享状态集中管理,可以避免组件间传递 props 或事件的复杂性。 2. 核心概念 我们可以将Vuex想象为一个大型的Vue&…

面试编程题目(一)细菌总数计算

题目如图: 第一题: import lombok.AllArgsConstructor; import lombok.Data;import java.util.Arrays; import java.util.Collections; import java.util.List;/*** description: 细菌实体类* author: zhangmy* Version: 1.0* create: 2021-03-30 11:2…

基于Qt/C++与OpenCV库 实现基于海康相机的图像采集和显示系统(工程源码可联系博主索要)

本文将梳理一个基于 Qt 和 OpenCV 实现的海康相机图像采集 Demo。该程序能够实现相机连接、参数设置、图像采集与显示、异常处理等功能,并通过 Qt 界面展示操作结果。 1. 功能概述 该程序使用 Qt 的 GUI 作为界面,OpenCV 作为图像处理库,通…

网络基础Linux

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 网络传输流程图 ​编辑 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址 笔记(画的图) 协议&#x…

大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

性能调优专题(12)之垃圾收集器ParNewCMS与底层三色标记算法详解

一、垃圾收集算法 1.1 分代收集理论 当前虚拟机的垃圾收集器都采用分代收集理论,只是根据对象存活周期的不同将内存分为几块。一般Java将堆分为新生代和老年代,这样子我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比如在新生代中,每…

JAVA学习日记 ArrayList+LinkedList+迭代器源码分析

一、ArrayList 底层原理: ①利用空参构造的集合,在底层创建一共默认长度为0的数组 ②添加第一个元素时,底层会创建一个新的长度为10的数组 ③存满时,会扩容1.5倍 ④如果一次添加多个元素,1.5倍放不下,…

python+pptx:(二)添加图片、表格、形状、模版渲染

目录 图片 表格 合并单元格 填充色、边距 写入数据 形状 模版渲染 上一篇:pythonpptx:(一)占位符、文本框、段落操作_python输出ppt母版占位符标号-CSDN博客 from pptx import Presentation from pptx.util import Cm, In…

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整,全面重新设计业务逻辑代码,代码量减少一半以上,开发更加高效。全系统引入全新字体图标,整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar,让开发更加…

力扣经典面试题

1.本题的目标是判断字符串ransomNote是否由字符串magazine中的字符构成,且由magazine中的每个字符只能在ransomNote中使用一次 2.采用的方法是通过一个字典cahr_countl来统计magazine字符串中每个字符出现的次数 3.然后遍历ransomNote字符串,对于其中的…

安卓aosp15手机上如何离线获取winscope文件

背景: 针对winscope在aosp14高版本的抓取环境搭建问题,前面文章已经给大家一篇业界独家干货文章: android 14版本的winscope编译使用-手把手教你编译成功不报错 这篇文章搭建的winscope的方式同样适用于aosp15版本,只需要使用最新…

【机器学习入门】(1) 线性回归算法

学习目标: 线性回归是一种基本的统计学习方法,主要用于分析一个或多个自变量与因变量之间的线性关系。以下是关于线性回归的一些关键点:线性回归的四要素: (1)假设(hypothesis);(2&…

基于MATLAB身份证号码识别

课题介绍 本课题为基于连通域分割和模板匹配的二代居民身份证号码识别系统,带有一个GUI人机交互界面。可以识别数十张身份证图片。 首先从身份证图像上获取0~9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像…