当前位置: 首页 > news >正文

PHP文件包含新思路:除了php://filter,别忘了phar://这个隐藏BOSS

PHP文件包含进阶:揭秘phar伪协议的隐藏攻击面

在PHP安全研究领域,文件包含漏洞一直是攻击者最青睐的攻击向量之一。大多数开发者对常见的php://filter伪协议有所了解,却往往忽视了phar://这个同样强大但鲜为人知的协议。本文将带您深入探索phar协议的工作原理、攻击手法以及防御策略,帮助您在安全测试和代码审计中占据先机。

1. PHP文件包含漏洞与伪协议家族

文件包含漏洞在PHP应用中屡见不鲜,它允许攻击者通过参数动态包含恶意文件。常见的伪协议包括:

  • php://filter:最广为人知的协议,常用于读取文件内容和进行编码转换
  • zip://:用于读取zip压缩包内的文件
  • data://:直接包含base64编码的数据
  • phar://:本文重点,可操作PHP归档文件

为什么phar协议容易被忽视?

  1. 文档资料相对较少,社区讨论热度低
  2. 许多开发者认为它"只是用来处理压缩文件"
  3. 实际攻击面比表面看起来要广泛得多

注意:所有伪协议攻击都需要文件包含漏洞存在,且allow_url_include配置开启

2. phar协议深度解析

phar(PHP Archive)是PHP 5.3+引入的一种打包格式,类似于Java的JAR。一个标准的phar文件包含四个部分:

组成部分描述安全意义
Stub文件头标识,必须包含__HALT_COMPILER()可伪装成其他文件类型
Manifest元数据,存储序列化信息反序列化攻击入口
文件内容实际压缩的内容可隐藏恶意代码
签名可选的文件签名完整性校验

关键特性分析:

// 典型phar文件生成代码 $phar = new Phar('test.phar'); $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $phar->addFromString('test.txt', '恶意内容'); $phar->setMetadata(['key' => '可序列化数据']); $phar->stopBuffering();
  1. 文件伪装能力:phar文件可以完全伪装成图片、PDF等格式,只需保持有效的stub结构
  2. 无需特定后缀:虽然.phar是标准后缀,但任意后缀均可被phar协议解析
  3. 元数据反序列化:当phar文件被操作时,元数据会自动反序列化

3. 实战攻击场景剖析

让我们通过一个模拟CTF题目来演示phar协议的实际利用。假设存在以下条件:

  • 网站允许上传zip格式文件
  • 存在文件包含漏洞,且自动补全.php后缀
  • 上传文件后缀检查不严格

攻击步骤:

  1. 创建恶意phar文件:

    php -d phar.readonly=0 generate.phar
  2. 将phar文件重命名为无害后缀:

    mv malicious.phar harmless.zip
  3. 上传文件并获取存储路径,如/uploads/harmless.zip

  4. 通过文件包含触发:

    /vuln.php?file=phar:///uploads/harmless.zip/internal_file

为什么phar比zip协议更有优势?

  • 更灵活的文件伪装能力
  • 支持元数据反序列化
  • 对文件结构要求更低
  • 在自动补全后缀的场景下更可靠

4. 高级攻击技巧与变种

除了基本的文件包含,phar协议还能用于更复杂的攻击场景:

1. 反序列化攻击链

// 精心构造的元数据 $phar->setMetadata(new DangerousClass());

当phar文件被包含时,元数据会自动反序列化,可能触发POP链。

2. 结合文件上传限制绕过

  • 上传检查通常只验证文件头几个字节
  • phar stub可以设计为合法的图片头:
    "\xFF\xD8\xFF\xE0" . "<?php __HALT_COMPILER(); ?>"

3. 无文件包含的直接利用

某些PHP函数如file_exists()is_file()也会触发phar解析:

file_exists('phar://malicious.zip');

5. 防御策略与最佳实践

针对phar协议攻击,开发者可以采取多层防御措施:

1. 输入验证与过滤

  • 严格检查用户输入的文件路径
  • 禁用不必要的伪协议:
    allow_url_include=Off

2. 服务器配置加固

配置项推荐值作用
phar.readonlyOn禁止生成phar文件
disable_functionsPhar::__construct禁用phar类

3. 代码层防护

  • 使用白名单限制包含文件路径
  • 对动态包含参数进行严格校验:
    $allowed = ['safe.php', 'config.php']; if(!in_array($input, $allowed)) { die('Invalid file'); }

4. 监控与日志

  • 记录所有文件包含操作
  • 监控可疑的文件操作序列

在实际项目中,我曾遇到一个案例:攻击者通过精心构造的phar文件,不仅绕过了上传限制,还利用元数据反序列化获取了服务器权限。这提醒我们,安全防护需要全面考虑各种可能的攻击向量。

http://www.jsqmd.com/news/920435/

相关文章:

  • BOLT技术:基于HBM的无感映射安全加速方案
  • 告别手动配置!用Matlab+LUA脚本自动化控制TI mmWave Studio采集雷达数据(DCA1000+1843实战)
  • 告别仿真器!手把手教你用USB转TTL给N76E003核心板烧程序(附Bootloader配置)
  • 别再让日志石沉大海:手把手教你用3CDaemon搭建交换机日志服务器(附华为/华三配置命令)
  • 北斗SPP定位精度能到多少米?实测对比单频B3I与双频消电离层效果
  • 2026年口碑好的直线丝杆步进电机/丝杆步进电机/28丝杆步进电机/微型丝杆步进电机公司哪家好 - 品牌宣传支持者
  • 猫抓Cat-Catch:终极网页资源嗅探扩展完整指南
  • 保姆级教程:用HACS插件将追觅扫地机器人接入Home Assistant,实现苹果家庭App控制
  • STM32 IAP升级太慢?试试用DMA自定义大容量FIFO来加速串口固件传输
  • 从GPU到MLU:手把手教你理解寒武纪MLUv3架构的存储层级与编程模型差异
  • Arm Compiler for Embedded 6.22 新特性与嵌入式开发指南
  • 新手硬件工程师必看:DDR3 PCB布局布线,避开这5个坑,信号质量稳了
  • 告别信号完整性问题:用实际案例复盘一次DDR3设计从失败到成功的全过程
  • TaiBai芯片:脑启发计算与脉冲神经网络硬件革新
  • 选型避坑指南:如何根据项目需求(Robotaxi vs. 低速无人车)看懂激光雷达参数表?
  • EEG图像重建技术:从脑电信号到视觉内容解码
  • 保姆级避坑指南:用Raspberry Pi Zero 2 W连接ADS1115和多个传感器,搞定智能花盆数据采集
  • Inkscape光线追踪扩展完全指南:零基础绘制专业光学图表的终极教程
  • 番茄小说下载器:快速将网络小说转为本地电子书的完整解决方案
  • 别让电源毁了你的DDR3稳定性:1.5V电源平面分割、滤波电容摆放的细节与实测
  • 保姆级教程:用VTST脚本给VASP打补丁,搞定CI-NEB过渡态计算
  • YOLOv8+DeepSORT项目实战:如何自定义检测区域与越界规则(以停车场和商场入口为例)
  • 抖音无水印视频下载:3分钟学会的终极免费工具使用指南
  • Scandit这家瑞士公司的技术,如何让你手机摄像头变成专业扫码枪?
  • Win10/Win11下Cadence全家桶卡顿?可能是输入法埋的‘雷’,保姆级排查与修复指南
  • 前端也能用国密?一招让Vue/React项目通过sm-crypto调用SM3哈希与SM2签名
  • 2026年5月30日博客精选
  • 别只当壁纸播放器!DreamScene2的HTML玩法:让桌面变身可点击的个性化信息板
  • 前端也能玩转国密?Vue/React项目集成sm-crypto进行数据加密的完整指南
  • 别再只盯着快充功率了!一文读懂USB PD物理层如何保证你的充电数据不丢包