php反序列化学习(1)

1、php面向对象基本概念

类的定义:

类是定义了一件事物的抽象特征,它将数据的形式以及这些数据上的操作封装住在一起。(对象是具有类类型的变量,是对类的实例)

构成:

成员变量(属性)+成员函数(方法)

成员变量的值对外不可见,需要通过成员函数访问。

2、类与对象

实例化和赋值:再给实例化进行赋值的时候要首先确保类里面定义过这个属性

类的修饰符介绍
在类中直接声明的变量称为成员属性(也可以成为成员变量)。
可以在类中声明多个变量,即“对象”中可以有多个成员属性,每个变量都存储"对象’不同的属性信息。
常用访问权限修饰符:(对属性的定义)
public:公共的,在类的内部、子类中或者类的外部都可以使
用,不受限制;
protected:受保护的,在类的内部、子类中可以使用,但不能
在类的外部使用;
private:私有的,只能在类的内部使用,在类的外部或者子类中
都无法使用。

类与对象的关系

类是对象的抽象,而对象是类的具体实例。
类是想法,把类实例化(new),调用具体值后就变成了对象。
类的成员方法:
在类中定义的函数被称为成员方法。函数实现的是某个独立的功能;
成员方法实现的是类中的一个行为,是类的一部分。
可以在类中声明多个成员方法,成员方法的声明和函数声明完全一样,只
不过在声明成员方法时可以在function关键字前加一些访问权限修饰符,
如public、protected、private(可以省略,默认为public)

3、序列化

对象的序列化:不能序列化‘类’,可以序列化‘对象’,只序列化成员变量不序列化成员函数

private私有属性序列化时在变量前加空格(就是url编码中的%00类名%00)

protected受保护属性序列化时在变量名前加%00*%00

4、反序列化特性

1、反序列化之后的内容为一个对象

2、反序列化生成的对象里的值,又反序列化里的值提供,与原有类预定定义的值无关。

3、反序列化不触发类的成员方法;需要调用方法后才能触发

5、反序列化漏洞

简单例题:

首先定义了一个test类,其中有成员变量a和成员方法(调用displayvar)并输出,通过get传入benben,并将其反序列化后复制再次调用displayvar。因此可以利用get传入的参数来完成所需要的指令。如果要执行system(‘ls’)指令,就需要将其写为序列化的形式通过get上传。

payload:

?benben=o:4:"test":1:{s:1:"a";s:13:"system('id');";}

6、魔术方法

定义:

一个预定好的,在特定情况下自动触发的行为方法

作用:

特定条件下自动调用相关方法,达到触发代码

实例:

_construct():构造函数,在实例化一个对象时,首先会去自动化执行的方法

触发时机:实例化对象

功能:提前清理不必要的内容

_destruct():析构函数,在对象的所有引用被删除或者当对象被显式销毁时执行的魔术方法。(实例化对象结束后会被销毁,也会触发析构函数)

_sleep():序列化serialize()函数会检查类中是否存在一个魔术方法_sleep()如果存在,该方法会先被调用,然后才执行序列化操作。

触发时机:序列化serialize()之前

将benben的值传给cmd,然后对user进行实例化,此时触发_construct(),对user进行序列化触发_sleep(),因此想要通过命令执行获得信息就可以在benben中传入任意命令进行执行。

_wakeup():unserialize()会检查是否存在一个_wakeup()方法,如果存在,则会先调用_wakeup()方法,预先准备对象需要的资源。

触发时机:unserialize()反序列化之前

_wakeup():在反序列化unserialize()之前

_destruct():在反序列化unserialize()之后

_toString():表达方式错误导致魔术方法触发

触发时机:把对象当成字符串调用

_invoke():格式表达错误导致魔术方法触发

触发时机:把对象当成函数调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于开源项目HAL STM32F4 +DSP库跑SVPWM开环速度测试

HAL STM32F4 ARM DSP库跑SVPWM开环速度测试 ✨本篇硬件电路和代码来源于此开源项目:https://github.com/MengYang-x/STM3F401-FOC/tree/main📍硬件电路和项目介绍,立创开源广场:https://oshwhub.com/shadow27/tai-yang-neng-wu-re…

走进智慧仓储:3D可视化工厂园区革新物流新纪元

在快节奏的现代生活中,物流仓储行业扮演着至关重要的角色。随着科技的飞速发展,传统仓储模式正面临一场前所未有的变革。今天,就让我们一起看看3D可视化技术如何为物流行业带来前所未有的便利与效率。 什么是3D可视化工厂园区? 3…

2024华为OD机试真题-最长子字符串的长度(一)-C++-OD统一考试(C卷D卷)

题目描述 给你一个字符串 s,首尾相连成一个环形,请你在环中找出 o 字符出现了偶数次最长子字符串的长度。 输入描述 输入是一个小写字母组成的字符串 输出描述 输出是一个整数 备注 1 ≤ s.length ≤ 500000 s 只包含小写英文字母 用例1 输入 alol…

vim常用指令——001

vim常用指令 Vim的命令模式常用操作一、定位移动光标二、行的基本操作【复制、粘贴、删除】三、查找、替换四、分屏命令 总结给大家总结下四个运行模式: Vim的命令模式常用操作 一、定位移动光标 按h:将光标向左移动一个字符,等同于方向键左…

UI学习笔记(二)—— 深入了解导航控制

「OC」UI学习笔记&#xff08;二&#xff09; 文章目录 「OC」UI学习笔记&#xff08;二&#xff09;手动布局子视图自动布局子视图导航控制器高级使用 手动布局子视图 //父视图的.h文件 #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGINinterface JCSuperView : UIVie…

【最新区块链论文录用资讯】CCF A—INFOCOM 2024 共17篇

Conference&#xff1a;IEEE International Conference on Computer Communications CCF level&#xff1a;CCF A Categories&#xff1a;计算机网络 Year&#xff1a;2024 Num&#xff1a;17 A Generic Blockchain-based Steganography Framework with High Capacity via …

Python: 使用pyotp实现OTP一次性密码验证

使用pyotp实现OTP一次性密码验证 OTP的基本原理 生成一个共享秘钥作为随机数的种子服务端通过种子计算出当前的密码客户端也通过相同的种子计算出当前的密码验证客户端生成的密码和服务端生成的密码是否匹配 服务端和客户端计算的方式一样 共享密钥 时间因子 算法 > 密…

多个文本如何一键导出二维码?在线批量生码的制作方法

当存在多条文本数据并且需要将每条数据生成单独的二维码来使用&#xff0c;很多小伙伴可能还在用一个一个来制作的方法&#xff0c;在二维码生成器上将文本转二维码。这种方式操作起来比较的繁琐&#xff0c;需要浪费大量的时间&#xff0c;那么有什么方法可以简化这个过程吗&a…

【Android-Compose】ViewModel 的 init 初始化函数中使用非主线程上的协程闪退问题

问题&#xff1a; 在 Compose- kotlin 中&#xff0c;如果在 ViewModel 中的 init 函数中使用非主线程上的协程会导致闪退问题&#xff0c; 具体代码为&#xff1a; HiltViewModel class ApkScreenViewModel Inject constructor(... ) : ViewModel() {// 1. 在非 主线程的协程…

#学习方法#笔记#微信

飞鸟写作是一个非常好用、靠谱且方便的论文写作工具&#xff0c;可以帮助用户高效地完成论文写作任务。无论是学生还是研究人员&#xff0c;使用飞鸟写作都能极大地提升写作效率和质量。 首先&#xff0c;飞鸟写作具有强大的查重降重功能&#xff0c;能够帮助用户快速检测论文…

【数据库】数据库学习(MySQL,Oracle,PostgreSql)

数据库语句学习 摘要&#xff1a;文章主要内容是数据库语句的基本操作&#xff0c;以及一些基本的数据库标准库函数 重点&#xff1a;SQL语句对大小写不敏感 数据库操作语句 SELECT - 从数据库表中获取数据UPDATE - 更新数据库表中的数据DELETE - 从数据库表中删除数据INSERT …

OSPF的扩展配置

1、认证——直连的邻居或邻接关系间,进行认证配置后,5种数据包中均携带身份核实的密码&#xff0c;且华为设备会对更新信息进行加密--前提为认证方式选择密文认证 1)接口认证 [r1-GigabitEthernet0/0/1ospf authentication-mode md5 1 cipher 123456 直连的邻居间秘钥和编号、模…

行列视(RCV)能否同时支持多个实时数据库?

行列视&#xff08;RCV&#xff09;生产数据应用系统在设计时考虑到了多数据源的需求&#xff0c;因此它支持同时连接多个实时数据库。这意味着用户可以轻松地将来自不同实时数据库的数据整合到行列视&#xff08;RCV&#xff09;系统中&#xff0c;实现数据的集中管理和分析。…

Android14 WMS-窗口添加流程(二)-Server端

上一篇文章讲到了Client端窗口添加流程&#xff0c;本文接着上文往下讲&#xff0c;讲一下Server端的窗口添加流程。 1. WindowManagerService#grantInputChannel 由grantInputChannel我们可以看到&#xff0c;Client端传入了session对象&#xff0c; 发起者Uid-callingUid&am…

X.509数字证书

在国密标准文件《GMT 0015-2012 基于SM2密码算法的数字证书格式》里有对X.509数字证书格式的详细描述。 数字证书的定义 由国家认可的&#xff0c;具有权威性、可信性和公正性的第三方证书认证机构&#xff08;CA&#xff09;进行数字签名的一个可信的数字化文件。 数字证书…

YOLOv10代码详细介绍(附录训练教程和权重)

前言 YOLOv10 是清华大学研究人员在 UltralyticsPython 清华大学的研究人员在 YOLOv10软件包的基础上&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制&#xff08;NMS&#xff09;和优化各种模型…

【几何角度】感知机

本质&#xff1a;将n维空间中的一些点线性投影到一维&#xff0c;在一维轴上找一个阈值对这些点进行二分类。 程序&#xff1a; import numpy as npclass Perceptron:def __init__(self, learning_rate0.01, n_iterations1000):self.learning_rate learning_rateself.n_itera…

【Python基础】一文搞懂:Python 中 “requirements.txt“ 文件生成和使用

文章目录 1 引言2 什么是 requirements.txt&#xff1f;3 如何生成 requirements.txt&#xff1f;3.1 方法一&#xff1a;使用 pip freeze3.2 方法二&#xff1a;使用 pipreqs 3.3 使用 pip freeze 和 pipreqs 的对比4 如何使用 requirements.txt&#xff1f;4.1 安装依赖4.2 更…

[从零开发JS应用] 如何在VScode中配置Javascript环境,常见的调试方法有哪些?

一、安装VSCode和Node.js 记录环境配置&#xff1a;本文配置的环境主要针对单独JS文件的断点调试&#xff0c;主要是为了调试LeetCode里面的代码。 首先在官网下载对应的版本&#xff1a;https://nodejs.org/en/ 开始安装&#xff0c;可以自定义选择安装路径。 这里选择Add Pa…

【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk

背景&#xff1a;部分客户需求将自己网站打包成app&#xff0c;供用户在浏览器安装使用、 网页网址快速生成app 准备材料操作流程第一步&#xff1a;打开HBuilder X新建项目第二步创建Wap2App项目第三步修改App图标第四步发布app第五步查看apk 准备材料 1.需要打包的网页 2.ap…