PHP反序列化_1

news2024/11/14 4:22:18

目录

一、基本概念

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()方法中的恶意代码,删除系统中的所有文件。

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

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

相关文章

Android 开发指南:初学者入门

Android 是全球最受欢迎的移动操作系统之一,为开发者提供了丰富的工具和资源来创建各种类型的应用程序。本文将为你提供一个全面的入门指南,帮助你从零开始学习 Android 开发。 目录 1. 了解 Android 平台[1]2. 设置开发环境[2]3. 学习基础知识[3]4. 创…

每日小练:Day2

1.乒乓球筐 题目链接:乒乓球筐__牛客网 题目描述: 这道题主要考察B盒是不是A盒的子集,我们可以通过哈希表来做 单哈希表 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stat…

Java反序列化之CommonsCollections4、5、7 链的学习

一、前言 前面的文章中,基本把CC链的关键部分学习的差不多了,利用过程也是比较清晰了,接下来把 CommonsCollections 4、5、7 利用链学习下,扩展下思路 二、CommonsCollections4 利用链的学习 运行环境: java 1.8.0_71…

A030-基于Spring boot的公司资产网站设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

qt QVideoWidget详解

1. 概述 QVideoWidget是Qt框架中用于视频播放的控件。它继承自QWidget,并提供了与QMediaPlayer等多媒体播放类集成的功能。QVideoWidget可以嵌入到Qt应用程序的用户界面中,用于显示视频内容。它支持多种视频格式,并提供了基本的视频播放控制…

PG逻辑复制的REPLICA IDENTITY几种设置

前两天同事问了一个PG的错误,创建一张普通表,insert插入正常,但是执行update和delete时,提示这个错误, 代码语言:javascript 复制 SQL 错误 [55000]: ERROR: cannot delete from table "temp_tb&qu…

Flutter 小技巧之 Shader 实现酷炫的粒子动画

在之前的《不一样的思路实现炫酷 3D 翻页折叠动画》我们其实介绍过:如何使用 Shader 去实现一个 3D 的翻页效果,具体就是使用 Flutter 在 3.7 开始提供 Fragment Shader API ,因为每个像素都会过 Fragment Shader ,所以我们可以通…

<项目代码>YOLOv7 草莓叶片病害识别<目标检测>

YOLOv7是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv7具有更高的…

一文读懂什么是RAG?附MindSpore和MindNLP实现的TinyRAG框架

什么是RAG? 首先我们给出RAG的定义:RAG(Retrieval-Augmented Generation)技术是一种结合了信息检索(Retrieval)和生成式模型(Generation)的人工智能方法。对于用户的Query&#xff…

字节、快手、Vidu“打野”升级,AI视频小步快跑

文|白 鸽 编|王一粟 继9月份版本更新之后,光锥智能从生数科技联合创始人兼CEO唐家渝朋友圈获悉,Vidu大模型将于本周再次进行版本升级,Vidu-1.5版本即将上线。 此版本更新方向仍是重点延伸大模型的泛化能力和主体…

matlab建模入门指导

本文以水池中鸡蛋温度随时间的变化为切入点,对其进行数学建模并进行MATLAB求解,以更为通俗地进行数学建模问题入门指导。 一、问题简述 一个煮熟的鸡蛋有98摄氏度,将它放在18摄氏度的水池中,五分钟后鸡蛋的温度为38摄氏度&#x…

React Query在现代前端开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 引言 React Query …

汇总常用的114款AI视频创作工具,堪称运营神器,收藏备用!

随着AI工具的使用起来起广泛,国内各个互联网大厂都开始在圈内出围。过去我们写文案、做视频、拍视频、剪辑视频、画漫画、处理图片等,都需要手工一点一点地精雕细琢。现在通过AI工具,零基础也能做出很多精致的作品。 前面我在上个月的28号分…

在vue中,完成@wangeditor/editor组件的大数据量加载,解决卡顿

背景 简单说一下需求,一个页面中只存在一个Editor组件,但是需要通过选择不同类型展示不同的content的数据,不过直接通过提供的Editor组件加载的时候,在数据量大(测试数据226KB)的情况下, 切换类…

通义千问API调用测试 (colab-python,vue)

文章目录 代码(来自官网)colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面,点击API示例 前端调用直接在前端调用的优缺点以vue为例(代码是基于官网node.js的代码转换而来&#xf…

使用 Elasticsearch 构建食谱搜索(一)

作者:来自 Elastic Andre Luiz 了解如何使用 Elasticsearch 构建基于语义搜索的食谱搜索。 简介 许多电子商务网站都希望增强其食谱搜索体验。正确使用语义搜索可以让客户根据更自然的查询(例如 “something for Valentines Day - 情人节的礼物” 或 “…

微服务各组件整合

nacos 第一步&#xff0c;引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> 第二步&#xff0c;增加配置 spring:application:name: …

【大数据学习 | HBASE高级】hive操作hbase

一般在查询hbase的数据的时候我们可以直接使用hbase的命令行或者是api进行查询就行了&#xff0c;但是在日常的计算过程中我们一般都不是为了查询&#xff0c;都是在查询的基础上进行二次计算&#xff0c;所以使用hbase的命令是没有办法进行数据计算的&#xff0c;并且对于hbas…

modbus协议 Mthings模拟器使用

进制转换 HEX 16进制 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15) dec 10进制 n(16进制) -> 10 abcd.efg(n) d*n^0 c*n^1 b*n^2 a*n^3 e*n^-1 f*n^-2 g*n^-3&#xff08;10&#xff09; 10 -> n(16进制) Modbus基础概念 高位为NUM_H&…

列表(list)

一、前言 本次博客主要讲解 list 容器的基本操作、常用接口做一个系统的整理&#xff0c;结合具体案例熟悉自定义内部排序方法的使用。如有任何错误&#xff0c;欢迎在评论区指出&#xff0c;我会积极改正。 二、什么是list list是C的一个序列容器&#xff0c;插入和删除元素…