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)是一种基于启发式的局部搜索算法,常用于解决优化问题。它的核心思想是从当前解的邻域中选择能够使目标函数值最大(或最小)的下一个解作为当前解,直到找到一个满足问题要求…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...