别再只记payload了!从NISACTF这道题,彻底搞懂phar://和zip://伪协议的区别与实战选择
从NISACTF实战解析PHP伪协议phar://与zip://的深度对比与攻防策略在CTF竞赛和实际渗透测试中文件上传与包含漏洞常常是突破系统防线的关键入口。而PHP的各种伪协议就像是一把把形状各异的钥匙能否准确选择并运用它们往往决定了我们能否成功打开目标系统的大门。最近NISACTF中一道名为bingdundun~的题目恰好为我们提供了一个绝佳的学习案例让我们有机会深入探讨phar://和zip://这两个最常用却又最容易混淆的伪协议。1. 伪协议基础PHP文件处理的幕后机制PHP伪协议PHP Wrappers是PHP提供的一种特殊文件处理机制它允许开发者以统一的方式访问各种资源无论是本地文件、远程URL还是压缩包内容。这种设计初衷是为了简化编程接口但在安全领域却衍生出了许多意想不到的应用场景。1.1 常见伪协议概览PHP支持多种伪协议每种都有其特定的语法和应用场景file://- 访问本地文件系统默认协议http://- 访问HTTP(s)资源ftp://- 访问FTP资源php://- 访问各种I/O流data://- 直接包含数据RFC 2397phar://- 访问PHARPHP归档文件zip://- 访问ZIP压缩包内容注意所有伪协议使用时都必须包含尾部斜杠如phar:///path/to/file这是许多初学者容易忽略的细节。1.2 伪协议在安全测试中的特殊价值为什么伪协议在安全测试中如此重要主要原因有三绕过文件扩展名限制许多系统只允许上传特定扩展名的文件如.jpg、.png但通过伪协议可以读取这些文件中的有效内容触发反序列化漏洞特别是phar协议在解析时会自动反序列化metadata组合利用漏洞可以与文件上传、文件包含等漏洞形成攻击链下表对比了主要伪协议在安全测试中的应用特点协议类型支持压缩格式是否需要完整路径PHP版本要求反序列化风险phar://.phar, .zip是5.3.0高zip://.zip否5.2.0无bzip2://.bz2否5.3.0无zlib://.gz否5.3.0无2. phar://协议深度解析pharPHP Archive是PHP中类似于Java JAR的一种打包格式。它不仅能够打包文件还能包含完整的PHP应用程序包括其依赖项和资源。2.1 phar文件结构剖析一个标准的phar文件由四部分组成Stub文件头格式为?php [code] __HALT_COMPILER(); ?可以包含任意PHP代码这些代码在phar被包含时执行最短有效stub__HALT_COMPILER();Manifest描述文件内容包含被压缩文件的元信息权限、大小等存储用户自定义的metadata序列化格式File Contents实际文件内容存储被压缩文件的原始数据Signature可选文件签名支持多种哈希算法MD5, SHA1等2.2 phar协议的安全特性phar协议有几个独特的安全相关特性自动反序列化当通过phar://访问文件时PHP会自动反序列化manifest中的metadata扩展名灵活phar文件可以重命名为任意扩展名.jpg、.png等代码执行stub中的PHP代码会在文件被包含时执行// 典型的phar生成脚本 $phar new Phar(test.phar); $phar-startBuffering(); $phar-setStub(?php __HALT_COMPILER(); ?); // 添加恶意payload $phar-addFromString(test.txt, payload); $phar-setMetadata([key malicious_data]); $phar-stopBuffering();2.3 实战应用NISACTF题目解析回到NISACTF的bingdundun~题目解题步骤如下识别漏洞点发现URL参数存在文件包含漏洞且会自动添加.php后缀绕过上传限制题目只允许上传图片或压缩包构造phar文件创建一个包含恶意代码的phar文件重命名为.zip触发文件包含通过?bingdundunphar://uploaded.zip/shell执行代码关键点phar://不需要文件具有.phar扩展名只要内容格式正确即使重命名为.zip也能正常解析。3. zip://协议详解及与phar对比zip://是PHP提供的另一种处理压缩文件的伪协议它专门用于访问ZIP压缩包中的内容。3.1 zip协议使用要点zip://协议有几个重要特点路径格式特殊必须使用绝对路径并且要用#分隔压缩包和内部文件正确格式zip:///path/to/file.zip#internal/file扩展名无关压缩包可以重命名为任意扩展名不支持元数据不会自动处理任何序列化数据仅支持ZIP不支持RAR、7z等其他压缩格式// zip://协议的正确用法示例 include(zip:///var/www/uploads/evil.jpg#shell.php);3.2 与phar协议的关键区别虽然phar://和zip://都可以处理压缩文件但它们存在本质区别特性phar://zip://支持格式.phar, .zip.zip元数据处理自动反序列化metadata无路径格式phar://path/to/filezip:///path/to/file#inner代码执行stub中的代码可执行无此功能反序列化利用可行不可行文件包含时后缀需求需要指定内部文件后缀需要完整指定内部文件路径3.3 何时选择zip://而非phar://在以下场景中zip://可能是更好的选择目标PHP版本低于5.3.0phar不支持只需要简单读取压缩文件内容不需要反序列化功能目标系统对phar文件有特殊检测需要更简洁的路径格式特别是处理多层目录时4. 高级攻防伪协议的实战对抗理解了伪协议的工作原理后我们需要进一步探讨如何在实战中有效利用它们以及如何防御相关攻击。4.1 攻击面扩展技巧扩展名欺骗将phar文件重命名为.jpg、.png等图像格式使用文件头欺骗如添加真实的图像头组合利用// 结合php://filter进行编码转换 include(php://filter/convert.base64-encode/resourcephar://./uploaded.jpg/shell);条件竞争在文件被删除前快速包含适用于有临时文件上传机制的系统路径遍历利用相对路径访问系统文件如phar://../uploads/evil.jpg4.2 防御策略与实践对于开发者来说防范伪协议滥用需要多层防护输入验证严格过滤文件包含参数中的协议类型使用白名单限制允许的协议文件上传防护// 检查文件内容而不仅是扩展名 $finfo finfo_open(FILEINFO_MIME_TYPE); $mime finfo_file($finfo, $_FILES[file][tmp_name]); finfo_close($finfo); $allowed [image/jpeg, image/png]; if (!in_array($mime, $allowed)) { die(Invalid file type); }PHP配置加固禁用危险协议allow_url_includeOff限制open_basedir监控与日志记录所有文件包含操作监控异常的文件访问模式4.3 现代PHP版本的变化值得注意的是随着PHP版本更新伪协议的相关安全特性也在变化PHP 8.0phar元数据反序列化默认需要phar.readonlyOffPHP 7.4对phar stub的验证更加严格PHP 5.6引入了更多安全限制在实际测试中了解目标PHP版本对于选择正确的攻击方式至关重要。