当前位置: 首页 > news >正文

php反序列化漏洞简介

目录

php序列化和反序列化简介

序列化

反序列化

类中定义的属性

序列化实例

反序列化实例

反序列化漏洞

序列化返回的字符串格式

魔术方法和反序列化利用

绕过wakeup

靶场实战

修复方法 


php序列化和反序列化简介

序列化

将对象状态转换为可保持或可传输的格式的过程。

简单的理解:将 PHP 中 对象、类、数组、变量、匿名函数等,转化为字符串,方便保存到数据库或者文件中。

反序列化

反序列化就是再将这个状态信息拿出来使用。(将字符串重新再转化为对象或者其他的状态信息)

简单来说:将这个状态信息转换成原来的对象或者其他原来的格式。

PHP序列化:把对象转化为二进制的字符串,使用serialize()函数 PHP反序列化:把对象转化的二进制字符串再转化为对象,使用unserialize()函数

类中定义的属性

public:属性被序列化的时候属性值会变成 属性名

protected:属性被序列化的时候属性值会变成 \x00*\x00属性名

private:属性被序列化的时候属性值会变成 \x00类名\x00属性名

其中:\x00表示空字符,但是还是占用一个字符位置(空格)

序列化实例

序列化只序列属性,不序列方法

当在 php 中创建了一个对象后,可以通过 serialize() 把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。

<?php
​
// 定义一个简单的类
class Person {public $name='Alice';public $age='25';
​
}
​
// 创建一个Person对象
$person = new Person();
​
// 序列化对象
$serialized_object = serialize($person);
​
// 输出序列化后的字符串
echo $serialized_object
​
?>

输出结果

O:6:"Person":2:{s:4:"name";s:5:"Alice";s:3:"age";s:2:"25";}

反序列化实例

与 serialize() 对应的, unserialize() 可以从已存储的表示中创建 PHP 的值,可以从序列化后的结果中恢复对象( object )

<?php
​
// 定义一个简单的类
class Person {public $name;public $age;
​
}
// 定义要反序列化字符串
$object = 'O:6:"Person":2:{s:4:"name";s:5:"Alice";s:3:"age";s:2:"25";}';
​
// 反序列化字符串为对象
$unserialized_object = unserialize($object);
​
// 输出反序列化后的对象信息
echo "Name: " . $unserialized_object->name . "\n";
echo "Age: " . $unserialized_object->age . "\n";
​
?>

输出结果

Name: Alice Age: 25

反序列化漏洞

本质上 serialize() 和 unserialize() 在 PHP 内部实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。

当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的payload 。当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。

序列化返回的字符串格式

O:<length>:"<class name>":<n>:{<field name 1><field value 1>...<field name n><field value n>}

O:表示序列化的是对象

<length>:表示序列化的类名称长度

<class name>:表示序列化的类的名称

<n>:表示被序列化的对象的属性个数

<field name 1>:属性名

<field value 1>:属性值

$number = 34;
$str = 'uusama';
$bool = true;
$null = NULL;
$arr = array('a' => 1, 'b' => 2);
$cc = new CC('uu', true);
​
var_dump(serialize($number));
var_dump(serialize($str));
var_dump(serialize($bool));
var_dump(serialize($null));
var_dump(serialize($arr));
var_dump(serialize($cc));

输出结果

string(5) "i:34;"
string(13) "s:6:"uusama";"
string(4) "b:1;"
string(2) "N;"
string(30) "a:2:{s:1:"a";i:1;s:1:"b";i:2;}"
string(52) "O:2:"CC":2:{s:4:"data";s:2:"uu";s:8:" CC pass";b:1;}"

序列化对于不同类型得到的字符串格式为:

  • String : s:size:value;

  • Integer : i:value;

  • Boolean : b:value;(保存1或0)

  • Null : N;

  • Array : a:size:

  • Object : O:strlen(object name):object name:object size:

魔术方法和反序列化利用

php 中有一类特殊的方法叫“ Magic function” (魔术方法), 这里我们着重关注一下几个:

__construct()当一个对象创建时被调用,但在 unserialize()时是不会自动调用的。(构造函数)
​
__destruct()当一个对象销毁时被调用
​
__toString()当一个对象被当作一个字符串使用
​
__sleep() 在对象在被序列化之前运行
​
__wakeup将在序列化之后立即被调用

从序列化到反序列化这几个函数的执行过程是:

__construct()` ->`__sleep()` -> `__wakeup()` -> `__toString()` -> `__destruct()

绕过wakeup

CVE-2016-7124:当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行(让n大于原有的对象属性个数)

官方给出的影响版本: PHP5 < 5.6.25

                                      PHP7 < 7.0.10

靶场实战

payload:

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

 

分析代码:

__construct()在序列化的时候会自动调用,反序列化时不会自动调用。

这里着重分析一下if语句

if(!@$unser = unserialize($s)){$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{$html.="<p>{$unser->test}</p>";
}

它的作用如下:

  1. unserialize($s): 这个函数尝试将一个序列化的字符串 ($s) 转换回PHP的值(比如数组、对象等)。如果 $s 不是一个序列化的字符串或在反序列化过程中出现错误,unserialize() 函数会返回 false

  2. @$unser: 这部分使用了错误控制运算符 (@)。它会抑制 unserialize() 可能抛出的任何错误。如果 unserialize() 失败(返回 false),那么 $unser 也会是 false

  3. 若反序列化失败,或者说$s不是一个序列化后的值,unserialize($s)返回falseunser,@用来一直错误输出,!false为真,执行语句$html.="<p>大兄弟,来点劲爆点儿的!</p>";若反序列化成功,unserialize($s)返回trueunser!true为假,执行else后面的语句$html.="<p>{$unser->test}</p>";

因为是直接嵌入html页面中,没有经过过滤,所以可以输入前端代码造成xss攻击。

修复方法 

  • 验证输入: 在接收用户输入并执行反序列化之前,验证输入的合法性和预期格式。可以使用正则表达式或其他方法检查输入是否符合预期的序列化字符串格式。

  • 过滤输出: 在输出反序列化后的对象属性时,确保适当地转义和过滤用户提供的内容,以防止恶意代码执行。可以使用 PHP 的 htmlspecialchars() 函数来转义输出,确保任何 HTML 标签都被安全地显示。

  • 限制反序列化的对象类型: 如果可能的话,尽量避免反序列化不受信任的数据,尤其是复杂的对象结构。可以使用简单的数据结构或者明确指定允许的类名。

 

相关文章:

php反序列化漏洞简介

目录 php序列化和反序列化简介 序列化 反序列化 类中定义的属性 序列化实例 反序列化实例 反序列化漏洞 序列化返回的字符串格式 魔术方法和反序列化利用 绕过wakeup 靶场实战 修复方法 php序列化和反序列化简介 序列化 将对象状态转换为可保持或可传输的格式的…...

力扣随机一题 模拟+字符串

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 1910.删除一个字符串中所有出现的给定子字符串【中等】 题目&#xff1a; …...

java-正则表达式 1

Java中的正则表达式 1. 正则表达式的基本概念 正则表达式&#xff08;Regular Expression, regex&#xff09;是一种用于匹配字符串中字符组合的模式。正则表达式广泛应用于字符串搜索、替换和解析。Java通过java.util.regex包提供了对正则表达式的支持&#xff0c;该包包含两…...

Python xlrd库:读excel表格

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

开发中遇到的一个bug

遇到的报错信息是这样的&#xff1a; java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [hm-api,hm-common,hm-service] are excluded from annotation processing 翻译过来就是存在循环引用的情况&#xff0c;导…...

Java面试题:对比不同的垃圾收集器(如Serial、Parallel、CMS、G1)及其适用场景

Java虚拟机&#xff08;JVM&#xff09;提供了多种垃圾收集器&#xff0c;每种垃圾收集器在性能和适用场景上各有不同。以下是对几种常见垃圾收集器&#xff08;Serial、Parallel、CMS、G1&#xff09;的对比及其适用场景的详细介绍&#xff1a; 1. Serial 垃圾收集器 Serial…...

每日一题——冒泡排序

C语言——冒泡排序 冒泡排序练习 前言&#xff1a;CSDN的小伙伴们&#xff0c;大家好&#xff01;今天我来给大家分享一种解题思想——冒泡排序。 冒泡排序 冒泡法的核心思想&#xff1a;两两相邻的元素进行比较 2.冒泡排序的算法描述如下。 (1)比较相邻的元素。如果第一 个比…...

javascript浏览器对象模型

BOM对象&#xff1a; BOM 是浏览器对象模型的简称。JavaScript 将整个浏览器窗口按照实现的功能不同拆分成若干个对象&#xff1b; 包含&#xff1a;window 对象、history 对象、location 对象和 document 对象等 window对象&#xff1a; 常用方法&#xff1a; 1.prompt();…...

C语言之链表以及单链表的实现

一&#xff1a;链表的引入 1&#xff1a;从数组的缺陷说起 &#xff08;1&#xff09;数组有两个缺陷。一个是数组中所有元素类型必须一致&#xff0c;第二是数组的元素个数必须事先指定并且一旦指定后不能更改 &#xff08;2&#xff09;如何解决数组的两个缺陷&#xff1a;数…...

AI在线免费视频工具2:视频配声音;图片说话hedra

1、视频配声音 https://deepmind.google/discover/blog/generating-audio-for-video/ https://www.videotosoundeffects.com/ &#xff08;免费在线使用&#xff09; 2、图片说话在线图片生成播报hedra hedra 上传音频与图片即可合成 https://www.hedra.com/ https://www.…...

Elastic字段映射(_source,doc_value,fileddata,index,store)

Elastic字段映射&#xff08;_source,doc_value,filed_data,index,store&#xff09; _source&#xff1a; source 字段用于存储 post 到 ES 的原始 json 文档。为什么要存储原始文档呢&#xff1f;因为 ES 采用倒排索引对文本进行搜索&#xff0c;而倒排索引无法存储原始输入…...

kotlin空类型安全 !! ?. ?:

1、定义可空类型 fun main(){// 定义可空类型var x:String? "hello"x null } 2、!! 强转类型 定义可空类型之后&#xff0c;如果使用其内置方法&#xff0c;编译不会通过&#xff0c;因为值有可能为null&#xff0c;可以使用 !! 把类型强转为不可空&#xff1a…...

通过 WireGuard 组建虚拟局域网 实现多个局域网全互联

本文后半部分代码框较多,欢迎点击原文链接获得更佳的阅读体验。 前言 上一篇关于 WireGuard 的文章通过 Docker 安装 wg-easy 的形式来使用 WireGuard,但 wg-easy 的功能比较有限,并不能发挥出 WireGuard 的全部功力。 如果只是想要出门在外连随时随地的连回家里的局域网,…...

qmt量化交易策略小白学习笔记第47期【qmt编程之期货仓单】

qmt编程之获取期货数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 期货仓单 提示 1…...

点云处理中阶 Sampling

目录 一、什么是点云Sampling 二、示例代码 1、下采样 Downsampling 2、均匀采样 3、上采样 4、表面重建 一、什么是点云Sampling 点云处理中的采样(sampling)是指从大量点云数据中选取一部分代表性的数据点,以减少计算复杂度和内存使用,同时保留点云的几何特征和重…...

为什么print语句被Python3遗弃?

在开发和维护python项目的时候发现经常有print语句报错&#xff0c;原因是python3放弃了print语句 print 语句 早就被列在了不可靠的语言特性列表中&#xff0c;例如 Guido 的“Python 之悔”&#xff08;Python Regrets&#xff09;演讲【1】&#xff0c;并计划在 Python 300…...

067、Python 高阶函数的编写:优质冒泡排序

以下写了个简单的冒泡排序函数&#xff1a; def bubble_sort(items: list) -> list:for i in range(1, len(items)):swapped Falsefor j in range(0, len(items) - 1):if items[j] > items[j 1]:items[j], items[j 1] items[j 1], items[j]swapped Trueif not swa…...

【Python】从基础到进阶(一):了解Python语言基础以及变量的相关知识

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、Python简介1.1 历史背景1.2 设计哲学1.3 语言特性1.4 应用场景1.5 为什么选择Python 二、Python语言基础2.1 注释规则2.1.1 单行注释2.1.2 多行注释2.1.3 文件编码声明注释 2.2 代码缩进2.3 编码规范2.3.1 命名规范…...

AI学习指南机器学习篇-KNN的优缺点

AI学习指南机器学习篇-KNN的优缺点 在机器学习领域中&#xff0c;K最近邻&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;算法是一种十分常见的分类和回归方法之一。它的原理简单易懂&#xff0c;但在实际应用中也存在一些优缺点。本文将重点探讨KNN算法的优缺点…...

全网最全!25届最近5年上海理工大学自动化考研院校分析

上海理工大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...