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…

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

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

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

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

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

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

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

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

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

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

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

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

页面加载不出来,报错[@umijs/runtime] load component failed

问题描述 页面加载不出来数据,一直在旋转,控制台输出内容如下: 原因分析: 之前页面是没有问题的,在写当前页面突然出现页面加载不出来,控制台报错,主要是页面引入了这行代码报错 import { …

MX Component基础使用(多点位读取,多点位写入)

步骤,先连接PLC,然后在填入对应的点位 D10 然后去读取。 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;us…

边缘计算网关的主要功能有哪些?天拓四方

随着物联网(IoT)的快速发展和普及,边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备,边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

民国漫画杂志《时代漫画》第13期.PDF

时代漫画13.PDF: https://url03.ctfile.com/f/1779803-1247458360-14efab?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

数组的定义、顺序存储及特殊矩阵的存储

目录 一、数组的定义 1.1概念 1.2抽象数据类型定义 二、数组的顺序存储 2.1一维数组元素的存储位置 2.2二维数组元素的存储位置 2.3三维数组元素的存储位置 三、特殊矩阵的压缩存储 3.1相关概念 3.2对称矩阵 3.3三角矩阵 3.4对角矩阵(带状矩阵&#xff0…

【机器学习300问】102、什么是混淆矩阵?

一、混淆矩阵的定义 混淆矩阵是一种用于评估分类模型性能的评估指标。当模型对数据进行预测并将数据分配到预定义的类别时,混淆矩阵提供了一种直观的方式来总结这些预测与数据实际类别之间的对应关系。具体来说,它是一个表格。 二、分类模型性能评估一级…

js setTimeout、setInterval、promise、async await执行顺序梳理

基础知识 async: 关键字用于标记一个函数为异步函数,该函数中有一个或多个promise对象,需要等待执行完成后才会继续执行。 await:关键字,用于等待一个promise对象执行完,并返回其中的值,只能在async函数内部使用。可…

云服务器平台AutoDL--基本介绍与使用感受

因为课程作业需要复现DreamBooth,找了几个教程之后,发现了AutoDL这个好东西,芜湖~ 相关概念 以下回答来自于ChatGPT。 云计算平台:云服务器平台是提供按需计算资源和服务的在线平台,通常包括存储、处理能力、数据库、…

System32文件夹千万不能删除,看完这篇你就知道为什么了

序言 C:\Windows\System32目录是Windows操作系统的关键部分,重要的系统文件存储在该目录中。网上的一些恶作剧者可能会告诉你删除它,但你不应该尝试去操作,如果你尝试的话,我们会告诉你会发生什么。 什么是System32文件夹 位于C:\Windows\System32的System32文件夹是所有…

【代码随想录】面试常考类型之动态规划01背包

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记,为了之后方便观看 不同的二叉搜索树 96. 不同的二叉搜索树 - 力扣(LeetCode) 通过举例子发现重叠子问题 代码很简单,主要是思路问题&#xff0…

Windows内核函数 - 创建关闭注册表

在驱动程序的开发中,经常会用到对注册表的操作。与Win32的API不同,DDK提供另外一套对注册表操作的相关函数。首先明确一下注册表里的几个概念,避免在后面混淆。 图1 注册表概念 有5个概念需要重申一下: * 注册表项: 注…

unity接入live2d

在bilibili上找到一个教程,首先注意一点,你直接导入那个sdk,并且打开示例,显示的模型是有问题的,你需要调整模型上脚本的一个枚举值,调整它的渲染顺序是front z to我看教程时候,很多老师都没有提…