什么是phar

PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和其他资源(例如图像,样式表等)捆绑到一个归档文件中来实现应用程序和库的分发。

每个归档都包含三个部分:

  1. 存根(Stub) —— 一个可以引导归档的PHP文件。存根必须包含__HALT_COMPILER();语句,并且默认存根拥有在不启用PHAR扩展的情况下运行PHAR文件的能力。
  2. 清单 —— 清单详细说明了存归档的内容。
  3. 文件内容 —— 归档中包含的原始文件

另外,PHAR格式还可以包括用于验证PHAR完整性的签名。

Phar 归档可由 PHP 本身处理,因此不需要使用额外的工具来创建或使用,使用php脚本就能创建或提取它。

生成一个phar文件

首先开启php.ini的phar扩展

image-20200602174306490

示例:

创建两个文件如下

image-20200602181914631

createphar.php代码:

1
2
3
4
5
<?php
$phar = new Phar('phar.phar');//生成新的phar文件
$phar->buildFromDirectory(__DIR__.'\\');//源码目录
//$phar->compressFiles(Phar::GZ);可以选择添加压缩方式
$phar->setStub($phar->createDefaultStub('index.php'));//设置存根,没有设置这个存根文件的话,默认寻找的文件为index.php。

生成

image-20200602183306239

我们可以直接加载phar文件的单独文件:

image-20200602183654213

image-20200602183718537

当然也能还原(无压缩方式)

1
2
3
<?php
$phar = new Phar('phar.phar');
$phar->extractTo('huanyuan');//路径

image-20200602184946407

phar对象注入

PHP文件操作允许使用各种URL协议去访问文件路径如data://,zlib://,或php://,phar://也是其中一种。

成因

Phar文件可以包含序列化格式的元数据,扒张图

1.png

所以如果我们通过 phar:// 对我们现有的Phar文件执行文件操作,则其序列化元数据将被反序列化。假如攻击者可以在ìnclude()fopen()file_get_contents()file()等操作中控制完整的文件路径,就可以通过phar://注入并获得代码执行,造成严重的安全漏洞。

实战:[CISCN2019 华北赛区 Day1 Web1]Dropbox