当前位置: 首页 > 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.gsyq.cn/news/1431758.html

相关文章:

  • 告别手动配置!用Matlab+LUA脚本自动化控制TI mmWave Studio采集雷达数据(DCA1000+1843实战)
  • 新手硬件工程师必看:DDR3 PCB布局布线,避开这5个坑,信号质量稳了
  • 选型避坑指南:如何根据项目需求(Robotaxi vs. 低速无人车)看懂激光雷达参数表?
  • 保姆级教程:用VTST脚本给VASP打补丁,搞定CI-NEB过渡态计算
  • Win10/Win11下Cadence全家桶卡顿?可能是输入法埋的‘雷’,保姆级排查与修复指南
  • 2026年5月30日博客精选
  • 前端也能玩转国密?Vue/React项目集成sm-crypto进行数据加密的完整指南
  • 别再只盯着快充功率了!一文读懂USB PD物理层如何保证你的充电数据不丢包
  • 别再死记硬背了!用Multisim仿真软件5分钟搞定戴维南定理(附实操步骤)
  • 别再死记payload了!手把手教你用PHP代码动态生成CTF序列化利用点
  • 电力自动化通信入门:手把手教你用Python模拟IEC104协议的数据采集与遥控
  • 终极指南:如何深度配置Jellyfin Android TV打造专业级家庭影院体验
  • FPGA图像缩放+GTX光传输+UDP网传:一个视频处理系统的数据流完整解析(附源码)
  • 别再死记硬背Payload了!手把手教你用PHP代码动态生成序列化攻击字符串
  • 10分钟掌握AI音频修复:VoiceFixer的完整免费指南
  • 别再死记硬背了!用‘重叠区域’和PD图直观理解SRT除法器设计
  • 深度解析:如何用LeagueAkari实现英雄联盟游戏效率翻倍
  • 保姆级教程:在STM32CubeMX生成的FreeRTOS工程里,手把手移植一个稳定的软件IIC驱动(附AT24C02测试代码)
  • 告别IP核!手把手教你用Verilog在Quartus II里从零实现一个4位乘法器(附仿真与引脚绑定)
  • 2026年4月高评价电缆沟盖板推荐指南:卡槽式电缆沟盖、双层井盖、变电站室外电缆沟盖板、复合树脂井盖、复合树脂盖板选择指南 - 优质品牌商家
  • 别再只盯着速度了!USB3.0的LTSSM状态机,才是你高速外设频繁断连的元凶
  • 用OpenCV和C++手把手实现张正友相机标定:从棋盘格到内参矩阵的完整代码解析
  • 不止于搭建:宝塔反代OpenAI API后,如何安全、高效地管理你的API Key与对接第三方应用
  • 手把手教你用C语言实现FIR滤波器:从窗函数选择到Matlab验证的完整流程
  • 告别驱动烦恼:手把手教你用免驱Console线连接思科/华为交换机(附串口查看技巧)
  • 别再为多设备同步发愁了!NI-DAQmx通道扩展保姆级配置指南(含CompactDAQ/PXI实战)
  • 云手机 跨设备无缝衔接
  • Kubernetes新手必看:kubectl get nodes报错localhost:8080?三步搞定kubeconfig配置
  • 追踪图中的变压器
  • ABAP屏幕开发避坑指南:下拉框(Listbox)从创建到交互的完整流程