Web渗透:php反序列化漏洞

反序列化漏洞(Deserialization Vulnerability)是一种在应用程序处理数据的过程中,因不安全的反序列化操作引发的安全漏洞;反序列化是指将序列化的数据(通常是字节流或字符串)转换回对象的过程,如果反序列化操作未进行适当的验证或消毒,攻击者可以通过精心构造的恶意数据进行攻击,执行任意代码、获取敏感信息、或破坏数据的完整性。本文我们就来探讨一下反序列化漏洞产生的原因和漏洞利用方法。

序列化与反序列化

要掌握反序列化漏洞的产生原理肯定首先要明白序列化和反序列究竟是什么样的过程,这会儿我们就先针对这两个概念进行说明:

①序列化:序列化(Serialization)是一种将对象的状态转换为可存储或可传输格式的过程。

通过序列化,程序中的复杂数据结构(如对象、数组、数据结构等)可以转换为字节流、字符串或其他格式,从而能够存储到文件中、发送到远程服务器或者传输通过网络。

②反序列化:反序列化(Deserialization)是序列化的逆过程,即将序列化的字节流或字符串恢复成原来的对象或数据结构。

接下来我们就通过PHP代码来针对这两个过程进行演示:

①序列化例子
<?php
class Person {public $name;public $age;
​public function __construct($name, $age) {$this->name = $name;$this->age = $age;}
}
​
$person = new Person("Alice", 30);
$serializedData = serialize($person);
​
echo "Serialized Data: " . $serializedData;
?>

class Person:定义一个名为Person的类;$name、$age:定义Person类的公共属性name和age

public function __construct($name, $age):定义一个构造函数,用于初始化对象的nameage属性。

接着使用new关键字创建一个Person类的实例,传入名字Alice和年龄30作为参数,初始化nameage属性;在初始化对象完成后调用serialize函数,将Person对象转换为一个字符串。这一过程称为序列化,生成的字符串可以用于存储或传输。

解释我们使用echo语句输出序列化后的字符串,输出结果:运行这段代码将输出类似以下内容的字符串,这个字符串表示序列化后的Person对象:

Serialized Data: O:6:"Person":2:{s:4:"name";s:5:"Alice";s:3:"age";i:30;}

O:6:"Person":2: 表示一个Person对象,类名长度为6,包含2个属性。

{s:4:"name";s:5:"Alice";s:3:"age";i:30;} 是对象的属性及其对应的值:

  • s:4:"name";s:5:"Alice"; 表示字符串属性name的值为Alice

  • s:3:"age";i:30; 表示整数属性age的值为30

②反序列化例子
<?php
class Person {public $name;public $age;
​public function __construct($name, $age) {$this->name = $name;$this->age = $age;}
}
​
$serializedData = 'O:6:"Person":2:{s:4:"name";s:5:"Alice";s:3:"age";i:30;}';
$person = unserialize($serializedData);
​
echo "Name: " . $person->name . "\n";
echo "Age: " . $person->age;
?>

这个示例中,我们使用unserialize函数将序列化的字符串恢复为原始的Person对象,并输出该对象的Name属性值和Age属性值;最后输出的结果为:

Name: Alice Age: 30

序列化和反序列化是软件开发中非常重要且常用的技术,主要用于数据的持久化存储和跨网络传输;正因为常用所以有着不好的编程习惯的开发者们可能经常会在代码中编写一些不安全的序列化代码;不安全的序列化和反序列化主要是指在处理用户输入或不受信任的数据时,没有进行适当的验证和消毒,导致安全漏洞----反序列化漏洞,接下去我们就以pikachu靶场中的反序列化漏洞关卡针对反序列化漏洞的产生原理进行讨论。

示例:

1.打开关卡可以看到页面中存在一个输入框用以接收序列化数据:

输入带有恶意代码的序列化数据:

O:1:"S":1:{s:4:"test";s:29:"<script>alert("xss")</script>";}

此时页面出现弹窗:

payload构造:

这个关卡构造攻击语句的前提是要知道源码中存在的数据结构,而这些内容在当前页面中是没有的,我们需要从站点源码中去获取该数据结构以构造我们的序列化攻击语句,这个时候我们就来看一下当前关卡的相关代码:

class S{var $test = "pikachu";function __construct(){echo $this->test;}
}
​
$html='';
if(isset($_POST['o'])){$s = $_POST['o'];if(!@$unser = unserialize($s)){$html.="<p>大兄弟,来点劲爆点儿的!</p>";}else{$html.="<p>{$unser->test}</p>";}
​
}

class S:定义一个名为S的类;var $test = "pikachu";:定义一个公共变量$test,并初始化为字符串"pikachu"function __construct():定义类的构造函数。在创建S类的实例时会自动调用此函数。echo $this->test;:构造函数输出类的属性$test的值(即"pikachu")。

$html = '';:初始化一个空字符串变量$html,用于存储最终的HTML输出。

if (isset($_POST['o'])):检查是否通过POST请求传递了参数o

$s = $_POST['o'];:将POST请求中的参数o的值赋给变量$s

if (!@$unser = unserialize($s))

  • unserialize($s):尝试反序列化变量$s。反序列化是将序列化的字符串转换回对象。

  • @$unser:使用@符号抑制反序列化过程中可能产生的警告或错误。

  • if (!@$unser = unserialize($s)):如果反序列化失败($unserfalse),则执行大括号内的代码块。

如果反序列化失败,向$html追加一段HTML内容,显示“大兄弟,来点劲爆点儿的!”;如果反序列化成功,将反序列化得到的对象的test属性值插入到HTML中,并追加到$html;

这个时候我们来看一下我们构造的Payload:

O:1:"S":1:{s:4:"test";s:29:"<script>alert("xss")</script>";}

根据源码我们构造了序列化数据;这是一个S对象,他的成员变量test的值为<script>alert("xss")</script>;在后端程序接收到我们的输入后会将数据进行反序列化,接着将test值输入至页面中并进行解析执行产生弹窗;至此攻击成功!

这个代码存在反序列化漏洞;因为它直接对用户提供的数据进行反序列化,攻击者在获得代码中相关的数据结构后就可以构造恶意的序列化数据,导致任意代码执行或其他安全问题,要防止这种漏洞,应该避免对不可信数据进行反序列化,或者严格限制反序列化的类,并进行数据验证。

安全建议
  1. 避免反序列化用户输入的数据。

  2. 如果必须反序列化,使用允许列表限制可反序列化的类。

  3. 对输入数据进行严格的验证和消毒。

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

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

相关文章

安装lora微调大模型

打开终端&#xff08;在Unix或macOS上&#xff09;或命令提示符/Anaconda Prompt&#xff08;在Windows上&#xff09;。 创建一个名为lora的虚拟环境并指定Python版本为3.9。 conda create --name lora python3.9激活新创建的虚拟环境。 conda activate lora克隆项目。 git …

【MySQL备份】lvm-snapshot篇

目录 1.简介 1.1.如何工作 1.2.应用场景 1.3.注意事项 1.4.优缺点 2.为什么选择lvm快照备份&#xff1f; 3.创建LVM 3.1.操作流程 3.2.正常安装MySQL后进行备份 3.3.MySQL运行一段时间后进行备份 3.3.1.准备lvm及文件系统//先添加一块磁盘 3.3.2.将数据迁移到LVM …

MySQL学习(5):SQL语句之数据查询语言:DQL

1.DQL语法 select 字段列表 from 表名列表 #DQL是可以进行多表查询的 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数 2.基本查询&#xff08;select&#xff09; 2.1查询多字段 select 字段1,字段2,字段3,......fro…

基于Volov7的安全帽检测系统

1 项目介绍 1.1 摘要 随着工业化和城市化的迅猛推进&#xff0c;工作场所的安全管理愈发受到重视。安全帽作为保护工人头部安全的关键装备&#xff0c;其实时监测和检测的重要性不言而喻。本文提出并深入研究了基于YOLOv7算法的安全帽佩戴检测技术&#xff0c;该技术旨在实现…

Kotlin/Android中执行HTTP请求

如何在Kotlin/Android中执行简单的HTTP请求

Spring Boot 使用 Mail 实现登录邮箱验证

Spring Boot 使用 Mail 实现登录邮箱验证 引言 在现代的 Web 应用中&#xff0c;用户验证是一个至关重要的功能。电子邮件验证可以有效地防止虚假注册&#xff0c;并确保用户提供的是有效的邮箱地址。在这篇文章中&#xff0c;我们将详细介绍如何使用 Spring Boot 实现用户注…

Day.js

Day.js 是什么&#xff1f; Day.js是一个极简的JavaScript库&#xff0c;可以为现代浏览器解析、验证、操作和显示日期和时间。 Day.js中文网 为什么要使用Day.js &#xff1f; 因为Day.js文件只有2KB左右&#xff0c;下载、解析和执行的JavaScript更少&#xff0c;为代码留下更…

作物检测:YOLOv8+SwanLab

1. 项目介绍 基于深度学习的作物检测通过精准管理和数据驱动决策&#xff0c;能够提高作物产量和质量&#xff0c;优化农业资源利用&#xff0c;推动农业自动化进程&#xff0c;从而保障粮食安全。目前&#xff0c;作物检测领域大多针对单类作物进行检测。因此&#xff0c;本项…

SDIO学习(2)--SD卡 2.0协议

本文参考文档&#xff1a; 《SD Specifications Part 1 Physical Layer Simplified Specification Version 2.00》 1 SD卡简介 1.1 SD卡概念 1.2 SD卡外形和接口 Clk&#xff1a;时钟线&#xff0c;由SDIO主机产生 CMD&#xff1a;命令控制线&#xff0c;SDIO主机通过改…

AI技术在现代社会中的广泛应用及其影响

目录 前言&#xff1a; 一、AI技术在医疗领域的应用 二、AI技术在教育领域的应用 三、AI技术在工业领域的应用 四、AI技术在金融领域的应用 五、AI技术在生活领域的应用 前言&#xff1a; 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术逐渐成为人…

基于C++标准库实现定时器类

基于C标准库实现定时器类 定时器类是多线程编程中经常设计到的工具类 简单的定时器原理其实很简单&#xff08;是不是有点GNU is not unix的味道;&#xff09;&#xff1a; 创建一个新线程在那个线程里等待等待指定时长后做任务 python标准库中就有这么一个定时器类&#xf…

iOS Swift5 视频播放 能播放各种编码格式的视频的第三方库

1.VLC for ios: MobileVLCKit VLC for ios - github 2.IJKPlayer: IJKMediaFramework 基于 FFmpeg IJKPlayer - github

升级!升级!升级!MobPush基础标签推送全新升级,助力开发者精细化运营

“广播推送点击率不高&#xff0c;会员转化差” “新用户拉新后留存不高&#xff0c;次留、3日留存不达标” “用户的复购较低&#xff0c;黏性不高&#xff0c;导致GMV未达预期” 我们总是会听到运营人员关于目标达成过程中遇到这样或者那样的问题。这些问题汇总起来就回到…

vue3 el-table手动选中某一行、设置默认选中某一行

选中某一行用的是el-table的toggleRowSelection方法&#xff0c;用来切换某一行的选中状态 <template><el-table :data"tableData" ref"myTable" selection-change"handleSelectionChange"><el-table-column type"selectio…

STM32 HAL库 外部中断 实现按键控制LED亮灭

目录 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 2、NVIC嵌套向量中断控制器 3、EXTI外部中断 4、项目的硬件排线 5、STM32CUBE_MX配置 6、HAL库代码 7、实际效果 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 实现LED亮灭控制有很多方式&#xff0c;其中…

公文出错事非小,这些公文写作的常见错误,你中过招吗?

公文是企事业单位、相关部门内外沟通交流的重要工具&#xff0c;不少“笔杆子”经常需要与公文打交道&#xff0c;每天会接触大量的公文。然而在公文撰写的细微之处&#xff0c;稍有不慎&#xff0c;便可能犯下一些常见的错误。这些错误如同蚁穴&#xff0c;虽小却足以破坏公文…

YAML文件格式详解及应用

YAML文件格式详解及应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 什么是YAML&#xff1f; YAML&#xff08;YAML Ain’t Markup Language&#xff09;…

stm32cubemx,adc采样的几种方总结,触发获取adc值的方法dma timer trigger中断

stm32cubemx adc采样的几种方总结&#xff0c;触发获取adc值的方法 timer trigger中断 方法1&#xff0c;软件触发方法2&#xff1a;,Timer触发ADC采集通过DMA搬运 触发获取adc值的方法 Regular Conversion launched by software 软件触发 调用函数即可触发ADC转换 Timer X Cap…

悲观锁、乐观锁与分布式锁详解及Redisson应用

目录 1. 悲观锁&#xff08;Pessimistic Lock&#xff09;2. 乐观锁&#xff08;Optimistic Lock&#xff09;3. Redis分布式锁4. Redisson锁 在多线程或多进程环境下&#xff0c;为了保证数据的一致性&#xff0c;锁机制扮演着至关重要的角色。本文将深入探讨悲观锁、乐观锁的…

使用Python进行数据分析

哈喽,大家好,我是木头左! 14.1 Python在数据分析中的优势 Python作为一种简单易学、功能强大的编程语言,已经成为了数据分析领域的首选工具。它的优势主要体现在以下几个方面: 简洁高效:Python语法简洁明了,易于阅读和编写,能够快速实现复杂的数据分析任务。丰富的库支…