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曲线是针对不同分类阈值的真阳性率&…

云计算day13

一、Git 概述 Git 是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的&#xff0c;最初被设计用于 Linux 内核的开发。Git 允许开发 人员跟踪和管理代码的版本&#xff0c;并且可以在不同的开发人员之间进行协作。 Github 用的就…

C#:通用方法总结—第4集

大家好&#xff0c;今天接着写我们的通用方法总结分享。 下面是今天要分享的通用方法&#xff1a; &#xff08;1&#xff09;通过输入信息&#xff0c;返回合并的单元格内容。这个方法比较好用&#xff0c;适合在有合并的单元格时候使用。 /// <summary> /// 返回合并…

LabVIEW座舱照明测控系统

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

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

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

数组常见的实例方法

这里写目录标题 一级目录二级目录三级目录 一、数组中map方法&#xff0c;迭代数组1.作用&#xff1a;2.语法&#xff1a;3.注意: 二、遍历数组foreach方法三、筛选数组filter1.语法2.主要使用场景3.例子 四、累计器reduce五、数组中join方法1.作用&#xff1a;2.语法:3.参数 六…

谷粒商城实战笔记-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/密码 可以登录数据库 …

Gateway网关分布式微服务认证鉴权

文章目录 学习链接微服务认证方案 学习链接 实战干货&#xff01;Spring Cloud Gateway 整合 OAuth2.0 实现分布式统一认证授权&#xff01; spring-cloud-gateway-oauth2的github代码地址 - 已克隆到gitee 微服务权限终极解决方案&#xff0c;Spring Cloud Gateway Oauth2…

【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与…

HTML 跨平台使用同一套 emoji (twemoji) + 实现 emoji 选择

背景: 网页需要显示和发送带 emoji 表情的文本消息(为方便理解, 以 whatsapp 为例, 实际开发中待定) 同时, 要求不同系统打开网页时, 看到的都是同一套 emoji , 避免同一个 emoji 在不同电脑上显示不同 概述: 引入 twemoji 库文件把网页版 wa 的 emoji 全部复制下来新增 emo…

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…

Spring Boot 集成 Kafka

Spring Boot 与 Kafka 集成是实现高效消息传递和数据流处理的常见方式。Spring Boot 提供了简化 Kafka 配置和使用的功能&#xff0c;使得集成过程变得更加直观和高效。以下是 Spring Boot 集成 Kafka 的详细步骤&#xff0c;包括配置、生产者和消费者的实现以及一些高级特性。…

docker配置上网代理获取镜像

一、添docker子配置档设置 1、创建目录 mkdir /etc/systemd/system/docker.service.d 2、创建http-proxy.conf文件,增加以下内容 cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF [Service] Environment“HTTP_PROXYhttp://192.168.0.2:8118…

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

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