5.1.10. Phar¶
5.1.10.1. 简介¶
Phar(PHP Archive)文件是一种打包格式,将PHP代码文件和其他资源放入一个文件中来实现应用程序和库的分发。
在来自Secarma的安全研究员Sam Thomas在18年的Black Hat上提出后利用方式后,开始受到广泛的关注。
Phar可利用是因为Phar以序列化的形式存储用户自定义的meta-data,而以流的形式打开的时候,会自动反序列化,从而触发对应的攻击载荷。
5.1.10.2. Phar文件结构¶
Phar由四个部分组成,分别是 stub
/ manifest
/ 文件内容 / 签名。 stub 需要 __HALT_COMPILER();
这个调用在PHP代码中。
manifest 包含压缩文件的权限、属性、序列化形式存储的meta-data等信息,这是攻击的核心部分,主要就是解析Phar时对meta-data的反序列化。
5.1.10.3. 原理¶
phar的实现在 php-src/ext/phar/phar.c
中,主要是 phar_parse_metadata
函数在解析phar文件时调用了 php_var_unserialize
,因而造成问题。
而php在文件流处理过程中会调用 _php_stream_stat_path
(/main/streams/streams.c) ,而后间接调用 phar_wrapper_stat
,所以大量的文件操作函数都可以触发phar的反序列问题。
目前已知部分的触发函数有:
fileatime / filectime / filemtime /stat / fileinode / fileowner / filegroup / fileperms / file / file_get_contents / readfile / fopen / file_exists / is_dir / is_executable / is_file / is_link / is_readable / is_writeable / is_writable / parse_ini_file / unlink / copy / exif_thumbnail / exif_imagetype / imageloadfont / imagecreatefrom*** / hash_hmac_file / hash_file / hash_update_file / md5_file / sha1_file / get_meta_tags / get_headers / getimagesize / getimagesizefromstring