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

Web渗透之前后端漏洞-文件下载漏洞

本文仅用于网络安全技术学习与授权测试交流。任何未经授权使用文中技术的行为均与作者无关,请务必遵守法律法规,获得许可后方可进行渗透测试。

目录

一、什么是文件下载漏洞

二、漏洞产生的原因

三、漏洞危害

四、典型攻击示例

1. 路径穿越读取系统文件

2. 读取 PHP 源码

3. 使用编码绕过过滤

4. 利用空字节截断(旧版 PHP)

5. 利用 ZIP 或 Phar 协议(某些语言)

五、漏洞检测方法

六、防御措施

1. 白名单限制

2. 路径过滤与规范化

3. 隐藏真实路径

4. 文件权限最小化

5. 禁用危险函数或协议

6. 输出强制下载

七、与文件包含漏洞的区别

八、实战 CTF 常用 Payload

九、总结

十、靶场演示推荐

一、CTFHub 相关题目

二、BUUCTF 相关题目


一、什么是文件下载漏洞

文件下载漏洞是指 Web 应用程序在实现文件下载功能时,对用户传入的文件路径参数未进行严格过滤,导致攻击者可以任意下载服务器上的敏感文件(如源代码、配置文件、数据库备份、系统密码文件等)。

这类漏洞常出现在提供文件下载的页面,例如:

  • download.php?filename=report.pdf

  • file.jsp?path=/uploads/guide.doc

攻击者通过修改filenamepath参数,尝试读取服务器任意位置的文件。


二、漏洞产生的原因

典型的不安全代码(PHP 示例):

$filename = $_GET['filename']; $filepath = "/var/www/downloads/" . $filename; header('Content-Type: application/octet-stream'); readfile($filepath);
  • 直接拼接用户输入:未过滤../\等路径穿越字符。

  • 未限制基础目录:没有使用realpath()open_basedir限制可访问范围。

  • 未进行白名单校验:允许用户任意指定文件名。


三、漏洞危害

文件类型典型路径泄露信息
源代码index.phpconfig.phpinc/*.inc数据库密码、API密钥、业务逻辑漏洞
配置文件/etc/passwd/etc/shadow(需root)、web.config.htaccess系统用户、服务器配置
日志文件/var/log/apache2/access.logerror.log访问记录、错误信息、后台路径
数据库备份backup.sql*.sql*.dump用户数据、管理员密码哈希
敏感数据/proc/self/environ/proc/net/arp/root/.bash_history环境变量、内网信息、命令历史
其他 Web 应用文件../其他目录/file.txt跨目录读取

四、典型攻击示例

1. 路径穿越读取系统文件
http://target.com/download.php?file=../../../../etc/passwd

如果服务器为 Linux 且 Web 用户有读取权限,则返回/etc/passwd

2. 读取 PHP 源码
http://target.com/download.php?file=../config.php

直接下载config.php,获取数据库账号密码。

3. 使用编码绕过过滤
  • URL 编码:%2e%2e%2f../

  • 双写绕过:....//→ 过滤后剩../

  • 绝对路径:/etc/passwd(若未过滤斜杠)

4. 利用空字节截断(旧版 PHP)
download.php?file=../../etc/passwd%00.jpg

如果后端强制添加.jpg%00可截断后缀。

5. 利用 ZIP 或 Phar 协议(某些语言)
// 如果允许 zip:// 或 phar:// download.php?file=zip://uploads/evil.zip%23shell.php

五、漏洞检测方法

  • 手工测试:修改下载参数为../../etc/passwd,观察返回内容。

  • 模糊测试:使用 Burp Intruder 批量尝试常见敏感文件路径。

  • 代码审计:搜索文件读取函数(readfilefile_get_contentsfopenFile.ReadAllText等),检查参数是否用户可控。


六、防御措施

1. 白名单限制
$allow_files = ['report.pdf', 'guide.doc', 'manual.txt']; if(!in_array($_GET['file'], $allow_files)) { die('非法文件'); }
2. 路径过滤与规范化
$base = '/var/www/downloads/'; $file = realpath($base . $_GET['file']); if($file === false || strpos($file, $base) !== 0) { die('非法路径'); } readfile($file);
3. 隐藏真实路径
  • 将文件 ID 映射到真实路径(如数据库存储id->path)。

  • 使用随机化文件名存储(如 UUID),对外只暴露 ID。

4. 文件权限最小化
  • Web 用户不应有读取非 Web 目录文件的权限(如通过open_basedir限制)。

  • 敏感文件(如配置文件)应设置仅应用账户可读,Web 用户不可读。

5. 禁用危险函数或协议
  • PHP 中禁用zip://phar://等(非必要)。

  • 设置allow_url_fopen = Off(如果不需要远程读取)。

6. 输出强制下载
  • 设置正确的Content-TypeContent-Disposition: attachment,避免文件内容直接在浏览器显示(但不能阻止路径遍历)。


七、与文件包含漏洞的区别

对比文件下载漏洞文件包含漏洞
目的读取文件内容(下载)将文件内容作为脚本执行
函数readfilefile_get_contentsfopenincluderequire
后果信息泄露(源码、配置、数据)代码执行(Getshell)
典型防御白名单、路径限制、权限最小化白名单、禁用远程包含、路径限制

八、实战 CTF 常用 Payload

目标Payload 示例
读取/etc/passwd?file=../../../../etc/passwd
读取index.php源码?file=index.php(直接下载)
读取config.php(上级目录)?file=../config.php
使用编码绕过?file=%2e%2e%2f%2e%2e%2fetc/passwd
绝对路径(Linux)?file=/etc/passwd
绝对路径(Windows)?file=C:\Windows\win.ini
读取 Web 日志?file=../../../../var/log/apache2/access.log
读取进程环境变量?file=../../../../proc/self/environ

九、总结

文件下载漏洞本质是路径遍历(Path Traversal)+ 文件读取的组合。开发者在实现下载功能时,必须对用户输入进行严格限制,永远不要直接拼接文件路径。采用白名单、映射 ID、路径规范化是最有效的防御手段。

十、靶场演示推荐

下面罗列了一些靶场示例,可以去我的ctf解题专栏查看解题思路

一、CTFHub 相关题目

CTFHub 技能树中明确划分了“备份文件下载”“目录遍历”两个章节,专门考察文件下载漏洞。

题目分类题目名称(考点)简要说明
备份文件下载网站源码 (/www.zip等)访问常见备份文件(.zip.tar.rar)下载源码。
bak 文件 (index.php.bak)通过访问index.php.bak等备份文件获得源码。
vim 缓存 (index.php.swp)vim 意外退出留下的缓存文件,下载后可恢复源码。
.DS_StoremacOS 目录文件泄露,可获取文件列表。
目录遍历任意文件读取通过?file=../../../../etc/passwd等参数读取系统文件。
信息泄露其他信息泄露(如.git.svn虽然属于信息泄露,但也常通过文件下载方式获取。
二、BUUCTF 相关题目

BUUCTF 中没有独立的“文件下载”分类,但以下题目涉及下载备份文件、读取源码或任意文件读取。

题目名称考点(文件下载相关)利用方式简述
[极客大挑战 2019]Secret File文件包含 +php://filter读取源码通过php://filter伪协议读取flag.php的 Base64 编码内容。
[极客大挑战 2019]PHP/www.zip备份文件泄露访问/www.zip下载网站全部源码,审计后反序列化获取 flag。
[ACTF2020 新生赛]BackupFileindex.php.bak备份文件访问/index.php.bak获得源码,发现弱比较漏洞。
[护网杯 2018]easy_tornado任意文件读取(结合 SSTI)通过模板注入获取cookie_secret,然后构造filehash读取/fllllllllllag
[BJDCTF2020]EasySearch.swp缓存文件泄露访问index.php.swp恢复源码,获得后台密码。
[GXYCTF2019]禁止套娃.git源码泄露使用git restore或工具下载源码,审计发现 RCE 漏洞。
[RoarCTF 2019]Easy Java任意文件读取(Java Web)通过filename=/WEB-INF/web.xml读取配置文件,进一步下载classes下的 class 文件。
[BSidesCF 2020]Had a bad day文件包含 + 伪协议读取利用php://filter读取index.php源码。
http://www.rkmt.cn/news/1520988.html

相关文章:

  • 易水湖周边口碑民宿榜单,京津冀短途旅居住宿优选参考 - 海棠依旧大
  • Stable Diffusion采样器怎么选?我用腾讯云HAI跑了一遍AnimateDiff,给你这份人像/风景实测报告
  • BERTScore完整指南:3种方法提升文本生成评估准确性
  • 法考刑法知识点汇总|刑法|资料已整理
  • 免费获取同花顺问财数据的终极指南:告别Excel,拥抱Python自动化
  • 基于可验证生成式AI的电商推荐幻觉拦截系统(DLOS):设计、实现与评估
  • 2026行业内质量好的水泥基防火涂料生产厂家推荐排行 - 品牌排行榜
  • HAL库实战优化:如何重构串口驱动,告别官方Demo的全局变量陷阱
  • 5分钟免费解锁:applera1n iOS 15-16.6激活锁绕过完整指南
  • Citra 3DS模拟器深度解析:从入门到精通的完整指南
  • Android AudioRecord避坑指南:从权限、采样率到bufferSize,一次讲清所有参数配置
  • 如何在Windows电脑上运行安卓应用:APK安装器完全指南
  • 从OpenOffice叛逃到LibreOffice:一个老用户亲测的迁移心得与避坑指南
  • 实测ETA6002:这颗1.7元的充电管理芯片,真能搞定边充边放和NTC保护吗?
  • 张大头Emm_V4.2闭环驱动器评测:用Arduino做个简易测速仪,看看它速度控制到底稳不稳
  • NSK W3221FA精密滚珠丝杠技术详解
  • Adobe-GenP 3.0终极指南:3分钟完成Adobe全家桶激活的完整教程
  • 别再乱接RS485了!手把手教你用HUB搞定Modbus探测器组网(附接线图)
  • 别再纠结了!嵌入式项目选eMMC、SPI NOR还是SPI NAND?一张表帮你搞定
  • VEML7700 vs BH1750:两大主流光照传感器怎么选?实测对比精度、功耗与易用性
  • 经典问题——验证栈序列
  • STM32 HAL库驱动TB6612模块:精准控制编码电机转速与转向(附CubeMX配置)
  • 2026年消防培训学校怎么选?行业现状、机构分析及就业趋势解读 - 优质品牌商家
  • 2026年近期湖南GRC翘脚优质厂家选型指南 - 品牌鉴赏官2026
  • 免费解锁Adobe全家桶:开源破解工具Adobe-GenP 3.0终极指南
  • STM32F103驱动2.8寸TFT屏:FSMC硬核加速与GPIO软件模拟,哪个更适合你的项目?
  • 2026年成都训犬学校怎么选?六家机构实地调研与口碑分析 - 优质品牌商家
  • 别再乱选TVS管了!手把手教你根据USB、UART、电池接口选对ESD型号(附具体型号清单)
  • DOTA数据集标注选HBB还是OBB?从实际项目角度聊聊选择策略与坑点
  • 2026年6月市场技术好的喷泉制造公司推荐分析,程控喷泉/呐喊喷泉/音乐喷泉/旱式喷泉/潮汐瀑布,喷泉安装厂家哪个好 - 品牌推荐师