什么是phar
PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和其他资源(例如图像,样式表等)捆绑到一个归档文件中来实现应用程序和库的分发。
每个归档都包含三个部分:
- 存根(Stub) —— 一个可以引导归档的PHP文件。存根必须包含
__HALT_COMPILER();
语句,并且默认存根拥有在不启用PHAR扩展的情况下运行PHAR文件的能力。- 清单 —— 清单详细说明了存归档的内容。
- 文件内容 —— 归档中包含的原始文件
另外,PHAR格式还可以包括用于验证PHAR完整性的签名。
Phar 归档可由 PHP 本身处理,因此不需要使用额外的工具来创建或使用,使用php脚本就能创建或提取它。
生成一个phar文件
首先开启php.ini的phar扩展
示例:
创建两个文件如下
createphar.php代码:
1 |
|
生成
我们可以直接加载phar文件的单独文件:
当然也能还原(无压缩方式)
1 |
|
phar对象注入
PHP文件操作允许使用各种URL协议去访问文件路径如data://,zlib://,或php://,phar://也是其中一种。
成因
Phar文件可以包含序列化格式的元数据,扒张图
所以如果我们通过 phar:// 对我们现有的Phar文件执行文件操作,则其序列化元数据将被反序列化。假如攻击者可以在ìnclude()
,fopen()
,file_get_contents()
,file()
等操作中控制完整的文件路径,就可以通过phar://
注入并获得代码执行,造成严重的安全漏洞。