php反序列化入门
一,php面向对象。
1.面向对象:
以“对象”伪中心的编程思想,把要解决的问题分解成对象,简单理解为套用模版,注重结果。
2.面向过程:
以“整体事件”为中心的编程思想,把解决问题的步骤分析出来,用函数依次实现,注重过程。
3.类:
将数据和数据上的操作封装在一起
内部构成:成员变量(属性)+成员函数(方法)
注:属性在外部是不可以直接看到的,但是可以访问。
(1)创建一个类
其中var的作用是声明变量
$this为预定义

(2)new
new的作用是讲之前定义的类实体化,类里先定义了,才能在后面赋值
注意,之前的声明变量并不会执行出任何内容,包括上面的echo,因为上面定义的变量里面没有任何内容。只有将类实例化成对象,并给参数赋值,再打印输出,才会有值输出。

4.类的修饰符
分为三类。用了修饰符以后,可调用范围会改变,详情如下,可省略,默认为是public

私有属性(privade)只有父类可以用

5.继承:
继承性是子类自动共享父类数据和方法的机制,如上hero2对父类hero的继承可以表达出身高
二.序列化基础知识
1.什么是序列化?
序列化是将对象或数组转化为方便存储、传输的字符串,php使用serialize()函数将对象序列化; 序列化只作用于对象的成员属性,不序列化成员方法
2.反序列化值
各类型值的serialize序列化:
空字符 null -> N; 空
整型 123 -> i:123; int
浮点型 1.5 -> d:1.5; double
boolean型 true -> b:1;
boolean型 false -> b:0;
字符串 “haha” -> s:4:"haha"; string型6个单位长
3.数组,对应规则如下。
4.对象序列化
只作用于对象的成员属性(变量),不序列化成员方法(函数),

在如下代码比较中,我们可以看得到,对象pub的内容benben被输出,但是方法(函数)却没有任何改变。

5.私有属性的序列化
会在变量前加上%00(占一个位)+类名+%00,这里的%00不是空格,而是null空。

在下面的示例中,在原变量名pub之前加上了类名test,表面上看只有7个字符,但是实际加上了两个%00,就使得长度变为了9

假若你将内容用url编码输出,你就可以看到他的真实样子,在test前后都有%00

6.保护属性的序列化
会在变量名前加上%00*%00

7.成员属性调用对象过程及序列化(pop链序列化)
对象的成员属性是另一个对象,序列化值出现嵌套。
三,反序列化
1.反序列化后的内容是一个对象。
如下代码展示序列化

整个过程是:对象通过序列化变为字符串,而反序列化让字符串变为对象。
2.反序列化生成的对象的值,与原来的类的预定义无关,而是由反序列化的值提供。

在上面的示例中,$c输出的值没有按序列化的值(xxxxxx)输出,而是以反序列化的值hellow提供,因此,在输出的$c中,$c的值为hellow。
3.反序列化不能触发类里的成员方法,如果想用,需要调用(除魔术方法外)。
在下面的示例中,我们调用了之前的成员方法,使得$c的输出 输出username的内容,但是在反序列化之后,username的内容改变了(上一条的原因)因此,最后输出的内容就是hellow
附:为什么会有反序列化漏洞?
因为在反序列化过程中unserialize()的值可控,通过更改这个值,得到需要的代码
8.反序列化漏洞的利用
eg1:

四.魔术方法
问1.什么是魔术方法?
魔术方法是预先定义好的,在特定情况下自动触发的行为方法
问2.魔术方法的作用?
在反序列化过程中unserialize()的值可控,通过更改这个值,得到需要的代码,通过调用方法,触发代码执行。
1._construct()
构造函数,在实例化一个对象的时候,首先执行的方法,实例化对象时触发构造函数_construct()
在如下示例中,并没有调用方法,而是由魔术方法触发的。

2.__destruct()
析构函数,在对象的所有引用被删除或者当对象被显示销毁时执行的魔术方法。
在如下示例中,
实例化对象结束以后,代码完全销毁,触发析构函数__destruct() ,这是第一次触发
反序列化本身也是对象,反序列化生成的对象在释放时触发构析函数,这是第二次触发

附:析构函数示例
在如下示例中,我们构造了一个payload,通过get传参,使得代码触发构析函数,构析函数再执行eval,eval触发代码。

3.__sleep()
序列化serialize会检查是否存在一个__sleep()的魔术方法,如果存在,会先调用该魔术方法,再进行序列化; 这个函数可以用来清理对象,冰饭换一个数组,这个数组里面理包含有该被序列化的变量名;如果没有返还任何内容,则null被序列化,并产生一个E_NOTICE级别的错误。
触发时机:serialize之前
功能:对象被序列化之前触发,返还需要被序列化储存的成员属性,删除不必要的属性。
参数:成员属性
返还值:需要被序列化储存的成员属性
在一下示例中,第12行_sleep 函数返还的变量是username和nickname,在代码执行序列化之前,检查了_sleep()函数,发现过滤了password,因此,在序列化之后,password就没有了。

4._weakup()
反序列化unserializezai在执行之前会检查是否有_weakup(),如果有,则先调用_weakup(),预先准备对象需要的资源
作用:预先准备对象资源,返回void,常用于反序列化中重新建立与数据库的链接,或者执行其他初始化操作。
触发时机:反序列化unserialize之前
如下示例
在输出中,可以看到,_weakup()将username的值a赋给了password,并且展示出了类名(User)和password的属性(private)。在源代码中,$user_ser没有将password和order赋值,因为触发了_weakup(),在输出中就加上了password的值为a,order没有值,就返回NULL。

五.pop链的构造思路知识——构造代码写poc代码
六.反序列化逃逸
七.session反序列化漏洞
八.phar反序列化
九,题目示例
[SWPUCTF 2021 新生赛]ez_unserialize
1.打开题目,只有一张动图,源码里也没有什么

2.用御剑扫一下,依次访问,在robot.txt中找到一个c145s.php


3.再次访问,出现真正的题目,是一串代码,意思是满足admin=admin&passwd=ctf,触发__destruct()函数,就可以得到flag

相关文章:
php反序列化入门
一,php面向对象。 1.面向对象: 以“对象”伪中心的编程思想,把要解决的问题分解成对象,简单理解为套用模版,注重结果。 2.面向过程: 以“整体事件”为中心的编程思想,把解决问题的步骤分析出…...
嵌入式 Linux LED 驱动开发实验学习
I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 GPIO1_IO03 这个引脚上,进行这个驱动开发实验之前,需要了解下地址映射。 地址映射 MMU 全称叫做 MemoryManage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU&#x…...
C++:多态
文章目录 多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写override 和 final重载、重写(覆盖)、重定义(隐藏)的对比 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理 单继承和多继承关系的虚函数表单继承…...
Java事务入门:从基础概念到初步实践
Java事务入门:从基础概念到初步实践 引言1. Java事务基础概念1.1 什么是事务?1.2 为什么需要事务? 2. Java事务管理2.1 JDBC 的事务管理2.2 Spring 事务管理2.2.1 Spring JDBC2.2.1.1 添加 Spring 配置2.2.1.2 添加业务代码并测试验证 2.2.2…...
鸿蒙轻内核M核源码分析系列七 动态内存Dynamic Memory
内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包括内存的初始化、分配以及释放。 在系统运行过程中,内存管理模块通过对内存的申请/释放来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优&#x…...
从头搭hadoop集群--分布式hadoop集群搭建
模板虚拟机安装配置见博文:https://blog.csdn.net/weixin_66158110/article/details/139236148 配置文件信息如下:https://pan.baidu.com/s/1074eD5aNVugEPcjwVvi9jA?pwdl1xq(提取码:l1xq) hadoop版本:h…...
odoo10 权限控制用户只允许看到自己的字段
假设一个小区管理员用户,只想看到自己小区的信息。 首先添加一个用户信息选项卡界面,如下图的 用户 > 隶属信息: 我们在自己创建的user模块中,views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…...
图解Mysql索引原理
概述 是什么 索引像是一本书的目录列表,能根据目录快速的找到具体的书本内容,也就是加快了数据库的查询速度索引本质是一个数据结构索引是在存储引擎层,而不是服务器层实现的,所以,并没有统一的索引标准,…...
Arduino网页服务器:如何将Arduino开发板用作Web服务器
大家好,我是咕噜铁蛋!今天,我将和大家分享一个有趣且实用的项目——如何使用Arduino开发板搭建一个简易的网页服务器。通过这个项目,你可以将Arduino连接到互联网,并通过网页控制或查询Arduino的状态。 一、项目背景与…...
大模型日报2024-06-05
大模型日报 2024-06-05 大模型资讯 AI气象预测取得重大进展:单台桌面电脑即可运行全球天气模型 摘要: 一项新的人工智能天气预测模型已经取得重大进展,该模型能够在一台普通的桌面电脑上运行,预测全球天气。这意味着即使没有复杂的物理计算&a…...
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关
角色扮演:在系统指令中告诉千问你需要它扮演的角色,即可沉浸式和该角色对话交流语言风格:简单调整 LLM 的语言风格任务设定:比如旅行规划,小红书文案助手这样的专项任务处理System message 也可以被用于规定 LLM 的答复…...
Spring系统学习 - Spring入门
什么是Spring? Spring翻译过来就是春天的意思,字面意思,冠以Spring的意思就是想表示使用这个框架,代表程序员的春天来了,实际上就是让开发更加简单方便,实际上Spring确实做到了。 官网地址:ht…...
Priority_queue
一、priority_queue的介绍和使用 1.1 priority_queue的介绍 1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 2.优先队列类似于堆, 在堆中可以随时插入元素, 并且只能检索最大堆…...
SpringMVC:获取请求数据
1. 通过RequestParma注解接收 /**** value和name都可以使用,互为别名* 如果此处设置了需要什么参数而前端请求时没有提供则会报400(请求参数不一致错误)* required参数用于设置该参数是否为必须传递参数,默认为true必须传递* defa…...
深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)
stanford cs231 编程作业之SVM分类器 写在最前面: 深度学习,或者是广义上的任何学习,都是“行千里路”胜过“读万卷书”的学识。这两天光是学了斯坦福cs231n的一些基础理论,越往后学越觉得没什么。但听的云里雾里的地方也越来越多…...
【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)
1.一直以来想写下基于scikit-learn训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架模型算法包相关技术点及经验。 3.欢迎批评指正,欢迎互三,跪谢一键…...
Rethinking overlooked aspects in vision-language models
探讨多模态视觉语言模型的一些有趣结论欢迎关注 CVHub!https://mp.weixin.qq.com/s/zouNu-g-33_7JoX3Uscxtw1.Introduction 多模态模型架构上的变化不大,数据的差距比较大,输入分辨率和输入llm的视觉token大小是比较关键的,适配器,VIT和语言模型则不是那么关键。InternVL-…...
【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
C语言—字符函数和字符串函数
1.字符分类函数 C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例:将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件:ctype.h C语言提供了2…...
爬山算法的详细介绍
爬山算法(Hill Climbing Algorithm)是一种基于启发式的局部搜索算法,常用于解决优化问题。它的核心思想是从当前解的邻域中选择能够使目标函数值最大(或最小)的下一个解作为当前解,直到找到一个满足问题要求…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
