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

反序列化漏洞及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、序列化&#xff08;以PHP语言为例&#xff09; 3、反序列化 4、PHP魔法函数 &#xff08;1&#xff09;__wakeup() &#xff08;2&#xff09;__destruct() &#xff08;3&#xff09;__construct() &#xff08;4&#xff09;__toString() &…...

企业应用程序单点登录

企业每天都依赖于各种企业应用程序&#xff0c;包括云和本地应用程序。这意味着用户必须经常输入更多密码才能访问这些应用程序并完成他们的工作。为了提高用户的工作效率、减少密码疲劳并使身份管理更有效&#xff0c;您的组织需要部署高效的 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配置 前题条件&#xff0c;拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx&#xff0c;则需查看自己的Nginx是否开启了SSL的模块功能&#xff1a; ./nginx -V 显…...

大学生必备神器

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

【MyBatis Plus】004 -- MyBatis Plus高级(AR、MP插件、自定义全局操作、自动填充、逻辑删除、枚举、代码生成器)

目录 1、ActiveRecord 1.1 开启AR之旅&#xff08;根据主键 id 进行查询&#xff09; 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年外包终上岸,我只能说:但凡有点机会,千万别去外包...

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

【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

软件质量保证与软件测试复习笔记(第一周总体介绍+黑盒测试详细)

第一周 2.23 &#xff08;总体性介绍&#xff09; 软件测试的定义 常用术语解释 错误 缺陷 故障 失效 测试和测试用例、测试过程 出现软件缺陷的原因 软件开发的主要环节 测试过程的生命周期模型 软件测试的本质是针对要测试的内容确定一组测试用例 测试用…...

WRF模式与Python融合技术在多领域中的应用及精美绘图教程

当今从事气象及其周边相关领域的人员&#xff0c;常会涉及气象数值模式及其数据处理&#xff0c;无论是作为业务预报的手段、还是作为科研工具&#xff0c;掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者&#xff0c;模式功能齐全…...

Reactor设计模式

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

精通 TensorFlow 2.x 计算机视觉:第二部分

原文&#xff1a;Mastering Computer Vision with TensorFlow 2.x 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;…...

《算法竞赛进阶指南》0x51 线性DP

0x51 线性DP 271. 杨老师的照相排列 题意&#xff1a; NNN 个人站成左端对齐的 kkk 排&#xff0c;每排有 NiN_iNi​ 人&#xff0c;Ni>NjN_i > N_jNi​>Nj​ 如果 i<ji < ji<j&#xff0c;则 Ni>NjN_i > N_jNi​>Nj​ 。每一排从左到右身高递减&…...

spring数据库事务管理

1.什么是事务 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 需要注意的是&#xff1a;事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 innodb引擎。但是&#xff0c;如果把数据库引擎变为 myisam&#x…...

Huggingface微调BART的代码示例:WMT16数据集训练新的标记进行翻译

BART模型是用来预训练seq-to-seq模型的降噪自动编码器&#xff08;autoencoder&#xff09;。它是一个序列到序列的模型&#xff0c;具有对损坏文本的双向编码器和一个从左到右的自回归解码器&#xff0c;所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系…...

synchronized 的 monitor 机制

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

NumPy 初学者指南中文第三版:1~5

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

ChatGLM-6B论文代码笔记

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

机器学习入门实例-加州房价预测-1(数据准备与可视化)

问题描述 数据来源&#xff1a;California Housing Prices dataset from the StatLib repository&#xff0c;1990年加州的统计数据。 要求&#xff1a;预测任意一个街区的房价中位数 缩小问题&#xff1a;superwised multiple regressiong(用到人口、收入等特征) univariat…...

【ROS2指南-20】了解ROS2组件的用法

在单个进程中组合多个节点 目录 背景 运行演示 发现可用组件 使用 ROS 服务 (1.) 与发布者和订阅者的运行时组合 使用 ROS 服务 (1.) 与服务器和客户端的运行时组合 使用 ROS 服务的编译时组合 (2.) 使用 dlopen 的运行时组合 使用启动动作组合 高级主题 卸载组件 重新…...

使用AI进行“文本纠错”

AI在现实中的应用有很多&#xff0c;你有没有想过&#xff0c;它还可以进行文本纠错呢&#xff1f;传统的校对既耗时又枯燥&#xff0c;通过“AI纠错”&#xff0c;不仅能更快完成&#xff0c;还能提高准确度。那么AI“文本纠错”背后的原理是什么呢&#xff1f;和我一起看看吧…...

第九章 法律责任与法律制裁

第九章 法律责任与法律制裁_副本 目录 第一节 法律责任的概念 一 法律责任的含义二 法律责任的特点 第二节 法律责任的分类与竞合 一 法律责任的分类 &#xff08;一&#xff09;根据责任行为所违反的法律的性质 民事责任&#xff1a;刑事责任行政责任违宪责任 &#xff08;二…...

如何选择好用的海康视频恢复软件?综合考虑这几点

海康视频恢复通常是指从海康威视监控设备中恢复删除或丢失的视频。在使用海康设备进行监控时&#xff0c;一些重要的视频可能会被误删除或其他原因导致丢失&#xff0c;如果没有及时备份&#xff0c;数据就可能会“永久”丢失&#xff1f;其实不然&#xff0c;我们可以选择好用…...

前端学习:HTML颜色(什么是RGB、HEX、HSL)

一、什么是RGB、HEX、HSL&#xff1f; 无论是RGB、HEX、HSL&#xff0c;它们的作用只有一个&#xff1a;用数字表达出一种颜色。 1.RGB RGB通过输入的数值&#xff0c;将红色、绿色和蓝色的光源以一定的量混合在一起&#xff0c;形成颜色。 软件中通常让你输入Red、Green、B…...

zookeeper + kafka集群搭建详解

目录 1.消息队列介绍 1.为什么需要消息队列 &#xff08;MO&#xff09; 2.使用消息队列的好处 3.消息队列的两种模式 2.Kafka相关介绍 1.Kafka定义 2.Kafka简介 3. Kafka的特性 3.Kafka系统架构 1. Broker&#xff08;服务器&#xff09; 2. Topic&#xff08;一个队…...

【数据结构与算法】 - 双向链表 - 详细实现思路及代码

目录 一、概述 二、双向链表 三、双向链表实现步骤  &#x1f4cc;3.1 C语言定义双向链表结点  &#x1f4cc;3.2 双向链表初始化  &#x1f4cc;3.3 双向链表插入数据  &#x1f4cc;3.4 双向链表删除数据  &#x1f4cc;3.5 双向链表查找数据  &#x1f4cc;3.6 双向链…...

面试官在线点评4份留学生简历! 这些坑你中了几个?如何写项目描述才能被大厂发面试?转专业简历该咋写 | 还有优秀简历展示!

我们给大家展示一下 从材料的准备 也就是说到底包含哪些具体的项目 为什么说这些项目是不错的 第二呢就是说在陈述上 在整个这个简历的结构 他的完备性他的准确性 他的正确性 以及最后他的具体的这种项目的描述 那讲完了这个好的简历呢 我们另外搜集了几份简历 那这些简历呢其实…...

一觉醒后ChatGPT 被淘汰了

OpenAI 的 Andrej Karpathy 都大力宣传&#xff0c;认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌似出现了一种新的趋势&#xff1a;自主人工智能。 这不是空穴来风&#xff0c;最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归…...

spring框架的事务

1.什么是事务? 事务&#xff1a;是数据库操作的最小工作单元&#xff0c;是作为单个逻辑工作单元执行的一系列操作&#xff1b;这些操作作为一个整体一起向系统提交&#xff0c;要么都执行、要么都不执行&#xff1b;事务是一组不可再分割的操作集合&#xff08;工作逻辑单元…...

Spring配置数据源

Spring配置数据源数据源的作用环境准备手动创建c3p0数据源封装抽取关键信息&#xff0c;手动创建c3p0数据源使用Spring容器配置数据源数据源的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源&#xff0c;初始化部分连接资源 使用连接资源时从数据源中获取 使用完…...