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 的字符串John,s:3:"age";i:30表示键为长度为 3 的字符串age,对应的值为整数 30。 - 对于对象的序列化,会包含对象的类名以及各个属性的信息。如果对象的类中定义了魔术方法,这些方法也会在序列化过程中被考虑进去,但通常不会直接体现在序列化后的字符串中,而是在反序列化时根据特定的规则触发相应的魔术方法执行。
- php中的
-
序列化的用途:
- 数据存储:在需要将数据保存到文件、数据库或其他持久存储介质时,序列化可以将复杂的数据结构转换为易于存储的字符串形式。例如,在一个用户信息管理系统中,可以将用户对象序列化后存储到数据库中,以便在需要时恢复用户的状态。
- 网络传输:当需要在不同的系统或组件之间传输数据时,序列化可以确保数据以一种通用的格式进行传输。例如,在一个分布式应用中,客户端可以将请求数据序列化后发送给服务器,服务器再将接收到的序列化数据反序列化以处理请求。
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)。
- php 中的
-
反序列化的用途:
- 数据恢复:从数据库或文件中读取先前存储的序列化数据,并将其反序列化以恢复数据的原始状态。例如,在一个电子商务网站中,用户的购物车信息可以在用户登录时从数据库中读取并反序列化,以便继续上次的购物流程。
- 网络通信:在接收来自其他系统的序列化数据时,进行反序列化以获取原始的数据结构,以便进行进一步的处理。例如,在一个微服务架构中,服务之间的通信可能会涉及到序列化和反序列化数据。
二、反序列化漏洞
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()方法中的恶意代码,删除系统中的所有文件。
相关文章:
PHP反序列化_1
目录 一、基本概念 1. 序列化 2. 反序列化 二、反序列化漏洞 1. 漏洞产生原因 2. 魔术方法 3.利用魔术方法进行攻击的示例: 一、基本概念 什么是 PHP 反序列化 PHP 反序列化是将序列化后的字符串恢复为原始 PHP 数据类型(如对象、数组等&#x…...
深度学习在图像识别中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 深度学习在图像识别中的应用 深度学习在图像识别中的应用 深度学习在图像识别中的应用 引言 深度学习概述 定义与原理 发展历程 …...
SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间
SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…...
Leecode刷题C语言之统计好节点的数目
执行结果:通过 执行用时和内存消耗如下: 题目:统计好节点的数目 现有一棵 无向 树,树中包含 n 个节点,按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一个长度为 n - 1 的二维整数数组 edges,其中 edges[i] [ai,…...
webpack5 + vue3 从零配置项目
前言 虽然在实际项目当中很少会从 0 到 1 配置一个项目,毕竟很多重复工作是没有必要的,脚手架将这些重复性的工作进行了整合,方便开发者使用。也正因如此,导致部分开发者过于依赖脚手架,却不清楚其内部的实现流程&…...
Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
案例问题描述 该案例来自一个金融行业客户的问题:他们发现某个应用对一个数据量相对较小的表(仅包含数千条记录)访问时,频繁遇到性能下降的情况。为解决此问题,客户向我们求助进行分析。我们发现这张表有频繁的批量插…...
./mysqld: error while loading shared libraries: libaio.so.1: cannot open sha
mysql:5.6 使用离线方式安装:rpm -ivh --nodeps mysql* ,执行 systemctl start mysqld.service发现启动不了,通过vi /var/log/mysql.log看到如下关键字:libraries: libaio.so.1,之前也是按照网上帖子各种修改都没有解决…...
Qt主线程把数据发给子线程,主线程会阻塞吗
演示: #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…...
前后端、网关、协议方面补充
这里写目录标题 前后端接口文档简介前后端视角对于前端对于后端代码注册路由路由处理函数 关于httpGET/POST底层网络关于前端的获取 路由器网关路由器的IP简介公网IP(WAN IP)私网IP(LAN IP)无线网络IP(WIFI IP)查询路由器私网IP路由器公网IP LAN口与WIFI简介基本原理 手动配置电…...
如何在Mac上切换到JDK 17开发环境
在本文中,我将为您介绍如何在Mac上切换到JDK 17,包括下载和安装JDK 17、设置环境变量、在IntelliJ IDEA中配置项目、修改Maven编译配置,并最终使用mvn clean install重新编译项目。通过这个流程,您可以顺利地将开发环境升级到JDK …...
深入探索 TypeScript:从基础到高级特性
深入探索 TypeScript:从基础到高级特性 一、引言 在现代软件开发领域,TypeScript 已经成为了一种极具影响力的编程语言。它基于 JavaScript,并为其添加了强大的静态类型系统,使得代码在开发阶段就能进行更严格的类型检查&#x…...
Leetcode:118. 杨辉三角——Java数学法求解
题目——Leetcode:118. 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRow…...
SHELL脚本(Linux)
声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)
目录 1.单元测试 实现单元测试的方法: 注意事项: 2.集成测试 需注意事项: 实现集成测试的方法: 如何实现高效且可靠的集成测试: 3.系统测试 实现系统测试的方法: 须知注意事项: 4.验收测试 实现验…...
低代码集成多方API的简单实现
在现代软件开发中,集成多个API服务提供商已成为常见需求。然而,不同的API认证机制和数据格式使得集成过程变得复杂且耗时。为了应对这些挑战,本文将介绍一种低代码解决方案,通过配置化管理和简化的代码逻辑,帮助开发者…...
【测试框架篇】单元测试框架pytest(1):环境安装和配置
一、pytest简介 Pytest是Python的一种单元测试框架,与Python自带的unittest测试框架类似,但是比 unittest框架使用起来更简洁,效率更高。 二、pytest特点 Pytest是一个非常成熟的Python测试框架,主要特点有以下几点: 非常容易…...
Python数据分析NumPy和pandas(二十九、其他Python可视化工具)
与其他开源工具一样,在 Python 中创建图形有很多选项(太多了,无法一一列举)。自 2010 年以来,主要开发工作集中在创建用于在 Web 上发布交互式图形上。例如: Altair、Bokeh 和 Plotly 等工具,可…...
Unity中HDRP设置抗锯齿
一、以前抗锯齿的设置方式 【Edit】——>【Project Settings】——>【Quality】——>【Anti-aliasing】 二、HDRP项目中抗锯齿的设置方式 在Hierarchy中——>找到Camera对象——>在Inspector面板上——>【Camera组件】——>【Rendering】——>【Pos…...
Spring Boot实现文件上传与OSS集成:从基础到应用
目录 前言1. 文件上传的基础实现1.1 前端文件上传请求1.2 后端文件接收与保存 2. 集成第三方OSS服务2.1 准备工作2.2 编写OSS集成代码2.3 修改Controller实现文件上传至OSS 3. 文件上传的扩展:多文件上传与权限控制结语 前言 随着互联网应用的快速发展,…...
Python学习26天
集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num:{num}\nnum数据类型为:{type(num)}") # 求集合中元素个数 print(f"num中元素个数为:{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
