php反序列化

php反序列化

声明:本人只是在学习反序列化 因此这篇文章大量参考了https://blog.csdn.net/Hardworking666/article/details/122373938 这位的博客 感谢他的详细文章让我可以详细学习反序列化 大家想看更详细的可以直接参考他的文章!!!

什么是序列化和反序列化

序列化就是将数据格式转化成可以存储和传输的格式,原因是php文件正常执行结束会将文件销毁,那么下一次使用的时候就没有了,因此需要长久保存,就是序列化,也就是是使用serialize()函数.

反序列化就是将可以传输的这种格式恢复成原本的对象,使用unserialize()函数

+++

json 和 php 序列化的关系

json

  • 一种轻量级的数据格式,通常用于前后端的数据传输,api,web开发,源自jsp
  • 人类可读
  • 一种纯文本格式,易于通过HTTP传输

关系

  • json是跨平台,跨语言的 任何支持json语言的都可以读写json数据
  • php序列化只能在php中使用,不嫩那个直接跨语言传输
  • 二者可以互相转化,但需要手动改动

+++

php面向对象编程

  • 面向对象(一种编程思路) : 将程序中的数据和操作方法打包在一起 ,包含对象 类 封装 继承等
    1. 对象 :程序中的基本单位,也是现实中的一个具体事物,例如狗狗是一个对象
    2. 类:它是对象的蓝图:定义了狗的特性(毛色 行为) 也可以由类产生具体对象
    3. 封装:将数据和方法打包载一起,只暴露必要部分,例如你知道踩油门车会动,但是不知道内部结构和工作原理
    4. 继承:就是一个类可以继承另一个类的特性,避免代码重复,例如毛和狗都继承了动物类型
    5. 多态:同一个方法在不同对象有不同表现
<?php
class Test//定义了一个类
public $variable = 'this is a variable' //定义了一个变量
pubilc function PrivateVariable()  //定义了一个方法
$object = new Test();  //创建了一个对象
$object -> PrintVariable();  //创建了一个方法
?>

普及面向过程(c pascal fortran)

  • 将程序看作一系列步骤或者动作的指令,可以将其当成一个菜谱,一步一步完成任务

+++

pubilc protected private

  • php对属性或者方法的访问权限 是通过在前面加关键字实现的 有
    1. public(共有):在任何地方都可以访问
    2. privated(受保护):受保护的类成员可以被其自身或者父类 子类访问
    3. private(私有):私有的类成员只能被其定义的类所访问

注意: (\x00代表空字符 必须占一个位置)

public:属性被序列化后属性值会变为属性名

privated:属性值被序列化后属性值会变成\x00*\x00属性名

privated:属性值被序列化后属性值会变成\x00类名\x00属性名

+++

魔术方法

  • 格式:

两个下划线_开头

  • 函数
__construct()            //类的构造函数,创建对象时触发,用于初始化对象的属性或者执行一些启动工作__destruct()             //类的析构函数,对象被销毁时触发。用来释放资源或执行清理工作__call()                 //当你调用一个对象的不可访问方法时触发。比如调用一个不存在的对象方法。__callStatic()           //当你调用一个静态方法时,但方法不存在时触发。__get()                  //当你访问一个不可访问的属性时触发。比如访问私有属性。__set()                  //当你给一个不可访问的属性赋值时触发。__isset()                //当你调用 isset() 或 empty() 判断不可访问属性时触发。__unset()                //当你用 unset() 删除不可访问属性时触发。__invoke()               //当你试图以函数的方式调用对象时触发__sleep()                //当你将对象序列化时触发,通常用于决定哪些属性应该被序列化。__wakeup()               //当你反序列化对象时触发,用于重新初始化某些状态。__toString()             //当你将对象作为字符串输出时触发。
  • 作用:他们使你能在Php中对类的行为进行精细调控,十分牛逼

从序列化到反序列化

_construct ->__sleep ->__wakeup() -> __toString ()-> __destruct()

<?php
class TestClass
{ 
//一个变量public $variable = 'This is a string';//一个方法 这个方法用于打印变量$variable 的值public function PrintVariable(){echo $this->variable.'<br />';}//构造函数在创建函数时自动调用 public function  __construct(){   //简单输出__constructecho '__construct<br />';}//析构函数在对象被摧毁时自动调用public function __destruct(){ //简单输出__destructecho '__destruct<br />';}//当对象被当作一个字符串,函数调用public function __toString(){return '__toString<br />';}
}
//创建一个对象
//__construct会被调用
$object = new TestClass();
//调用一个方法
//‘This is a string’将会被输出
$object->PrintVariable();
//对象被当作一个字符串
//toString会被调用
echo $object;
//php脚本要结束时,__destruct会被调用
?>

漏洞:

  • 序列化只序列化属性 不序列方法
  • 我们能控制的只有类的属性,攻击者就是寻找合适能被控制的属性

+++

php序列化与反序列化的使用

序列化:

<?php
class User
{//类的数据public $age = 0;   //初始值为0public $name = '';  //初始值为空字符//输出数据的方法public function printdata(){//输出用户的年龄和姓名echo 'User '.$this->name.' is '.$this->age.' years old.<br />';} // “.”表示字符串连接
}
//创建User类的对象
$usr = new User();
//设置数据
$usr->age = 18;
$usr->name = 'Hardworking666';
//调用方法输出数据
$usr->printdata();
//输出序列化后的数据
echo serialize($usr)
?>

输出结果:

User Hardworking666 is 18 years old.
O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}

这里的输出结果第二行就是序列化后的形式:

"o"表示对象,"4"表示对象名长度为4,"User"为对象名,“2”表示有2个参数

“{}”里面是参数的key和value

"s"表示string对象,"3"表示长度,“age”为key,"i"是interger(整数)对象,“18”是value

    • s:3:"age" 表示属性名是 age,长度为 3 个字符。
    • i:18 表示 age 属性的值是一个整数 18
    • s:4:"name" 表示属性名是 name,长度为 4 个字符。
    • s:14:"Hardworking666" 表示 name 属性的值是一个字符串,长度为 14 个字符,内容是 "Hardworking666"

对上述例子进行反序列化

<?php
class User
{//类的数据public $age = 0;public $name = '';//输出数据public function printdata(){echo 'User '.$this->name.' is '.$this->age.' years old.<br />';}
}
//重建对象
$usr = unserialize('O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}');
//输出数据
$usr->printdata();
?>

输出结果:

User Hardworking666 is 18 years old.

序列化格式:

a - array 数组型
b - boolean 布尔型
d - double 浮点型
i - integer 整数型
o - common object 共同对象
r - objec reference 对象引用
s - non-escaped binary string 非转义的二进制字符串
S - escaped binary string 转义的二进制字符串
C - custom object 自定义对象
O - class 对象
N - null 空
R - pointer reference 指针引用
U - unicode string Unicode 编码的字符串

实例代码:

这里会演示PHP中关于序列化和反序列化的一些特别行为,特别是 使用了魔术方法__sleep__wakeup来控制序列化和反序列化过程中的行为,并且定义了__construct__destruct来演示对象创建和销毁时的行为

<?php
class test
{public $variable = '变量反序列化后都要销毁'; // 公共变量public $variable2 = 'OTHER';// 打印变量的方法public function printvariable(){echo $this->variable . '<br />';}// 构造方法,创建对象时调用public function __construct(){echo '__construct' . '<br />';}// 析构方法,销毁对象时调用public function __destruct(){echo '__destruct' . '<br />';}// 在对象反序列化时调用public function __wakeup(){echo '__wakeup' . '<br />';}// 在对象序列化时调用public function __sleep(){echo '__sleep' . '<br />';return array('variable', 'variable2'); // 只序列化这些属性}
}// 创建一个对象,回调用 __construct  这里直接输出construct
$object = new test();  // 输出:__construct// 序列化一个对象,会调用 __sleep
$serialized = serialize($object);  // 输出:__sleep
// 输出序列化后的字符串
print 'Serialized:' . $serialized . '<br />';  // 输出 Serialized:O:4:"test":2:{s:8:"variable";s:24:"变量反序列化后都要销毁";s:8:"variable2";s:5:"OTHER";}// 反序列化对象,会调用 __wakeup
$object2 = unserialize($serialized);  // 输出:__wakeup
// 调用 printvariable,会输出数据
$object2->printvariable();  // 输出:变量反序列化后都要销毁// 脚本结束,会调用 __destruct
?>

输出结果:

__construct       
__sleep
Serialized:O:4:"test":2:{s:8:"variable";s:24:"变量反序列化后都要销毁";s:8:"variable2";s:5:"OTHER";}
__wakeup
变量反序列化后都要销毁
__destruct

+++

php反序列化

原理:

  • 目标是服务器端
  • 攻击者构造一个包含恶意数据的反序列化字符串,例如一个包含特定文件路径的对象属性,或者触发恶意代码的模式方法
  • 攻击者将恶意数据交给服务器(url post请求 cookie)
  • 服务器在反序列时会触发魔术方法 导致恶意操作

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

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

相关文章

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】3.1 NumPy图像大小调整实战

3.1 NumPy图像大小调整实战 目录 #mermaid-svg-uDg4hyooC74c0r2r {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uDg4hyooC74c0r2r .error-icon{fill:#552222;}#mermaid-svg-uDg4hyooC74c0r2r .error-text{fill:#5…

AI 编程工具—Cursor进阶使用 Agent模式

AI 编程工具—Cursor进阶使用 Agent模式 我们在使用Cursor 的是有,在Composer 模式下,提交的是有两种模式 Normal 模式,也就是默认的模式Agent 模式Agent 模式可以帮我们生成代码文件,执行程序,安装依赖,并且完成一些列的工作 这里有个点很重要就是在Agent 模式下,Cur…

在React中使用redux

一、首先安装两个插件 1.Redux Toolkit 2.react-redux 第一步&#xff1a;创建模块counterStore 第二步&#xff1a;在store的入口文件进行子模块的导入组合 第三步&#xff1a;在index.js中进行store的全局注入 第四步&#xff1a;在组件中进行使用 第五步&#xff1a;在组件中…

Leetcode - 周赛434

目录 一、3432. 统计元素和差值为偶数的分区方案二、3433. 统计用户被提及情况三、3434. 子数组操作后的最大频率四、3435. 最短公共超序列的字母出现频率 一、3432. 统计元素和差值为偶数的分区方案 题目链接 本题可以直接模拟&#xff0c;这里再介绍一个数学做法&#xff0…

Linux: 网络基础

1.协议 为什么要有协议&#xff1a;减少通信成本。所有的网络问题&#xff0c;本质是传输距离变长了。 什么是协议&#xff1a;用计算机语言表达的约定。 2.分层 软件设计方面的优势—低耦合。 一般我们的分层依据&#xff1a;功能比较集中&#xff0c;耦合度比较高的模块层…

Spring Boot常用注解深度解析:从入门到精通

今天&#xff0c;这篇文章带你将深入理解Spring Boot中30常用注解&#xff0c;通过代码示例和关系图&#xff0c;帮助你彻底掌握Spring核心注解的使用场景和内在联系。 一、启动类与核心注解 1.1 SpringBootApplication 组合注解&#xff1a; SpringBootApplication Confi…

【大模型理论篇】DeepSeek-R1:引入冷启动的强化学习

1. 背景 首先给出DeepSeek-V3、DeepSeek-R1-Zero、DeepSeek-R1的关系图【1】。 虽然DeepSeek-R1-Zero推理能力很强&#xff0c;但它也面临一些问题。例如&#xff0c;DeepSeek-R1-Zero存在可读性差和语言混杂等问题。为了使推理过程更具可读性&#xff0c;进而推出了DeepSee…

【BUUCTF杂项题】荷兰宽带数据泄露、九连环

一.荷兰宽带数据泄露 打开发现是一个.bin为后缀的二进制文件&#xff0c;因为提示宽带数据泄露&#xff0c;考虑是宽带路由器方向的隐写 补充&#xff1a;大多数现代路由器都可以让您备份一个文件路由器的配置文件&#xff0c;软件RouterPassView可以读取这个路由配置文件。 用…

院校联合以项目驱动联合培养医工计算机AI人才路径探析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下&#xff0c;医疗人工智能作为一个极具潜力的新兴领域&#xff0c;正深刻地改变着传统医疗模式。从疾病的早期诊断、个性化治疗方案的制定&#xff0c;到药物研发的加速&#xff0c;人工智能技术的应用极大地提升了医疗服务…

解读“大语言模型(LLM)安全性测评基准”

1. 引入 OWASP&#xff0c;全称为Open Web Application Security Project&#xff0c;即开放式Web应用程序安全项目&#xff0c;是一个致力于提高软件安全性的非营利国际组织。 由于庞大的规模和复杂的结构&#xff0c;大语言模型也存在多种安全风险&#xff0c;如prompt误导…

【大数据技术】教程03:本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …

Notepad++消除生成bak文件

设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示

CSS布局(一)flex一篇搞定

目录 一、flex布局 1.1. 认识flex布局 1.2. flex布局重要的概念 二、flex container中的属性 2.1.flex-direction 2.2.flex-wrap、flex-flow 2.3.justify-content 2.4.align-items 2.5.align-content 三、 flex item中的属性 3.1.order 3.2.align-self 3.3.flex-gr…

e2studio开发RA2E1(5)----GPIO输入检测

e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…

[吾爱出品]CursorWorkshop V6.33 专业鼠标光标制作工具-简体中文汉化绿色版

CursorWorkshop V6.33 专业鼠标光标制作工具 链接&#xff1a;https://pan.xunlei.com/s/VOIFeq5DFB9FS56Al_mT2EfdA1?pwd7ij4# 产品概述 Axialis CursorWorkshop 是一个专业光标创作工具它在 Windows 下运行&#xff0c;让您轻松创建高质量的静态和动态光标适用于 Windows …

STM32单片机学习记录(2.2)

一、STM32 13.1 - PWR简介 1. PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff1b; &#xff08;2&#xff09;可编程电压监测器&#xff08;…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…

Nacos 的介绍和使用

1. Nacos 的介绍和安装 与 Eureka 一样&#xff0c;Nacos 也提供服务注册和服务发现的功能&#xff0c;Nacos 还支持更多元数据的管理&#xff0c; 同时具备配置管理功能&#xff0c;功能更丰富。 1.1. windows 下的安装和启动方式 下载地址&#xff1a;Release 2.2.3 (May …

【零基础到精通】小白如何自学网络安全

小白人群想学网安但是不知道从哪入手&#xff1f;一篇文章告诉你如何在4个月内吃透网安课程&#xff0c;掌握网安技术 一、基础阶段 1.了解网安相关基础知识 了解中华人民共和国网络安全法、熟知网络安全的相关概念&#xff1a;包括信息安全、风险管理、网络攻防原理、认证与…

架构规划之任务边界划分过程中承接分配

架构师在边界划分的过程中需要做什么事情呢&#xff1f;接下来&#xff0c;我们会讨论一些关于任务分配的 基础假设&#xff0c;以及由这些基础假设而带来的决策路径。 所谓任务边界划分&#xff0c;就是判定某个任务在多个承接方中&#xff0c;应该归属到哪个承接方的过程。…