PHP 反序列化漏洞

ops/2025/2/28 8:34:37/

PHP 反序列化漏洞,主要由于不当处理用户可控的序列化数据导致代码执行或敏感操作。

1. 序列化与反序列化

  • 序列化:将对象转换为字符串(serialize()

    class User {public $username = 'admin';public $isAdmin = true;
    }
    $obj = new User();
    echo serialize($obj); 
    // 输出:O:4:"User":2:{s:8:"username";s:5:"admin";s:7:"isAdmin";b:1;}
  • 反序列化:将字符串还原为对象(unserialize()

    $data = 'O:4:"User":2:{s:8:"username";s:5:"admin";s:7:"isAdmin";b:1;}';
    $obj = unserialize($data);
    echo $obj->username; // 输出 "admin"

2. 漏洞原理

当反序列化用户可控的数据时,攻击者可构造恶意对象,触发类中的魔术方法(如 __destruct()__wakeup()),执行任意代码。

漏洞示例
class FileHandler {public $filename;public function __destruct() {// 对象销毁时删除文件unlink($this->filename);}
}// 攻击者构造的恶意序列化数据
$payload = 'O:11:"FileHandler":1:{s:8:"filename";s:9:"/etc/passwd";}';
$obj = unserialize($payload); // 反序列化触发 __destruct(),删除系统文件

3. 常见攻击向量

  • 魔术方法自动调用

    • __construct():创建对象时调用
    • __destruct():对象销毁时调用
    • __wakeup():反序列化时调用
    • __toString():对象被当作字符串使用时调用
  • POP链攻击:通过多个类的魔术方法串联实现复杂利用(Property-Oriented Programming)。

4. 防御措施

(1) 避免反序列化不可信数据

使用 json_encode()/json_decode() 替代序列化。

(2) 数据签名验证

对序列化数据进行签名,确保未被篡改:

$data = '序列化数据';
$signature = hash_hmac('sha256', $data, 'secret_key');
// 验证时检查签名是否匹配
(3) 限制反序列化类

PHP 7.0+ 可使用 allowed_classes 参数限制允许的类:

$obj = unserialize($data, ['allowed_classes' => ['SafeClass']]);
(4) 禁用危险魔术方法

检查代码中是否存在敏感魔术方法,避免在反序列化时触发危险操作。

(5) 更新PHP版本

及时修复已知漏洞(如 PHP 反序列化漏洞 CVE-2019-11043)。

5. 漏洞检测工具

  • 静态分析:使用 phpcsRIPS 等工具扫描代码。
  • 动态测试:通过模糊测试(Fuzzing)验证反序列化点是否可控。

http://www.ppmy.cn/ops/161904.html

相关文章

嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)

目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…

接口自动化测试框架搭建整体步骤

需求分析与规划 在需求分析阶段,测试需与开发对齐接口定义、业务逻辑、数据依赖及异常处理规则,通过会议、文档共享和代码审查确保测试范围与开发实现一致。 1. 接口范围确定 数据来源: 开发提供的 Swagger/OpenAPI 文档(主来源&a…

无框架简易Java服务器后端

不使用像 Spring Boot 这样的框架,使用 Java 内置的HttpServer(从 Java 1.7 开始引入)来创建一个简单的 Web 后端,处理xxxx/test/query接口,接收 JSON 请求体并返回字符串响应。 示例代码: import com.go…

线性调频率连续波雷达测距、测速、成像(一)

系列文章目录 《SAR学习笔记》 《77GHz线性调频连续波雷达》 《信号类型(雷达)——连续波雷达(二)》 《后向投影算法(BPA)-SAR成像算法系列(二)》 文章目录 前言 一、LFMCW雷达…

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…

【Python爬虫(76)】解锁Python爬虫新境界:基于深度学习的网页内容提取

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…

Windows系统PyTorch环境配置

0、前言 深度学习为什么要配置GPU? GPU(图形处理单元)最初是为图形渲染而设计的,它们擅长处理大量并行计算任务。深度学习模型,特别是卷积神经网络(CNN)和循环神经网络(RNN&#xf…

el-input实现金额输入

需求&#xff1a;想要实现一个输入金额的el-input&#xff0c;限制只能输入数字和一个小数点。失焦数字转千分位&#xff0c;聚焦转为数字&#xff0c;超过最大值&#xff0c;红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…