PHP序列化/反序列化漏洞原理
PHP反序列化原理详解
引言
PHP反序列化是PHP中一个重要的概念,它允许将序列化后的数据重新转换为原始的数据结构。在PHP中,可以使用serialize()函数将数据序列化为字符串,然后使用unserialize()函数将序列化后的字符串反序列化为原来的数据结构。这个过程在数据存储、传输和对象持久化等方面起着关键作用。然而,不当使用反序列化可能导致安全漏洞,因此理解其原理和正确使用方法至关重要。
原理
- 序列化: PHP中的serialize()函数用于将数据(如数组、对象)转换为字符串格式,以便存储或传输。序列化后的字符串包含数据类型和值的信息。
- 反序列化: unserialize()函数用于将序列化后的字符串转换回PHP值,如数组或对象。在反序列化过程中,PHP根据序列化字符串中的信息重新构建原始数据结构。
PHP序列化原理演示
序列化
<?php
class Test {// 声明属性public $publicVar = "public value";private $privateVar = "private value";protected $protected = "protected value";// 声明方法public function printVar() {echo $this->publicVar . "\n";echo $this->privateVar . "\n";echo $this->protected . "\n";}
}$test = new Test();
$test->printVar();$testSerial = serialize($test);
echo $testSerial;
当一个方法在类定义内部被调用时,有一个可用的伪变量 t h i s 。 this。 this。this 是一个到当前对象的引用。
运行结果
public value
private value
protected value
O:4:"Test":3:{s:9:"publicVar";s:12:"public value";s:16:"TestprivateVar";s:13:"private value";s:12:"*protected";s:15:"protected value";}
将序列化之后的值格式化来分析
O:4:"Test":3:{s:9:"publicVar";s:12:"public value";s:16:"TestprivateVar";s:13:"private value";s:12:"*protected";s:15:"protected value";
}
O:4:"Test":3:{
:这表示一个对象(O
),其类名长度为4("Test"
),并且有3个属性。- 第一个属性:
s:9:"publicVar";
:这是一个字符串(s
),长度为9,内容为"publicVar"
,表示属性名。s:12:"public value";
:这是一个字符串,长度为12,内容为"public value"
,表示公共属性的值。
- 第二个属性:
s:16:"TestprivateVar";
:这是一个字符串,长度为16,内容为"TestprivateVar"
,表示私有属性的名称。在PHP中,私有属性在序列化时会以类名作为前缀。s:13:"private value";
:这是一个字符串,长度为13,内容为"private value"
,表示私有属性的值。
- 第三个属性:
s:12:"*protected";
:这是一个字符串,长度为12,内容为"*protected"
,表示受保护属性的名称。在PHP中,受保护属性在序列化时会以星号(*
)作为前缀。s:15:"protected value";
:这是一个字符串,长度为15,内容为"protected value"
,表示受保护属性的值。
- 第一个属性:
公共属性很好理解,但私有属性和保护属性就不一样了
protected:受保护成员只能在其定义的类及其子类中访问。
序列化后属性名 \x00\*\x00属性名
**private:**私有成员只能在其定义的类内部访问,不能在子类或类外部访问。
序列化后属性名 \x00类名\x00属性名
注意:浏览器输出默认不显示\x00
PHP序列化字符串中使用的类型标识符及其对应的数据类型
类型标识符 | 数据类型 | 描述 |
---|---|---|
s | 字符串(String) | 表示一个字符串,例如 s:5:"hello" 。 |
i | 整数(Integer) | 表示一个整数,例如 i:123 。 |
d | 浮点数(Double) | 表示一个浮点数,例如 d:3.14 。 |
b | 布尔值(Boolean) | 表示一个布尔值,b:1 表示 true,b:0 表示 false。 |
a | 数组(Array) | 表示一个数组,例如 a:2:{i:0;s:5:"apple";i:1;s:6:"banana"} 。 |
O | 对象(Object) | 表示一个对象,例如 O:6:"MyClass":1:{s:3:"foo";s:5:"bar"} 。 |
N | NULL值 | 表示 NULL 值,例如 N; 。 |
r | 引用(Reference) | 表示指向当前对象中的引用,例如 r:2; 。 |
R | 引用(Reference) | 表示指向序列化数据中另一个对象的引用,例如 R:3; 。 |
C | 自定义序列化(Custom serialization) | 表示自定义序列化的对象,例如 C:6:"MyClass":0:{} 。 |
魔术方法
魔术方法是一种特殊的方法,当对对象执行某些操作时会覆盖 PHP 的默认操作。
魔术方法 | 功能描述 |
---|---|
__construct() | 构造方法,在对象创建时自动调用。 |
__destruct() | 析构方法,在对象被销毁前自动调用。 |
__call() | 在调用不可访问的方法时自动调用。 |
__callStatic() | 在静态上下文中调用不可访问的方法时自动调用。 |
__get() | 在读取不可访问的属性时自动调用。 |
__set() | 在设置不可访问的属性时自动调用。 |
__isset() | 在使用isset() 或empty() 检测不可访问的属性时自动调用。 |
__unset() | 在使用unset() 销毁不可访问的属性时自动调用。 |
__sleep() | 在序列化对象之前自动调用,用于清理对象或返回一个包含要序列化的属性名的数组。 |
__wakeup() | 在反序列化对象之后自动调用,用于重建对象。 |
__serialize() | 自定义序列化逻辑,返回一个数组,包含要序列化的属性和值。PHP 7.4+ |
__unserialize() | 自定义反序列化逻辑,接收一个数组,包含序列化的属性和值。PHP 7.4+ |
__toString() | 在尝试将对象转换为字符串时自动调用。返回对象的字符串表示。 |
__invoke() | 当尝试将对象作为函数调用时自动调用。 |
__set_state() | 在使用var_export() 导出类时,此静态方法会被调用,用于恢复类的属性。 |
__clone() | 在对象被复制时自动调用,用于自定义克隆逻辑。 |
__debugInfo() | 在使用var_dump() 打印对象时自动调用,用于提供调试信息。PHP 5.6+ |
<?php
class Test {// 声明属性public $publicVar = "public value";private $privateVar = "private value";protected $protected = "protected value";// 声明方法public function printVar() {echo $this->publicVar . "\n";echo $this->privateVar . "\n";echo $this->protected . "\n";}public function __wakeup() {echo '__wakeup';}
}$test = new Test();
$test->printVar();$testSerial = serialize($test);
echo $testSerial;
echo "\n";
unserialize($testSerial);
可以看到运行最后调用了 __wakeup
魔术方法
public value
private value
protected value
O:4:"Test":3:{s:9:"publicVar";s:12:"public value";s:16:" Test privateVar";s:13:"private value";s:12:" * protected";s:15:"protected value";}
__wakeup
如果__wakeup方法中有高敏感度代码,例如命令执行等,可能会导致意外的风险
例如:
<?php
class Test {public $cmd = '';public function __wakeup() {system($this->cmd);}
}unserialize($_GET['data']);
传入?data=O:4:"Test":1:{s:3:"cmd";s:2:"id";}
即可成功返回命令执行结果
相关文章:
PHP序列化/反序列化漏洞原理
PHP反序列化原理详解 引言 PHP反序列化是PHP中一个重要的概念,它允许将序列化后的数据重新转换为原始的数据结构。在PHP中,可以使用serialize()函数将数据序列化为字符串,然后使用unserialize()函数将序列化后的字符串反序列化为原来的数据结…...
并查集(力扣2316)
这种涉及不同连通分量的,看上去就可以用并查集。并查集的模板请参见上一篇内容。并查集(力扣1971)-CSDN博客 现在我们要求的是无法互相到达的点对。根据观察易得,我们只需要求出每个并查集的元素数量,然后遍历每个点&…...
【web服务_负载均衡Nginx】一、Nginx 基础与核心概念解析
一、Nginx 概述:从起源到行业地位 Nginx(发音为 “engine x”)是一款高性能的开源 Web 服务器、反向代理服务器,同时具备负载均衡、内容缓存、TCP/UDP 代理及邮件代理等功能。它由俄罗斯工程师伊戈尔・赛索耶夫(Igo…...
【Python入门】文件读取全攻略:5种常用格式(csv/excel/word/ppt/pdf)一键搞定 | 附完整代码示例
大家好,我是唐叔!今天给大家带来一篇Python文件读取的终极指南。无论是数据分析、办公自动化还是爬虫开发,文件读取都是Python程序员必须掌握的核心技能。本文将详细介绍Python处理5大常用文件格式的方法,包含完整可运行的代码示例…...
考研系列-计算机网络冲刺考点汇总(下)
写在前面 本文将总结王道408考研课程的计算机网络冲刺考点的第四章到第六章内容(网络层、传输层、应用层)。 第四章、网络层 1.SDN SDN的基本概念 注意对应关系:数据平面-转发;控制平面-路由选择 2.路由选择算法 (1)RIP协议-基于…...
GitLab-CI集成FTP自动发布
简介 在某些场景下,代码是以 FTP 的方式部署到服务器上,那么我们可以使用 GitLab-CI 来实现自动发布。 配置参考 .sftp-deploy: &sftp-deploy |-files$(git log -10 --prettyformat: --name-only | grep -v ^$ | sort -u)include_patterns$(echo …...
Ubuntu 安装cuda踩坑记录
Ubuntu 安装cuda踩坑记录: 运行run文件时出错: sh cuda_12.4.0_550.54.14_linux.run 报错: ./cuda-installer: error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such file or directory 解决&am…...
用GitHub Actions实现CI/CD
目录 简介GitHub Actions基础工作流配置文件实战案例 Node.js应用Python应用Docker容器构建与部署 最佳实践常见问题与解决方案总结 简介 持续集成/持续部署(CI/CD)已成为现代软件开发不可或缺的一部分。它通过自动化构建、测试和部署过程,帮助开发团队更快、更可…...
使用AI工具打造专业级PPT的完整方案,结合 DeepSeek构思、Kimi生成内容、Napkin优化设计 等工具,分阶段详细说明流程及工具使用
以下是使用AI工具打造专业级PPT的完整方案,结合 DeepSeek构思、Kimi生成内容、Napkin优化设计 等工具,分阶段详细说明流程及工具使用: 一、全流程阶段划分 阶段目标核心工具1. 构思阶段明确主题、结构、核心信息,生成大纲与逻辑…...
【数据结构】线性表( List)和 顺序表(ArrayList)
【数据结构】线性表( List)和 顺序表(ArrayList) 一、线性表 List二、List 接口的常用方法三、ArrayList与顺序表3.1 引入顺序表的原因?3.2 ArrayList 的使用3.2.1 ArrayList 的创建3.2.2 添加元素:list.ad…...
嵌入式开发--STM32软件和硬件CRC的使用--续篇
本文是《嵌入式开发–STM32软件和硬件CRC的使用》的续篇,又踩到一个坑,发出来让大家避一下坑。 按照G0系列的设置,得出错误的结果 前文对应的是STM32G0系列,今天在用STM32G4系列时,按照前文的设置,用硬件…...
探索鸡养殖虚拟仿真实验:科技赋能养殖新体验
在科技飞速发展的今天,虚拟仿真技术逐渐渗透到各个领域,就连传统的养殖业也迎来了数字化的变革。最近,我参与了一场别开生面的鸡养殖虚拟仿真实验,不仅学到了专业的养殖知识,还收获了前所未有的沉浸式体验。现在&#…...
知识图谱中医知识问答系统|养生医案综合可视化系|推荐算法|vue+flask+neo4j+mysql
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! ✅编号 :F040 pro ✅技术架构: vueflaskmysqlneo4jltpac ✅实现功能:实现基于中医药材和药方的知识图谱可视化,在…...
【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
AI 模型高效化:推理加速与训练优化的技术原理与理论解析
AI 模型高效化:推理加速与训练优化的技术原理与理论解析 文章目录 AI 模型高效化:推理加速与训练优化的技术原理与理论解析一、推理加速:让模型跑得更快的“程序员魔法”(一)动态结构自适应推理:像人类一样…...
python学习—详解word邮件合并
系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—循环语句-控制流 python学习—合并多个Excel工作簿表格文件 pytho…...
vscode与vim+cscope+tags热键冲突
[ctrl w] s 对于vim时水平分割窗口热键 对vscode, [ctrl w]时关闭当前窗口热键 在vscode中如下配置可以发送热键到shell, 跳过vscode:...
直播系统源码开发:解锁幸运礼物功能的商业魔力与运营策略
在当今如火如荼的直播经济中,幸运礼物功能已成为平台提升用户黏性、刺激消费的"黄金按钮"。山东布谷科技将深入剖析幸运礼物功能的技术逻辑与商业价值,并为运营者提供一套完整的策略框架,帮助您在激烈的直播赛道中脱颖而出。 一、…...
毕业设计效率提升工具与避坑指南
本文为毕业设计后的经验记录,包含写作过程中的一些实用工具和注意事项。 一、📌实验及写作实用技巧二、🚀 效率提升工具三、📊论文完成后的格式检查 本文为毕业设计后的经验记录,包含写作过程中的一些实用工具和注意事…...
Python网络爬虫设计(二)
目录 六、BeautifulSoup库 1、常见的提取分析网页内容的三种方式 (1)正则表达式 (2)BeautifulSoup库 (3)pyppeteer库中的元素查找函数 2、HTML中的tag 3、BeautifulSoup库的安装和导入 4、Beautiful…...
滑动窗口209. 长度最小的子数组
1.题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&…...
如何避免被目标网站识别为爬虫?
文章目录 前言1. 合理设置请求头2. 控制请求频率3. 模拟真实用户行为4. 使用代理 IP5. 处理验证码6. 会话管理 前言 为避免被目标网站识别为爬虫,可从请求头设置、请求频率控制、模拟用户行为、使用代理、处理验证码和会话管理等多个方面采取措施,以下是…...
Dell戴尔服务器 PowerEdge R750xs + window server2012r2 || 2016
因要求需要给新服务器装个 win server2012或者2016系统 XXX使用U盘制作PE系统U盘安装系统不行,适合普通win8,win10,win11U盘制作PE系统U盘安装win10系统教程U盘制作PE系统U盘安装win10系统教程https://mp.weixin.qq.com/s/t0W8aNJaHPAU8T78nh…...
如何通过数据分析提升软件开发项目的成功率?
引言 在软件开发中,项目延期、超预算、需求反复变更等问题屡见不鲜。数据分析作为项目管理的重要工具,正在被越来越多的企业用于提升项目成功率。通过科学利用项目数据,团队可以做出更准确的决策,避免重复踩坑,从而大幅…...
模型的RAG
RAG 什么是RAG 当岳不群相当武林的盟主时候,你的给他一个葵花宝典(秘籍RAG) RAG的原理 建立索引: 首先要清洗和提取原始数据,将 PDF、Docx等不同格式的文件解析为纯文本数据 然后将文本数据分割成更小的片段(chunk)…...
基于多模态双路TCN-SE-YOLO的小目标检测
首先声明:该思路在小目标检测领域尚未有成果发表,感兴趣的小伙伴可以借鉴! 一、引言 1.1 研究背景 小目标检测在交通监控(车牌识别)、工业检测(PCB缺陷)及农业(病虫害斑点)等领域具有重要应用价值传统单模态检测方法在复杂场景下的漏检率高达40%以上(VisDrone 2021…...
idea maven 命令后控制台乱码
首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...
在Vmware15(虚拟机免费) 中安装纯净win10详细过程
一、软件备选 1. VMware15.5.1 网盘下载地址 链接: https://pan.baidu.com/s/1y6GLJ2MG-1tomWblt3otsg?pwdim8e 提取码: im8e 2. windows镜像下载 去官网下载ios包 链接:https://www.microsoft.com/zh-cn/software-download/windows10 二、在VMware15.5.1下安装w…...
RISC-V 与 OpenHarmony 的结合意义与应用建议
RISC-V 与 OpenHarmony 的结合意义与应用建议 一、结合的意义 (一)硬件与软件的协同创新 RISC-V 作为硬件层的开源指令集架构,为 OpenHarmony 提供了强大的硬件支持。这种支持不仅体现在硬件性能的提升上,还为 OpenHarmony 的分…...
让SQL飞起来:搭建企业AI应用的SQL性能优化实战
我上一篇文章已经讲解过了如何使用公开的AI模型来优化SQL.但这个优化方法存在一定的局限性.因为公开的AI模型并不了解你的数据表结构是什么从而导致提供的优化建议不太准确.而sql表结构又是至关重要的安全问题,是不能泄露出去的.所以在此背景下我决定搭建一个自己的AI应用在内网…...
驱动开发硬核特训 · Day 14:深入理解 Power 管理驱动架构与实战应用
在嵌入式系统中,Power(电源)管理驱动既关乎系统稳定性,又直接影响功耗与续航,是系统设计中绕不开的核心模块。今天我们通过理论实战的形式,一次性讲清楚: Linux 中电源管理驱动的核心框架Regul…...
备份思科路由器设备文件实例
实例需求: (1)备份路由器的配置文件startup-config和映像文件 (2)备份交换机的配置文件startup-config和映像文件 注:PC3为TFTP服务器 结构示意图: 实例配置一: 备份路由器的配置文件startup-config和映像文件 步骤: 在PC3上打开tftp服务。确保PC3可以ping通11.1.1.…...
游戏引擎学习第231天
设定当天的主题 我们现在到了一个很少出现在直播中的阶段,但今天是那种需要解释计算机科学基础概念的日子。因此,今天我们将讨论这个内容,今天的重点是“大O表示法”(Order Notation),我将用黑板来解释这些…...
PclSharp ——pcl的c#nuget包
简介: NuGet Gallery | PclSharp 1.8.1.20180820-beta07 下载.NET Framework 4.5.2 Developer Pack: 下载 .NET Framework 4.5.2 Developer Pack Offline Installer 离线安装nupkg: nupkg是visual studio 的NuGet Package的一个包文件 安…...
Java性能剖析工具箱
1. 基础知识 1.1 Java性能调优概述 1.1.1 性能调优的重要性 性能调优是提升系统效率、降低成本和增强用户体验的关键步骤。通过优化,可以减少响应时间、降低资源消耗并提高系统的稳定性和可扩展性。 1.1.2 性能问题的常见表现 高CPU使用率:可能由热点方法或线程阻塞引起。…...
信息学奥赛一本通 1622:Goldbach’s Conjecture | 洛谷 UVA543 Goldbach‘s Conjecture
【题目链接】 ybt 1622:Goldbach’s Conjecture 洛谷 UVA543 Goldbach’s Conjecture 【题目考点】 1. 筛法求质数表 埃筛线性筛(欧拉筛) 知识点讲解见信息学奥赛一本通 2040:【例5.7】筛选法找质数 【解题思路】 首先使用埃…...
408数据结构绪论刷题001
答案:D 解析: • A选项:数据元素是组成数据对象的基本单位 ,它只是数据的基本个体,不能完整定义数据结构,所以A选项错误。 • B选项:数据对象是性质相同的数据元素的集合,仅仅描述…...
RNN - 语言模型
语言模型 给定文本序列 x 1 , … , x T x_1, \ldots, x_T x1,…,xT,语言模型的目标是估计联合概率 p ( x 1 , … , x T ) p(x_1, \ldots, x_T) p(x1,…,xT)它的应用包括 做预训练模型(eg BERT,GPT-3)生成本文ÿ…...
前端面试题---GET跟POST的区别(Ajax)
GET 和 POST 是两种 HTTP 请求方式,它们在传输数据的方式和所需空间上有一些重要区别: ✅ 一句话概括: GET 数据放在 URL 中,受限较多;POST 数据放在请求体中,空间更大更安全。 📦 1. 所需空间…...
【MCP】第一篇:MCP协议深度解析——大模型时代的“神经连接层“架构揭秘
【MCP】第一篇:MCP协议深度解析——大模型时代的"神经连接层"架构揭秘 一、什么是MCP?二、为什么需要MCP?三、MCP的架构四、MCP与AI交互的原理4.1 ReAct(Reasoning Acting)模式4.2 Function Calling 模式 五…...
新生宿舍管理系统
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
@Autowird 注解与存在多个相同类型对象的解方案
现有一个 Student 类,里面有两个属性,分别为 name 和 id;有一个 StuService 类,里面有两个方法,返回值均为类型为 Student 的对象;还有一个 StuController 类,里面有一个 Student 类型的属性&am…...
MQTT客户端核心架构解析:clients.h源码深度解读
MQTT客户端核心架构解析:clients.h源码深度解读 一、头文件概览与设计哲学 clients.h作为MQTT客户端核心数据结构定义文件,体现了以下设计原则: 分层架构:网络层/协议层/业务层解耦状态管理:通过状态机实现复杂协议…...
音视频学习 - ffmpeg 编译与调试
编译 环境 macOS Ventrua 13.4 ffmpeg 7.7.1 Visual Studio Code Version: 1.99.0 (Universal) 操作 FFmpeg 下载源码 $ cd ffmpeg-x.y.z $ ./configure nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.If you think configure made a mistake…...
解读《人工智能指数报告 2025》:洞察 AI 发展新态势
美国斯坦福大学 “以人为本人工智能研究院”(HAI)近日发布的第八版《人工智能指数报告》(AI Index Report 2025)备受全球瞩目。自 2017 年首次发布以来,该报告一直为政策制定者、研究人员、企业高管和公众提供准确、严…...
【嵌入式系统设计师(软考中级)】第一章:计算机系统基础知识(中)
文章目录 3 算术运算和逻辑运算3.1 二进制数运算方法3.2 逻辑代数的基本运算与逻辑表达式化简 4. 计算机组成及工作原理4.1 CPU的组成与工作原理4.1.1 运算器(数据加工中心)4.1.2 控制器(指令指挥中心)4.1.3 计算机指令4.1.4 寻址…...
实时数据处理的革命:Apache Flink 在大数据流处理中的应用
实时数据处理的革命:Apache Flink 在大数据流处理中的应用 在大数据时代,数据的价值不仅仅体现在存储和分析,更重要的是实时处理。传统的批处理模式往往无法满足现代业务对数据的实时性需求,而流式计算技术的兴起,让数据处理从“静态分析”变成了“动态决策”。其中,Apa…...
HttpSessionListener 的用法笔记250417
HttpSessionListener 的用法笔记250417 以下是关于 HttpSessionListener 的用法详解,涵盖核心方法、实现步骤、典型应用场景及注意事项,帮助您全面掌握会话(Session)生命周期的监听与管理: 1. 核心功能 HttpSessionLi…...
基于html实现的课题随机点名
这是一个用于随机点名系统的HTML网页,具有中国古典风格的设计。 下面我将从多个方面详细介绍这个文件: 1. 文件基本信息 文件名:name.html 文件类型:HTML5文档 语言:简体中文(zh-CN) 编码:UTF-8 标题&…...
【KWDB 创作者计划】深度实操体验 KWDB 2.2.0:从安装到实战的全流程解析以及实操体验
一、引言 KWDB 是一款高性能的分布式数据库,支持事务、强一致性和水平扩展。本文将详细介绍如何通过 Docker 快速部署 KWDB 2.2.0,并基于实际操作演示数据库的核心功能,涵盖环境准备、容器运行、数据操作及集群部署等关键环节。 二、Docker…...