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,一经查实,立即删除!

相关文章

【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;该技术旨在实现…

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主机通过改…

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

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

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

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

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;虽小却足以破坏公文…

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…

Python基于逻辑回归分类模型、决策树分类模型、LightGBM分类模型和XGBoost分类模型实现车辆贷款违约预测项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着经济的发展和人民生活水平的提高&#xff0c;汽车消费在居民消费中所占比例逐渐增加&#xff0c;汽…

克服指标管理痛点,实现数据价值最大化

在当下的企业管理中&#xff0c;由于数据量的激增&#xff0c;管理方式逐渐从基于经验转向基于数据。在此过程中&#xff0c;我们能够通过数据探查业务情况、分析数据&#xff0c;从而获取更优的决策支持数据。这通常通过数据报表或分析平台来实现&#xff0c;对于临时性场景&a…

护眼大路灯哪个牌子好用?五款好用的护眼灯分享

护眼大路灯哪个牌子好用&#xff1f;现在的孩子从幼儿园开始就开始学习&#xff0c;面临的用眼压力就很大&#xff0c;但想要孩子视力不受影响&#xff0c;大路灯是得好好安排起来&#xff0c;但动辄大几千的护眼灯真是让我们这些普通家庭的家长望而却步&#xff0c;有没有好用…

控制系统稳定性常见策略

提升控制系统稳定性是确保系统可靠运行的关键&#xff0c;以下是一些常见策略&#xff1a; 1. 控制算法优化 优化控制算法是提升系统稳定性的核心方法之一。常见的控制算法包括PID控制、模糊控制、自适应控制等。通过调整和优化这些算法的参数&#xff0c;可以显著提高系统的…

填报高考志愿时,学校、专业和城市怎么选择呢?

我的观点是&#xff1a; 专业>城市>学校 专业是兴趣导向&#xff0c;符合自己的价值观&#xff0c;失去了这种驱动力的专业学习&#xff0c;会变得非常艰难的&#xff0c;而且没有竞争力&#xff0c;所以我的排序第一位是专业。 其次是城市&#xff0c;最好是一线城市&…

划重点!炒伦敦金看k线图的要点

对于刚刚开始参与伦敦金交易&#xff0c;还在学习如何看K线的投资者来说&#xff0c;掌握一些看k线图的要点&#xff0c;对于更好地分析市场的行情走势&#xff0c;找到有利的入场机很有帮助&#xff0c;以下是一些关键的建议&#xff0c;希望能够供大家参考。 K线有阳线和阴线…

Coze搭建《测测你的本命宠物》

前言 本文讲解如何从零开始&#xff0c;使用扣子平台去搭建《测测你的本命宠物》 《测测你的本命宠物》&#xff1a;测测你的本命宠物 - 扣子 AI Bot (coze.cn) 欢迎大家去体验一下&#xff01;&#xff01;&#xff01; 正文 接下来我们开始讲解制作这个bot的流程吧&#…

rclone 上传资料到 onedrive 遇到限速问题解决

原因分析 可能和脚本参数设置有关系,我的参数是: rclone copy "F:\阿里云盘\6666\局域网" "od:影视" --ignore-existing -u -v -P --transfers20 --ignore-errors --buffer-size128M --check-first --checkers10 --drive-acknowledge-abuse差不多8G大小的…

如何使得Macos的剪切板感知fileURL并当fileURL被执行paste 动作时 回调到某个监听的函数 从而来填充file content

问题及尝试&#xff1a; 我在做一个跨平台文件拷贝的功能&#xff0c;文件可能是从其他操作系统比如Linux 或者Windows 拷贝到Macos上&#xff0c; 但是我试过所有可以hook NSPasteboard的方法&#xff0c;确实没有找到可以监听macos 剪切板的方法&#xff0c;因为fileURL 确实…