PHP文件包含漏洞新姿势:除了php://filter,别忘了phar://这个“压缩包杀手”
PHP文件包含漏洞深度解析phar伪协议的隐蔽杀伤力在Web安全领域文件包含漏洞一直是攻击者最青睐的入口点之一。大多数开发者对php://filter这类常见伪协议保持警惕却往往忽视了phar://这个隐藏在压缩包中的沉默杀手。本文将带您深入剖析phar伪协议的攻击原理、实战利用手法以及防御策略。1. phar协议的本质与工作机制pharPHP Archive是PHP中类似于Java JAR文件的打包格式。自PHP 5.3起phar扩展默认启用无需额外配置即可使用。这种设计初衷是为了方便PHP应用的打包分发却意外成为了安全漏洞的温床。phar文件由四个核心部分组成Stub文件头标识必须包含__HALT_COMPILER();语句Manifest存储压缩文件的元信息包括可序列化的metadataFile Contents实际压缩的文件内容Signature可选文件签名验证// 典型phar文件生成示例 $phar new Phar(exploit.phar); $phar-startBuffering(); $phar-setStub(?php __HALT_COMPILER(); ?); $phar-addFromString(shell.php, ?php system($_GET[cmd]); ?); $phar-stopBuffering();2. phar攻击的实战利用场景2.1 结合文件上传漏洞攻击者常通过以下步骤实施攻击制作包含恶意代码的phar文件可伪装为图片或压缩包利用文件上传功能将phar文件传至服务器通过文件包含漏洞触发phar解析攻击链文件上传 → phar存储 → 文件包含触发 → RCE2.2 绕过常见防御措施phar攻击具有极强的隐蔽性后缀名欺骗可将.phar改为.jpg/.zip等任意后缀内容伪装在stub部分添加图片文件头如GIF89a无文件包含某些场景下甚至不需要显式的include/require// 伪装成GIF的phar文件 $phar-setStub(GIF89a?php __HALT_COMPILER(); ?);3. 与其他伪协议的对比分析协议类型触发条件利用难度常见防御措施php://filter需要文件读取功能低禁用伪协议phar://需要文件包含上传中文件类型严格校验data://需要allow_url_include高关闭URL包含zip://需要特定压缩格式中禁用压缩协议4. 真实环境下的防御策略4.1 开发层面的防护禁用危险函数在php.ini中设置disable_functions phar_open, phar_file_exists严格校验上传文件$finfo new finfo(FILEINFO_MIME_TYPE); if (!in_array($finfo-file($_FILES[file][tmp_name]), [image/jpeg, image/png])) { die(Invalid file type); }限制文件包含参数使用白名单控制包含路径4.2 运维层面的加固升级到PHP 7.0并设置phar.readonlyOn定期审计服务器上的可疑文件使用Web应用防火墙(WAF)拦截可疑请求5. 高级攻击技巧与演变现代phar攻击已发展出更复杂的变种Phar反序列化攻击通过metadata触发对象注入PharSSRF组合攻击利用phar协议发起内部网络请求Phar签名绕过针对特定PHP版本的签名验证漏洞// 反序列化攻击示例 class Exploit { function __destruct() { system($this-cmd); } } $phar-setMetadata(new Exploit());6. 应急响应与漏洞修复当发现phar攻击时建议采取以下措施立即隔离受影响系统审计所有上传文件检查服务器日志定位攻击源更新PHP到最新稳定版本实施最小权限原则在一次实际渗透测试中我们发现某CMS系统虽然对上传文件做了严格校验却忽略了phar文件伪装成ZIP压缩包的攻击向量。通过构造特殊的phar文件我们成功绕过了所有防御措施最终获得了系统控制权。这个案例充分证明了phar攻击在真实环境中的有效性。