反序列化漏洞及PHP魔法函数
目录
1、漏洞原理
2、序列化(以PHP语言为例)
3、反序列化
4、PHP魔法函数
(1)__wakeup()
(2)__destruct()
(3)__construct()
(4)__toString()
(5)__get()
(6)__call()
1、漏洞原理
PHP反序列化漏洞也叫PHP对象注入,形成的原因是程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行、文件操作、执行数据库操作等参数不可控。反序列化攻击在Java、Python等面向对象语言中均存在。序列化是广泛存在于PHP、Java等编程语言中的一种将有结构的对象/数组转化为无结构的字符串并储存信息的一种技术。
2、序列化(以PHP语言为例)
PHP类都含有的特定元素:类属性、类常量、类方法。
序列化就是将一个类压缩成一个字符串的方法。
eg:
<?php
class userInfo
{private $passwd='123456';protected $sex = 'male'; //定义了三个属性public $name ='Myon';public function modifyPasswd($passwd)
{$this->passwd = $passwd; //将函数传进来的值传给passwd}
public function getPasswd()
{
echo $this->$passwd; //输出passwd}
}
$Myon = new userInfo(); //创建 userInfo对象实例
$Myon->modifyPasswd('123abc'); //调用modifyPasswd函数并将123abc值传进去
$data = serialize($Myon); //序列化
echo $data;
?>
输出结果:
O:8:"userInfo":3{s:16:"userInfopasswd";s:6:"123abc";s:6:"*sex";s:4:"male";s:4:"name";s:4:"Myon";}
对序列化后的字符串进行解读:
大括号外表示“Object”对象名称是“userInfo”,长度为8,这个对象有3个属性。
(特别注意:在CTF中常有一个对 _wakeup() 函数的绕过,当序列化字符串中表示对象属性个数的值大于实际属性个数时,就会跳过wakeup方法的执行。)
在前面的文章中有对CTF题PHP反序列化及绕过实例的讲解,可以参考
http://t.csdn.cn/Mffji
http://t.csdn.cn/wbtkK
大括号内表示这些属性的具体信息及它们的值
根据属性的权限不同,在序列化中的表示方法也不同
从代码中可以看出,三个属性的权限分别是private,protected和public
(1)private权限是私有权限,只能在本类内使用,子类不能继承。
(2)protected权限是私有权限,即只能在类内部使用,子类可以继承这个变量。
(3)public权限就是正常的变量权限,一般声明的变量权限均为public。
标红的是private,前面加上了本类名称;
标蓝的是protected,前面加上了星号;
标绿的是public,没有任何前缀。
一个类经过序列化之后,存储在字符串的信息只有类名称和类内属性键值对,序列化字符串中没有将类方法一并序列化。
3、反序列化
反序列化与序列化是相对应的,就是将含有类信息的序列化过的字符串“解压缩”还原成类。
反序列化的类想要使用原先的类方必须依托于域,脱离了域的反序列化的类是无法调用序列化之前的类方法的。
<?php
class userInfo
{private $passwd='123456';protected $sex = 'male'; //定义了三个属性public $name ='Myon';public function modifyPasswd($passwd)
{$this->passwd = $passwd; //将函数传进来的值传给passwd}
public function getPasswd()
{
echo $this->$passwd; //输出passwd}
}
$Myon = new userInfo(); //创建 userInfo对象实例
$Myon->modifyPasswd('123abc'); //调用modifyPasswd函数并将123abc值传进去
$data = serialize($Myon); //序列化$new_Myon = unserialize($data); //反序列化数据
$new_Myon->getPasswd();
?>
理论上这里类方法应该被成功执行,但是...
不过有一点可以确定,如果我们单独将序列化后的字符串作为输入,在一个新的域下执行代码片段,肯定是会报错的。
<?php
$data = "O:8:\"userInfo\":3{s:16:\"userInfopasswd\";s:6:\"123abc\";s:6:\"*sex\";s:4:\"male\";s:4:\"name\";s:4:\"Myon\";}"
$new_Myon =unserialize($data);//反序列化数据
$new_Myon->getPasswd();
?>
4、PHP魔法函数
(1)__wakeup()
在PHP中如果需要进行反序列化,会先检查类中是否存在_wakeup()函数,如果存在,则会先调用此类方法,预先准备对象需要的资源。
<?php
class example
{public $color = 'black';//定义color属性
public function __wakeup(){$this->color = 'white';//将white赋值给color}public function printColor(){ echo $this->color . PHP_EOL; //输出color}
}
$my = new example; //实例化对象
$data = serialize($my); //进行序列化
$new_my = unserialize($data); //反序列化
$new_my->printColor(); //调用printColor()函数
?>
可以看到类属性color已经被__wakeup()函数自动调用并修改了
这种函数被称为PHP魔法函数,它在一定条件下不需要被调用而可以自动调用
(2)__destruct()
在对象的所有引用都被删除或类被销毁时自动调用
<?php
class example
{public $color ='black'; //定义color属性public function __destruct(){echo "__destruct()". PHP_EOL; //打印__destruct()}
}
echo "initializing...". PHP_EOL; //打印 initializing...
$my = new example; //创建对象实例
echo "serializing..." . PHP_EOL; //打印 serializing...
$data = serialize($my); // 序列化
?>
可以看到在序列化类的时候,__destruct()函数自动执行了 。
(3)__construct()
此函数会在创建一个类的实例时自动调用
<?php
class example
{public $color='black'; //定义color属性public function __construct(){echo"____construct()". PHP_EOL; //打印__construct()}
}
echo "initializing...". PHP_EOL; //打印initializing...
$my = new example; //创建对象实例
echo "serializing...". PHP_EOL; //打印 serializing...
$data = serialize($my); //序列化
?>
可以看到在序列化之前,实例化时__construct()函数就被调用了。
(4)__toString()
此函数会在类被当作字符串时调用
<?php
class example
{public $color='black'; //定义color属性public function __toString(){return"_toString()". PHP_EOL;//打印__toString()}
}
echo "initializing...". PHP_EOL; //打印initializing...
$my = new example; //创建对象实例
echo "echo...". PHP_EOL; //打印echo...
echo $my;//输出$my
echo "serializing...". PHP_EOL; // 打印 serializing...
$data = serialize($my); //序列化
?>
可以看到当实例化对象被当作字符串使用时,__toString()函数自动调用。
其他触发此函数的情况:
反序列化对象与字符串连接时。
反序列化对象参与格式化字符串时。
反序列化对象与字符串进行==比较时(PHP进行==比较时会转换参数类型)。
反序列化对象参与格式化SQL语句,绑定参数时。
反序列化对象在经过PHP字符串函数,如strlen()、addslashes()时。
在in_array()方法中,第一个参数是反序列化对象,第二个参数的数组中有toString返回的字符串时,toString会被调用。
反序列化的对象作为class_exists()的参数时。
(5)__get()
在读取不可访问的属性值时自动调用
<?php
class example
{private $color ='black'; // 定义私有属性 colorpublic function __get($color){return"__get()". PHP_EOL; //打印__get()}
}
$my = new example; //创建对象实例
echo $my->color; //输出 color 属性
?>
因为试图访问私有变量color导致__get()函数自动调用
(6)__call()
调用未定义的方法时调用
<?php
class example
{private $color='black'; //定义私有属性 colorpublic function __call($function,$parameters){echo $function."('.Sparameters.')".PHP_EOL;//打印两个参数return"__call()". PHP_EOL;}
}
$my = new example; //创建对象实例
echo $my->notExistFunction("patameters"); //调用未定义方法?>
?>
可以看到__call()函数被调用
也就是说你想让调用方法未定义,那么这个方法名就会作为 __call的第一个参数传入,因此不存在方法的参数会被装进数组中作为 __call的第二个参数传入。
相关文章:

反序列化漏洞及PHP魔法函数
目录 1、漏洞原理 2、序列化(以PHP语言为例) 3、反序列化 4、PHP魔法函数 (1)__wakeup() (2)__destruct() (3)__construct() (4)__toString() &…...

企业应用程序单点登录
企业每天都依赖于各种企业应用程序,包括云和本地应用程序。这意味着用户必须经常输入更多密码才能访问这些应用程序并完成他们的工作。为了提高用户的工作效率、减少密码疲劳并使身份管理更有效,您的组织需要部署高效的 SSO 解决方案。 AD360 提供企业 …...
前馈PID控制(热交换器/反应釜温度控制)
如何利用PID进行温度控制请参看下面博客文章: 博途PID 1200/1500PLC PID_Compact比例作用权重b微分作用权重c解读(PI-D控制器 I-PD控制器)_RXXW_Dor的博客-CSDN博客很多人会问PLC自带的PID指令和我们自己设计的PID有什么区别,这个问题要看你和什么PID控制器作对比,PID负反…...

Nginx配置ssl证书实现https安全访问
目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件,拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx,则需查看自己的Nginx是否开启了SSL的模块功能: ./nginx -V 显…...

大学生必备神器
大学生要掌握的办公软件因专业和工作需求而异,但是以下是一些普遍适用于大学生的办公软件,可以帮助提高学习和工作效率,今天就给大家推荐几款大学生常用的软件。 1.OneDrive 这是微软出品的云存储产品,与百度网盘有些类似&#…...

【MyBatis Plus】004 -- MyBatis Plus高级(AR、MP插件、自定义全局操作、自动填充、逻辑删除、枚举、代码生成器)
目录 1、ActiveRecord 1.1 开启AR之旅(根据主键 id 进行查询) 1.2 新增数据 1.3 更新操作 1.4 删除操作 1.5 根据条件查询 2、Oracle 主键 Sequence 2.1 部署Oracle环境 2.2 创建表以及序列 2.3 jdbc驱动包 2.4 修改application.properties 2.5 配置序列…...

3年外包终上岸,我只能说:但凡有点机会,千万别去外包...
我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司的软件测试岗,一干就是3年。现在终于跳槽到了互联网公司了,我想说的是,但凡有点机会&am…...

【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

软件质量保证与软件测试复习笔记(第一周总体介绍+黑盒测试详细)
第一周 2.23 (总体性介绍) 软件测试的定义 常用术语解释 错误 缺陷 故障 失效 测试和测试用例、测试过程 出现软件缺陷的原因 软件开发的主要环节 测试过程的生命周期模型 软件测试的本质是针对要测试的内容确定一组测试用例 测试用…...

WRF模式与Python融合技术在多领域中的应用及精美绘图教程
当今从事气象及其周边相关领域的人员,常会涉及气象数值模式及其数据处理,无论是作为业务预报的手段、还是作为科研工具,掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者,模式功能齐全…...

Reactor设计模式
一、Reactor设计模式 1、什么是Reactor设计模式? Reactor模式是高性能I/O设计中,常用的设计模式。其中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上,一旦有I/O事件到来或是准备就绪…...

精通 TensorFlow 2.x 计算机视觉:第二部分
原文:Mastering Computer Vision with TensorFlow 2.x 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,…...
《算法竞赛进阶指南》0x51 线性DP
0x51 线性DP 271. 杨老师的照相排列 题意: NNN 个人站成左端对齐的 kkk 排,每排有 NiN_iNi 人,Ni>NjN_i > N_jNi>Nj 如果 i<ji < ji<j,则 Ni>NjN_i > N_jNi>Nj 。每一排从左到右身高递减&…...
spring数据库事务管理
1.什么是事务 事务是逻辑上的一组操作,要么都执行,要么都不执行。 需要注意的是:事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 innodb引擎。但是,如果把数据库引擎变为 myisam&#x…...

Huggingface微调BART的代码示例:WMT16数据集训练新的标记进行翻译
BART模型是用来预训练seq-to-seq模型的降噪自动编码器(autoencoder)。它是一个序列到序列的模型,具有对损坏文本的双向编码器和一个从左到右的自回归解码器,所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系…...

synchronized 的 monitor 机制
synchronized 的 monitor 机制 前言 本文基于 jdk 8 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 monitor monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 class 持有的锁。每一个对象…...

NumPy 初学者指南中文第三版:1~5
原文:NumPy: Beginner’s Guide - Third Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 一、NumPy 快速入门 让我们开始吧。 我们将在不同的操作系统上安装 NumPy 和相关软件,并看一些使用 NumPy 的简单代码。 本章简要介绍了 IPython…...

ChatGLM-6B论文代码笔记
ChatGLM-6B 文章目录 ChatGLM-6B前言一、原理1.1 优势1.2 实验1.3 特点:1.4 相关知识点 二、实验2.1 环境基础2.2 构建环境2.3 安装依赖2.4 运行2.5 数据2.6 构建前端页面 3 总结 前言 Github:https://github.com/THUDM/ChatGLM-6B 参考链接:…...

机器学习入门实例-加州房价预测-1(数据准备与可视化)
问题描述 数据来源:California Housing Prices dataset from the StatLib repository,1990年加州的统计数据。 要求:预测任意一个街区的房价中位数 缩小问题:superwised multiple regressiong(用到人口、收入等特征) univariat…...
【ROS2指南-20】了解ROS2组件的用法
在单个进程中组合多个节点 目录 背景 运行演示 发现可用组件 使用 ROS 服务 (1.) 与发布者和订阅者的运行时组合 使用 ROS 服务 (1.) 与服务器和客户端的运行时组合 使用 ROS 服务的编译时组合 (2.) 使用 dlopen 的运行时组合 使用启动动作组合 高级主题 卸载组件 重新…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...