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. 对输入数据进行严格的验证和消毒。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

松下的台灯值得入手吗?书客、飞利浦真实横评大分享!

我们都知道&#xff0c;无论是学习还是工作&#xff0c;都需要一个良好的照明环境&#xff0c;而台灯就是我们日常生活中非常重要的照明工具。它不仅能够提供额外的光线&#xff0c;还能减少眼睛疲劳&#xff0c;提高我们的工作和学习效率。 所以&#xff0c;选购一款合适的台…

240622_昇思学习打卡-Day4-ResNet50迁移学习

240622_昇思学习打卡-Day4-ResNet50迁移学习 我们对事物的认知都是一点一点积累出来的&#xff0c;往往借助已经认识过的东西&#xff0c;可以更好地理解和认识新的有关联的东西。比如一个人会骑自行车&#xff0c;我们让他去骑摩托车他也很快就能学会&#xff0c;比如已经学会…

电脑提醒事项怎么显示在桌面

在繁忙的工作节奏中&#xff0c;我们经常会面临多项任务同时进行的情况。为了确保不遗漏任何重要事务&#xff0c;设置电脑提醒事项就显得尤为重要。想象一下&#xff0c;当你正忙于一个项目时&#xff0c;电脑屏幕突然弹出一个提醒&#xff0c;告诉你接下来的会议时间&#xf…

梦想CAD二次开发

1.mxdraw简介 mxdraw是一个HTML5 Canvas JavaScript框架&#xff0c;它在THREE.js的基础上扩展开发&#xff0c;为用户提供了一套在前端绘图更为方便&#xff0c;快捷&#xff0c;高效率的解决方案&#xff0c;mxdraw的实质为一个前端二维绘图平台。你可以使用mxdraw在画布上绘…

实力认可!安全狗受聘成为福建省网信系统2024年度网络安全技术支撑单位

6月6日&#xff0c;福建省委网信办组织召开福建省网信系统2024年度网络安全技术支撑单位座谈会。 作为国内云原生安全领导厂商&#xff0c;安全狗也受邀出席此次活动。 省委宣传部副部长、省委网信办主任、省互联网信息办公室主任张远出席会议并颁发支撑单位证书。安全狗凭借出…

如何用Vue3和Plotly.js绘制动态3D图表?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Plotly.js: 使用Vue.js动态加载数据并绘制图表 应用场景 在数据可视化应用中&#xff0c;需要将数据动态加载到图表中并进行实时更新。本文将展示如何使用Plotly.js和Vue.js实现这一功能&#xff0c;从加载外…

java基于ssm+jsp 电子商城系统

1管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码进行登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入电子商城系统可以查看个人中心、用户管理、医生管理、药品信息管理、线上诊疗管理、医生信息管理、管理员管理、论坛管理、系统管理、订单管…

snowflake 不再是个数据仓库公司了

标题先上结论&#xff0c;为啥这么认为&#xff0c;且听接下来道来。 snowflake 非常成功&#xff0c;开创了云数仓先河&#xff0c;至今在数仓架构上也是相对比较先进的&#xff0c;国内一堆模仿的公司&#xff0c;传统上我们会认为 snowflake 肯定是一家数据仓库公司。不过最…

智能工业网络,需要何种工业以太网交换机作为支撑?

随着工业企业数字化及信息化的进一步深化升级&#xff0c;工业领域相关控制及信息系统的业务类型不断增加、复杂性不断提升&#xff0c;工业控制网络与工业信息网络也呈现融合趋势&#xff0c;具备支持多业务、多协议、多厂商设备和数据的互联互通、共网承载以及高质量传输能力…

vue-router的学习

vue-router 基于Vue做单页面应用时&#xff0c;vue-router可以帮我们将url地址和组件绑定&#xff0c;在我们切换路由组件时&#xff0c;url改变&#xff0c;页面无需从服务端重新加载&#xff0c;即不用刷新&#xff0c;打个比方&#xff0c;我们用美团外卖点外卖时&#xff…

一文带你彻底搞懂设计模式之单例模式!!由浅入深,图文并茂,超超超详细的单例模式讲解!!

一文带你彻底搞懂设计模式之单例模式&#xff01; 一、什么是单例模式&#xff1f;单例模式分类饿汉式创建单例对象懒汉式创建单例对象 多问一个为什么&#xff1f; 二、为什么要有单例模式&#xff1f;使用单例模式的原因单例模式的应用场景 三、多线程下的单例模式饿汉式懒汉…

【高级篇】InnoDB引擎深入:核心机制与实战优化(十五)

引言 在探索了MySQL集群与分布式技术之后,我们进入了数据库引擎的核心地带——InnoDB。作为MySQL的默认存储引擎,InnoDB凭借其对事务的支持、行级锁定、高效的恢复机制以及复杂的内存管理,成为众多应用场景的首选。本章,我们将深入InnoDB的内部机制,透彻理解锁管理、事务…

【C++】动态内存管理new和delete

文章目录 一、C的内存管理方式二、new和delete的用法1.操作内置类型2.操作自定义内置类型 三、new和delete的底层实现1.operator new和operator delete函数2.new和delete的实现原理 四、定位new表达式五、malloc/free和new/delete的区别 一、C的内存管理方式 之前在C语言的动态…

找不到vcomp140.dll怎么办,总结多种解决方法

​在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcomp140.dll丢失”。那么&#xff0c;vcomp140.dll是什么&#xff1f;它为什么会丢失&#xff1f;丢失后对电脑有什么影响&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍vc…

leetcode 动态规划(基础版)单词拆分

题目&#xff1a; 题解&#xff1a; 一种可行的dp做法是基于完全背包问题&#xff0c;将s看成是一个背包&#xff0c;wordDict看作是物品&#xff0c;然后往s中放入物品判断最终是否可以变为给定的s即可。这道题和上一题都用到了在dp如何枚举连续子串和状态表示&#xff1a;枚…

一个 API 客户端和一份 TS 学习手册

第75期&#xff1a; Insomnia&#xff1a;超好看的 API 客户端 项目介绍&#xff1a; 一款适用于 GraphQL、REST、WebSockets 和 gRPC 的开源 API 客户端&#xff0c;颜值超高。 跨平台&#xff0c;支持 Mac、Windows 和 Linux。但不支持网页版&#xff0c;需要下载客户端。…

如何借助ai(文心一言)获取tushare的数据

1. 准备工作 确保已安装python &#xff0c;安装Tushare库 和文心一言的地址&#xff08;文心一言&#xff09;&#xff1a; 注册Tushare账号并获取Token&#xff1a;在Tushare官方网站注册账号&#xff0c;并获取个人Token。如下 tushare地址&#xff1a;&#xff08;点击即…

PD快充诱骗芯片工作原理,USB-C充电器出不来电压是什么原因?

一般使用Type-C接口的充电器基本上都是采用新的快充协议——PD快充协议&#xff0c;它不同于以前的USB-A的QC协议&#xff0c;这种协议&#xff0c;默认是没有快充电压输出的&#xff0c;VBUS和GND是0V。 所以&#xff0c;我们可以使用电阻的方式&#xff08;电流小&#xff09…

【Apache Doris】如何实现高并发点查?(原理+实践全析)

【Apache Doris】如何实现高并发点查&#xff1f;&#xff08;原理实践全析&#xff09; 一、背景说明二、原理介绍三、环境信息四、Jmeter初始化五、参数预调六、用例准备七、高并发实测八、影响因素九、总结 本文主要分享 Apache Doris 是如何实现高并发点查的&#xff0c;以…

突破SaaS产品运营困境:多渠道运营如何集中管理?

随着数字化时代的到来&#xff0c;SaaS&#xff08;软件即服务&#xff09;产品已成为企业日常运营不可或缺的工具。然而&#xff0c;在竞争激烈的市场环境下&#xff0c;SaaS产品运营越来越重视多渠道、多平台布局&#xff0c;以更广泛地触及潜在用户&#xff0c;然而&#xf…