php--序列化与反序列化

🎼个人主页:金灰

😎作者简介:一名简单的大一学生;易编橙·终身成长社群的嘉宾.✨

专注网络空间安全服务,期待与您的交流分享~

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

🍊易编橙·终身成长社群🍊 : http://t.csdnimg.cn/iSLaP 期待您的加入~

免责声明:本文仅做分享...

目录

php手册

在线php运行

序列化与反序列化

注意: 

结论:

反序列化时,php-->

问题

魔术方法总结:

分类:

php的反序列化漏洞:

1 绕过__wakeup方法

条件:

绕过方法:

2 绕过 +号正则匹配

3 引用绕过相等

4 16进制绕过

5 exception 绕过

6 php反序列化字符逃逸

例: 


php手册

PHP: PHP 手册 - Manual


在线php运行

php在线运行,在线工具,在线编译IDE_w3cschool  

 


序列化与反序列化

序列化是  将 一个对象 变为一个可以传输的字符串.  serialize(对象)  返回  序列化后的字符串.
反序列化 就是将 一个可以传输的字符串 变为一个 可以调用的对象.   unserialize(反序列化后的字符串) 返回 对象.


O:10:"normalUser":4:{s:5:"score";N;s:8:"username";s:5:"admin";s:14:"userpassword";s:8:"admin666";s:11:"*userType";N;}url编码->O%3A10%3A%22normalUser%22%3A4%3A%7Bs%3A5%3A%22score%22%3BN%3Bs%3A8%3A%22username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00user%00password%22%3Bs%3A8%3A%22admin666%22%3Bs%3A11%3A%22%00%2A%00userType%22%3BN%3B%7D

 


注意: 

如果属性权限为private,那么序列化后,存储的属性名字为   %00+类名+%00+属性名
如果属性权限为protected,那么序列化后,存储的属性名字为   %00+*+%00+属性名

 


<?php
class Animal{public $name;​    function eat(){
​        echo "i can eat";
​    }​    function sleep(){
​        echo "i can sleep";
​    }
}
$a = new Animal();
echo serialize($a);
//可将php.exe的目录添加到全局变量里面实现快速利用.// 对象-> 字符串
O:6:"Animal":1:{s:4:"name";N;}
//O:6:" ":1:{s:4:"name";N;}
解释(翻译)---------------->
// O 有一个对象
// : 下一句
// 6 名字是6个字符
// : 下一句
//"Animal" 内容是Animal
// : 下一句
// 1 对象有一个属性
// : 下一句
// { 对象属性描述开始
// s 属性是一个字符串 string
// : 下一句
// 4 属性名字是4个字符
// : 下一句
// "name" 属性名字是name
// ; 属性名字描述完了
// N 没有值,值为null
// ; 属性值描述完了
// } 对象属性描述完了
将次字符串进行描述----------->class Animal{public $name;
}

结论:

反序列化和类的方法无关,不能把类方法序列化.


反序列化时,php-->

// 1 找到反序列化字符串规定的类名字 
// 2 实例化这个类,但是不是调用构造方法
// 3 有了实例化的类对象,对它的属性进行赋值
// 4 执行魔术方法
// 5 返回构造好的对象

问题

1 接口是否可以序列化?  no
//接口类是不含属性的,不参与反序列化.
2 匿名类是否可以序列化? no
//匿名类没有名字(类名)呀,构造不了,,,
3 trait 是否可以序列化? no

魔术方法总结:

1 魔术方法是一类 类的方法.
2 会在序列化和反序列化及其他特殊情况下,自动执行.

分类:

1 __construct 
在实例化一个对象(new)时,会被自动调用.
传参时至少要保持参数的个数相同.
不允许重复声明(一个类只能用一个构造方法)
可以作为非public权限属性的初始化2 __sleep 和 __wakeup方法
序列化时自动调用__sleep方法
返回数组中有属性名才进行反序列化	__sleep3 __destruct方法 析构方法
类对象将要销毁,也就是脚本执行完毕后执行清理工作时自动执行
绕过:
强制将系统的进程kill	
(终端 	浏览器  调用的进程不一样)4 __call 和__callstatic对象执行类不存在的方法时候,会自动调用__call方法直接执行类的不存在的静态方法时,会自动调用__callstatic方法5 __get __set 和 __isset __unset魔术方法
__get  对不可访问属性或不存在属性 进行访问引用时自动调用__set 对不可访问属性或不存在属性 进行写入时自动调用isset($obj->zhi);
unset($obj->zhi);6 __tostring 方法
类的实例和字符串 进行拼接或者作为字符串引用时,会自动调用__tostring方法7 __invoke方法
当类的实例被作为函数名字执行的时候,会自动调用__invoke方法
(将一个对象直接作为函数调用)8 __set_state 方法
文档中说 执行 var_export 时自动调用
var_export($obj);https://www.php.net/manual/zh/language.oop5.magic.php9 __debugInfo 方法的属性修饰符
执行var_dump时自动调用10 __clone方法
当使用clone关键字 ,clone一个对象时,会自动调用.

php的反序列化漏洞:

1 有反序列化提交的入口
2 被反序列化的类的魔术方法,有可能被利用
 

1 绕过__wakeup方法

条件:

1 php5至php5.6.25 之间的版本可以绕过
2 php7到php7.0.10 之间的版本可以绕过

绕过方法:

反序列化字符串中表示属性数量的值  大于 大括号内实际属性的数量时 ,wakeup方法会被绕过.
(将属性的个数改大,大大大)
 


2 绕过 +号正则匹配

参数有过滤,不让输入  O:数字  的形式,试图防止反序列化某个对象
-->
O:数字 改为  O:+数字  就可以绕过上面的O:数字 过滤
O:+数字
O:+数字
例:
将环境移到本地,进行赋值,得payload,然后POST提交值.+  = %2b详情见--php源码 var.c 里面.

 


3 引用绕过相等

使用&符号表示两个变量指向相同的内存引用地址.(原理和内存地址有关)$this->password = &$this->secrect;
// 永远指向右边变量.

4 16进制绕过

反序列化后的字符串 不能出现某个关键单词时,可以使用大S绕过O:8:"backdoor":1:{s:4:"name";s:10:"phpinfo();";}
O:8:"backdoor":1:{S:4:"n\97me";s:10:"phpinfo();";}
//ASCII$data='O:8:"backdoor":1:{S:4:"n\97me";s:15:"system(\'calc\');";}';

5 exception 绕过

不影响析构方法执行.
0属性-->
data='O:8:"backdoor":0:{};

6 php反序列化字符逃逸

1 可以控制某个类中的属性值
2 间接控制了某个类的反序列化字符串
3 由于存在无脑过滤,字符增减,造成 描述中字符串的长度 和实际的不一致
4 从而能够逃逸出若干个字符,实现字符可控,从而闭合前面的双引号
5 实现反序列化字符串的完全可控

例: 

<?phpclass backdoor{public $m;public $c;}$b = new backdoor();$b->m = 'system";s:1:"c";s:7:"notepad";}';
$b->c = 'calc';echo serialize($b);//O:8:"backdoor":2:{s:1:"m";s:6:"system";s:1:"c";s:4:"calc";}
//O:8:"backdoor":2:{s:1:"m";s:6:"system";s:1:"c";s:7:"notepad";}";s:1:"c";s:4:"calc";}
//";s:1:"c";s:7:"notepad";}
//";s:1:"c";s:4:"calc";}//-->
//O:8:"backdoor":2:{s:1:"m";s:31:"system";s:1:"c";s:7:"notepad";}";s:1:"c";s:4:"calc";}
//                                system";s:1:"c";s:7:"notepad";}//如果代码对提交的反序列化的字符串进行了过滤,将里面的内容进行了替换
//比如 fuck -> loveu  (每多一个字符,就相当于加到后面一个字符可控)
//未修正字符长度时,再进行反序列化,就会出现逃逸情况.

 


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

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

相关文章

机器学习 | 计算分类算法的ROC和AUC曲线以随机森林为例

受试者工作特征&#xff08;ROC&#xff09;曲线和曲线下面积&#xff08;AUC&#xff09;是常用的分类算法评价指标&#xff0c;本文将讨论如何计算随机森林分类器的ROC 和 AUC。 ROC 和 AUC是量化二分类区分阳性和阴性类别能力的度量。ROC曲线是针对不同分类阈值的真阳性率&…

LabVIEW座舱照明测控系统

用LabVIEW开发飞机座舱照明测控系统。系统通过集成可靠的硬件与软件技术&#xff0c;提高了测试的效率和自动化水平&#xff0c;确保了飞行安全性和舒适性。体现了系统的设计思路、主要组成部分、工作原理及实际应用效果。 项目背景 飞机座舱照明系统是航空电子系统中至关重要…

【Spring Boot教程:从入门到精通】掌握Spring Boot开发技巧与窍门(三)-配置git环境和项目创建

主要介绍了如何创建一个Springboot项目以及运行Springboot项目访问内部的html页面&#xff01;&#xff01;&#xff01; 文章目录 前言 配置git环境 创建项目 ​编辑 在SpringBoot中解决跨域问题 配置Vue 安装Nodejs 安装vue/cli 启动vue自带的图形化项目管理界面 总结 前言 …

谷粒商城实战笔记-63-商品服务-API-品牌管理-OSS获取服务端签名

文章目录 一&#xff0c;创建第三方服务模块thrid-party1&#xff0c;创建一个名为gulimall-third-party的模块2&#xff0c;nacos上创建third-party命名空间&#xff0c;用来管理这个服务的所有配置3&#xff0c;配置pom文件4&#xff0c;配置文件5&#xff0c;单元测试6&…

oracle登录报“ORA-27101: shared memory realm does not exist”

oracle登录报“ORA-27101: shared memory realm does not exist” 问题&#xff1a; 1、使用ip:1521/服务名方式连库报错" ORA-27101: shared memory realm does not exist Linux-x86_64 Error: 2: No such file or directory" 2、sqlplus XX/密码 可以登录数据库 …

【Apache Doris】数据副本问题排查指南

【Apache Doris】数据副本问题排查指南 一、问题现象二、问题定位三、问题处理 本文主要分享Doris中数据副本异常的问题现象、问题定位以及如何处理此类问题。 一、问题现象 问题日志 查询报错 Failed to initialize storage reader, tablet{tablet_id}.xxx.xxx问题说明 查…

c++ 内存管理(newdeletedelete[])

因为在c里面新增了类&#xff0c;所以我们在有时候会用malloc来创建类&#xff0c;但是这种创建只是单纯的开辟空间&#xff0c;没有什么默认构造的。同时free也是free的表面&#xff0c;如果类里面带有指针指向堆区的成员变量就会free不干净。 所以我们c增加了new delete和de…

HTML常用的转义字符——怎么在网页中写“<div></div>”?

一、问题描述 如果需要在网页中写“<div></div>”怎么办呢&#xff1f; 使用转义字符 如果直接写“<div></div>”&#xff0c;编译器会把它翻译为块&#xff0c;类似的&#xff0c;其他的标签也是如此&#xff0c;所以如果要在网页中写类似于“<div…

LeetCode_122(买卖股票的最佳时机)

public int maxProfit(int[] prices) {int ans 0;//int prices[] {7,1,5,3,6,4};for(int i1;i<prices.length;i){ansMath.max(0,prices[i]-prices[i-1]);}return ans;}

Unity DOTS中的world

Unity DOTS中的world 注册销毁逻辑自定义创建逻辑创建world创建system group插入player loopReference DOTS中&#xff0c;world是一组entity的集合。entity的ID在其自身的世界中是唯一的。每个world都拥有一个EntityManager&#xff0c;可以用它来创建、销毁和修改world中的en…

[Spring] MyBatis操作数据库(基础)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Python酷库之旅-第三方库Pandas(045)

目录 一、用法精讲 156、pandas.Series.count方法 156-1、语法 156-2、参数 156-3、功能 156-4、返回值 156-5、说明 156-6、用法 156-6-1、数据准备 156-6-2、代码示例 156-6-3、结果输出 157、pandas.Series.cov方法 157-1、语法 157-2、参数 157-3、功能 15…

分布式系统常见软件架构模式

常见的分布式软件架构 Peer-to-Peer (P2P) PatternAPI Gateway PatternPub-Sub (Publish-Subscribe)Request-Response PatternEvent Sourcing PatternETL (Extract, Transform, Load) PatternBatching PatternStreaming Processing PatternOrchestration Pattern总结 先上个图&…

.h264 .h265 压缩率的直观感受

1.资源文件 https://download.csdn.net/download/twicave/89579327 上面是.264 .265和原始的YUV420文件&#xff0c;各自的大小。 2.转换工具&#xff1a; 2.1 .h264 .h265互转 可以使用ffmpeg工具&#xff1a;Builds - CODEX FFMPEG gyan.dev 命令行参数&#xff1a; …

liteos定时器回调时间过长造成死机问题解决思路

项目需求 原代码是稳定的&#xff0c;现我实现EMQ平台断开连接的时候&#xff0c;把HSL的模拟点位数据采集到网关&#xff0c;然后存入Flash&#xff0c;当EMQ平台连接的时候&#xff0c;把Flash里面的点位数据放在消息队列里面&#xff0c;不影响实时采集。 核心1&#xff1a…

godot新建项目及设置外部编辑器为vscode

一、新建项目 初次打开界面如下所示&#xff0c;点击取消按钮先关闭掉默认弹出的框 点击①新建弹出中间的弹窗②中填入项目的名称 ③中设置项目的存储路径&#xff0c;点击箭头所指浏览按钮&#xff0c;会弹出如下所示窗口 根据图中所示可以选择或新建自己的游戏存储路径&…

鸿蒙(HarmonyOS)自定义Dialog实现时间选择控件

一、操作环境 操作系统: Windows 11 专业版、IDE:DevEco Studio 3.1.1 Release、SDK:HarmonyOS 3.1.0&#xff08;API 9&#xff09; 二、效果图 三、代码 SelectedDateDialog.ets文件/*** 时间选择*/ CustomDialog export struct SelectedDateDialog {State selectedDate:…

Linux系统上安装Redis

百度网盘&#xff1a; 通过网盘分享的文件&#xff1a;redis_linux 链接: https://pan.baidu.com/s/1ZcECygWA15pQWCuiVdjCtg?pwd8888 提取码: 8888 1.把安装包拖拽到/ruanjian/redis/文件夹中&#xff08;自己选择&#xff09; 2.进入压缩包所在文件夹&#xff0c;解压压缩…

ROM修改进阶教程------修改rom 开机自动安装指定apk 自启脚本完整步骤解析

rom修改的初期认识 在解包修改系统分区过程中。很多客户需求刷完rom后自动安装指定apk。这种与内置apk有区别。而且一些极个别apk无法内置。今天对这种修改rom刷入机型后第一次启动后自动安装指定apk的需求做个步骤解析。 在前期博文中我有做过说明。官方系统固件解…

按图搜索新体验:阿里巴巴拍立淘API返回值详解

阿里巴巴拍立淘API是一项基于图片搜索的商品搜索服务&#xff0c;它允许用户通过上传商品图片&#xff0c;系统自动识别图片中的商品信息&#xff0c;并返回与之相关的搜索结果。以下是对阿里巴巴拍立淘API返回值的详细解析&#xff1a; 一、主要返回值内容 商品信息 商品列表…