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():格式表达错误导致魔术方法触发

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

背景介绍 前面介绍过 有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。 因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务 RagFlow 的完整实现流程&…

上交提出TrustGAIN,提出6G网络中可信AIGC新模式!

月16日至18日,2024全球6G技术大会在南京召开。会上,全球移动通信标准制定组织3GPP(第三代合作伙伴计划)的3位联席主席分享了3GPP6G标准时间表: 2024年9月,启动6G业务需求研究; 2025年6月&…

FastReport 主子表关系

代码中只需要绑定主表的数据就可以,子表的数据会通过报表中的关连关系自动到数据库中带出。 using CloudSaaS.DB.Handler; using CloudSaaS.Model; using CloudSaaS.DAL; using FastReport; using FastReport.Web; using System; using System.Collections.Generic;…

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前,加密货币总市值为1.32万亿,BTC占比54.41%。 本周行情呈现震荡上行的态势,BTC在5月15日-16日,有一波大的拉升,周末为震荡行情。BTC现价为67125美元。 上涨的主要原因:美国4月CPI为3…

Oracle创建用户时提示ORA-65096:公用用户名或角色名无效

Oracle创建用户时提示“ORA-65096:公用用户名或角色名无效” 如下图所示: 解决方法:在新增用户名前面加上C##或者c##就可以解决无效问题,具体什么原因还不清楚,需要再研究一下。

JS 中怎么删除数组元素?有哪几种方法?

正文开始之前推荐一位宝藏博主免费分享的学习教程,学起来! 编号学习链接1Cesium: 保姆级教程+源码示例2openlayers: 保姆级教程+源码示例3Leaflet: 保姆级教程+源码示例4MapboxGL: 保姆级教程+源码示例splice() JavaScript中的splice()方法是一个内置的数组对象函数, 用于…

vr数字成果展在线展示突破用户传统认知

想要轻松搭建一个充满互动与创意的3D数字展厅吗?vr互动数字展厅搭建编辑器将是您的不二之选!华锐视点3D云展平台提供的vr互动数字展厅搭建编辑器将空间重建与互动制作完美结合,让您轻松实现3D空间的搭建与互动营销制作。 在vr互动数字展厅搭建编辑器的帮助下&#…

SpringBoot 返回值 i18n 自动处理

定义基础通用类 首先定义一波错误码:ResultCode Getter AllArgsConstructor public enum ResultCode {SUCCESS(200, "请求成功", "request.success"),Fail(400, "请求失败", "request.failed"),PASSWORD_NOT_MATCH(1000…

独家揭秘!Amazon、lazada、Shopee测评自养号,新手也能秒变高手!

近年来,随着国内卖家涌入跨境电商平台,市场竞争愈加激烈。为了迅速占领市场,测评变得至关重要。然而,真人测评供不应求,服务商账号质量不一,且存在高权重账号稀缺和黑卡下单风险。因此,许多大卖…

为什么选择CleanMyMac软件呢?推荐理由

你是否曾经遇到过这样的问题:电脑运行缓慢,存储空间不足,不知道如何清理垃圾文件?别担心,我们为你找到了解决方案——CleanMyMac软件。这款强大的工具可以帮助你轻松解决这些问题,让你的电脑焕然一新&#…

VirtualBox+Ubuntu22.10+Docker+ROS2

Docker 拉取ros2镜像 docker pull osrf/ros:foxy-desktop 运行 docker run -it --nameros2 -p 50022:22 osrf/ros:foxy-desktop 进入容器安装组件 apt-get update apt-get install vim apt-get install git apt-get install net-tools # 安装ssh apt-get install openssh…

【FPGA】正原子XC7A35T

25_实战篇:时钟IP核MMCM(第一讲:时钟资源讲解)_哔哩哔哩_bilibili 25时钟IP核MMCM 7系列的时钟资源 bufferG bufferR 下图可视为一个FPGA(官方手册) 4 MRCC,SRCC 全局时钟:MRCC P 差分时…

Java入门-“第九大数据类型“-字符串

字符串String **字符串(String)**是指多个字符连接起来组合成的字符序列,例如”中国”,“hello world”都为字符串。注意对比字符,字符只能存储一个字符使用单引号’中’,’国’。 字符串底层源码 字符串定义 创建String对象 St…

2024年5月软考成绩什么时候出?附查询方式

2024年5月软考成绩查询时间及查询方式: 查询时间:预计在2024年7月上旬进行。 查询方式: 方式一:登陆中国计算机技术职业资格网(www.ruankao.org.cn),点击报名系统,输入注册账号和…

nodejs中使用ffmpeg零基础教程(electron+vue3)

同学们可以私信我加入学习群! 正文开始 前言一、多方案对比二、ffmpeg各插件简介三、使用ffmpeg-static插件四、使用fluent-ffmpeg插件五、如果使用ai,可能会踩的坑5.1第一个坑5.2第二个坑5.3第三个坑 总结 前言 最近想要把自己写的一些知识点&#xff…

【NumPy】全面解析NumPy的astype函数:高效数据类型转换指南

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

VUE-watch和watchEffect的区别

区别简短扼要地说: watch-官方定义:侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。是需要指定监听的数据,并且只有在响应式数据变化的时候去执行 watchEffect-官方定义:立即运行一个函数&#xff0…

mybatis关联查询使用resultMap查询到了多条,结果返回一条。

今天在写代码时候,遇到了一个很让我费解的问题,在使用关联查询的时候,在明明数据库里面,已经查到了两条数据,结果resultMap这个集合里面,就只返回一条数据。 数据库的SQL: mybatis的xml里面的r…

公告:关于博主的重要通知

大家好,我是博主夏目。 本期不分享知识,博主想说明一下博主的一些重要提示。 分享的内容,从不收费,也未向任何人进行收费。 意在分享知识,传播文化,结交更多志同道合的朋友。 截至目前,从未…

多系统集成的项目周期为何普遍较长?

在现代企业的运营中,各种信息系统的集成已成为提升效率和竞争力的关键。然而,当工厂的ERP系统需要与MES、SRM、WMS、CRM等其他系统集成时,项目周期往往长达一年以上,这不仅耗费时间、人力和财力,还可能影响企业的正常运…