php序列化与反序列化
文章目录
- 基础知识
- 魔术方法:在序列化和反序列化过程中自动调用的方法
- 什么是 `__destruct()` 方法?
- 何时触发 `__destruct()` 方法?
- 用途:
- 语法示例:
- 反序列化漏洞利用
- 前提条件
- 一些绕过策略
- 绕过__wakeup函数
- 绕过正则匹配
- 绕过相等逻辑判断
- 利用大S的ascll码绕过
- 反序列化字符逃逸
- 高级反序列化
- phar反序列化
- 什么是 PHAR 文件?
- 特点
- session反序列化
基础知识
序列化:将对象转化为一个可传输的字符串,serialize()
反序列化:将字符串重新转化为对象
只有类的属性可以序列化,方法不可以
如果属性权限为private,那么序列化后,存储的属性名字为%00+类名+%00+属性名
如果属性权限为protected,那么序列化后,存储的属性名字为%00+*+%00+属性名
<?php
类的属性可以是类
class ctf{public $name;
}
class user{public $type='vip';
}
$c=new ctf();
$c->name=new user();
echo $c->name->type;
魔术方法:在序列化和反序列化过程中自动调用的方法
1. _sleep()方法在序列化时自动调用
2. _wakeup()方法在反序列化时自动调用
3. 反序列化时自动调用_destruct析构方法,方法内恶意代码也会被执行
4. 执行类不存在的方法时自动调用_call方法,执行不存在的static方法时会调用_callstatic()方法
5. _get方法在访问不存在属性时自动调用,_set方法在写入不存在属性时自动调用
6. _isset()方法和_unset()方法
7. _tostring()方法,把对象和字符串拼接或者当字符串用时自动调用
8. _invoke()方法,当类的实例被当作函数调用
9. __set_state 方法,文档中说执行 var_export时自动调用
10. __debugInfo 方法的属性修饰符,执行var_dump时自动调用
11. __clone方法,当使用clone关键字 ,clone一个对象时,会自动调用

什么是 __destruct() 方法?
__destruct() 是 PHP 中的一个魔术方法(magic method),它用于在对象销毁时自动执行一些清理操作,比如释放资源或关闭数据库连接。这个方法会在对象生命周期结束时自动调用,无需手动触发。
何时触发 __destruct() 方法?
__destruct() 方法在以下情况下被自动调用:
- 对象被销毁时:当对象不再被使用时,PHP 会自动调用
__destruct()。 - 脚本结束时:当脚本执行结束时,所有未销毁的对象都会调用
__destruct()。 - 手动销毁对象:当调用
unset()或者赋值null给对象时,__destruct()会被触发。
用途:
- 释放资源:比如关闭数据库连接、关闭文件句柄、释放内存等。
- 清理工作:可以用于日志记录、清理临时文件等。
语法示例:
class MyClass {public function __construct() {echo "对象创建了!\n";}public function __destruct() {echo "对象销毁了!\n";}
}$obj = new MyClass(); // 输出:对象创建了!
unset($obj); // 输出:对象销毁了!
反序列化漏洞利用
前提条件
- 存在反序列化提交的入口
- 有被反序列化的类的魔术方法
一些绕过策略
绕过__wakeup函数
条件:
- php5至php5.6.25 之间的版本可以绕过
- php7到php7.0.10 直接的版本可以绕过
绕过方法:
反序列化字符串中表示属性数量的值大于大括号内实际属性的数量时 ,wakeup方法会被绕过
绕过正则匹配
参数有过滤,不让输入O:数字的形式,试图防止反序列化某个对象
O:数字 改为 O:+数字 就可以绕过上面的O:数字 过滤
绕过相等逻辑判断
eg $a->name=&$b
采用&符号,使得a的值与b的值恒相等
利用大S的ascll码绕过
大写S可以支持ascll值的字符,可以借助这个特性绕过一些被过滤的字符
O:8:"backdoor":1:{s:4:"name";s:10:"phpinfo();";}O:8:"backdoor":1:{S:4:"n\97me";s:10:"phpinfo();";}
反序列化字符逃逸
在一些关键词被替换后,描述中的字符数量是按照未替换之前的字符来计算,当替换后字符数量大于描述数量时,就可以逃逸出一些字符
高级反序列化
phar反序列化
什么是 PHAR 文件?
PHAR(PHP Archive)文件是一种将多个 PHP 文件、资源和其他数据打包成一个单一的归档文件的格式。它类似于 .tar 或 .zip 文件,允许将整个 PHP 应用或库打包为一个文件,方便分发和部署。
特点
- 自包含:PHAR 文件可以包含 PHP 脚本和其他资源(如图片、配置文件等),可以作为一个独立的文件运行。
- 可执行:PHAR 文件可以像普通的 PHP 脚本一样执行,通过
php archive.phar来运行。 - 压缩支持:PHAR 文件支持压缩,可以通过
.tar,.gzip或.bzip2等格式进行压缩。
$phar->setmetadata($h);
metadata可以放一个类实例,生成phar后,会将这个类实例序列化字符串放到phar文件内,当使用phar协议加载phar文件时,会自动反序列化这个类的序列化字符串
include
file_get_contents
file_put_contents
.use.ini
等与文件相关的函数都可以包含phar协议,从而自动调用其魔术方法
phar协议哪里使用的多?
- 存在文件上传点
- 能找到file_exists()等文件读取函数,通过控制phar://头,就能解析phar包来自动进行反序列化
session反序列化
-
php的session是存放在文件中的 默认位置是/tmp/sess_PHPSESSID
-
session 是可以放字符串,数字,也可以放对象
- session里面存放对象时,会自动进行序列化,存放序列化后的字符串
- session里面拿取对象时,会自动进行反序列化,执行对象的魔术方法
u|O:4:“user”:2:{s:8:“username”;N;s:8:“password”;N;} 属于php处理器
以数组类型来存,属于php_serialize处理器
如果用php_serialize处理器来存,就可以在username中注入|,但是如果用php处理器来取时,就会把|右边的内容进行反序列化,反序列化之后就会调用恶意类的实例,在销毁时就会调用析构方法
相关文章:
php序列化与反序列化
文章目录 基础知识魔术方法:在序列化和反序列化过程中自动调用的方法什么是 __destruct() 方法?何时触发 __destruct() 方法?用途:语法示例: 反序列化漏洞利用前提条件一些绕过策略绕过__wakeup函数绕过正则匹配绕过相…...
视频级虚拟试衣技术在淘宝的产品化实践
作为一种新的商品表现形态,内容几乎存在于手淘用户动线全流程,例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力,能够从供给端缓解内容生产成本高的问题,通过源源不断的低成本供给…...
音视频-WAV格式
1. WAV格式说明: 2. 格式说明: chunkId:通常是 “RIFF” 四个字节,用于标识文件类型。(wav文件格式表示)chunkSize:表示整个文件除了chunkId和chunkSize这 8 个字节外的其余部分的大小。Forma…...
c++ std::array使用笔记
c array使用笔记 1. 构造2. 成员类型3. 元素访问4. 容量相关5. 填充与交换6. 比较操作7. 迭代器总结 array 是 C 标准库中的一个容器模板,它封装了一个固定长度的内建数组,并提供了类似于其他 STL 容器的接口。与内建数组相比, array 提供了…...
第39天:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化
时间轴: Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等. 框架库:MyBatis,SpringMVC,SpringBoot…...
浏览器JS打不上断点,一点就跳到其他文件里。浏览器控制台 js打断点,指定的位置打不上断点,一打就跳到其他地方了。
关闭JavaScript 源代码映射,F12开发者模式 设置->偏好设置->源代码/来源->JavaScript 源代码映射。 肯定不是这个原因导致的,但这个办法可以暂时解决问题,点完这个东西就隐藏了webpack,有懂的来讲讲。 又浪费一个小时…...
conda环境管理 kernel注册到jupyter notebook
本文核心目的:解决jupyter notebook找不到自己想要的指定conda环境 首先安装anaconda,在win搜索框打开anaconda prompt 按下ctrlc终止操作的时间很长。需要输入y来确认操作。 国内镜像源不能使用代理服务访问。要尝试代理服务的打开与关闭 下面是cond…...
【SpringBoot】【log】 自定义logback日志配置
前言:默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格…...
15.7 LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统
LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统 关键词:LangChain 销售系统、知识图谱集成、对话状态管理、生产级部署、多链协同优化 1. LangChain 销售系统架构设计 1.1 模块化架构全景图 #mermaid-svg-42MLuD3aMcpX0y8c {font-family:"trebuchet ms&q…...
计算机网络基础:揭开网络世界的神秘面纱
计算机网络基础:揭开网络世界的神秘面纱 前言一、计算机网络的定义与基本概念1.1 计算机网络的定义1.2 计算机网络的基本组成 二、计算机网络的分类2.1 按地域范围分类2.2 按拓扑结构分类 三、计算机网络体系结构3.1 OSI 参考模型3.2 TCP/IP 参考模型 四、网络通信协…...
工会考试知识点分享
工会考试涵盖工会基础知识、劳动法及相关法律法规、时政等内容,以下是一些常见的知识点分享: 工会基础知识 工会的性质与职能:工会是职工自愿结合的工人阶级的群众组织,基本职责是维护职工合法权益,同时还具有组织、…...
az devops login报错:Failed to authenticate using the supplied token.
PowerShell,az devops login报错: Failed to authenticate using the supplied token. 检查了一下PAT token是对的。 检查命令: az devops login --organization https://dev.azure.com/xxxxxxxx/ 乍一看好像没问题问题,然后想…...
Halcon图像预处理算子 sobel算子、傅里叶变换算子、卷积算子
滤波类型算子适用噪声特点均值滤波mean_image高斯噪声平滑均匀,可能额模糊边缘中值滤波median_image椒盐噪声保留边缘,抑制脉冲噪声高斯滤波gauss_filter高斯噪声加权平均,边缘更平滑 均值滤波 mean_image(Image,ImageMean,MaskWidth,MaskHe…...
Java Web应用中获取客户端的真实IP地址
Java Web应用中获取客户端的真实IP地址,尤其在存在代理服务器的情况下。 代码示例: public static String getClientIP(HttpServletRequest request) {String ip = parseCommaSeparatedIPs(request.getHeader("X-Forwarded-For"));if (isInvalid(ip)) {ip = pars…...
洛谷————P11559 【MX-X7-T0】[LSOT-3] 嗯欧哎
P11559 【MX-X7-T0】[LSOT-3] 嗯欧哎 题目背景 原题链接:MXOJ Next。 嗯欧哎是欧哎界的知名比赛。本题可以用来检验嗯欧哎是否发挥出了真实水平。 此名称纯属虚构,不影射任何现实中的比赛或机构的名称。如有雷同,纯属巧合。 题目描述 一…...
2020年SCI1区TOP:异质综合学习和动态多群体粒子群算法HCLDMS-PSO,深度解析+性能实测
目录 1.摘要2.改进策略3.结果展示4.参考文献5.代码获取 1.摘要 本文提出了一种异质综合学习和动态多群体粒子群算法(HCLDMS-PSO),该算法在综合学习(CL)策略的基础上,通过利用整个种群的全局最优经验来生成…...
FinRobot:一个使用大型语言模型进行金融分析的开源AI代理平台
文章目录 前言一、生态系统1. 金融AI代理(Financial AI Agents)2. 金融大型语言模型(Financial LLMs)3. LLMOps4. 数据操作(DataOps)5. 多源LLM基础模型(Multi-Source LLM Foundation Models&am…...
【windows driver】 开发环境简明安装教程
一、下载路径 https://learn.microsoft.com/en-us/windows-hardware/drivers/other-wdk-downloads 二、安装步骤: 1、安装Visual Studio IDE 笔者建议安装最新版本,可以向下兼容。发文截止到目前,VS2022是首选,当前笔者由于项…...
强制完整性级别(MIL)和用户账户控制(UAC)的联系与区别
强制完整性级别(MIL) 和 用户账户控制(UAC) 都是 Windows 操作系统中的安全机制,旨在增强系统的安全性并防止恶意软件和攻击者在系统中获得更高的权限。尽管它们有共同的目标,但它们的工作原理、应用范围和…...
性能附录:如何计算并发用户数(摘自高楼老师《性能30讲》)
高楼老师《性能30讲》: 性能测试实战30讲-极客时间 感兴趣的同学可以去读一下,个人感觉写的非常好 目录 什么是并发? 在线用户数、并发用户数怎么计算 总结 什么是并发? 我们假设上图中的这些小人是严格按照这个逻辑到达系统的,那显然,…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
