当前位置: 首页 > 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、考试…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...