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

Web渗透之前后端漏洞-文件下载漏洞 本文仅用于网络安全技术学习与授权测试交流。任何未经授权使用文中技术的行为均与作者无关请务必遵守法律法规获得许可后方可进行渗透测试。目录一、什么是文件下载漏洞二、漏洞产生的原因三、漏洞危害四、典型攻击示例1. 路径穿越读取系统文件2. 读取 PHP 源码3. 使用编码绕过过滤4. 利用空字节截断旧版 PHP5. 利用 ZIP 或 Phar 协议某些语言五、漏洞检测方法六、防御措施1. 白名单限制2. 路径过滤与规范化3. 隐藏真实路径4. 文件权限最小化5. 禁用危险函数或协议6. 输出强制下载七、与文件包含漏洞的区别八、实战 CTF 常用 Payload九、总结十、靶场演示推荐一、CTFHub 相关题目二、BUUCTF 相关题目一、什么是文件下载漏洞文件下载漏洞是指 Web 应用程序在实现文件下载功能时对用户传入的文件路径参数未进行严格过滤导致攻击者可以任意下载服务器上的敏感文件如源代码、配置文件、数据库备份、系统密码文件等。这类漏洞常出现在提供文件下载的页面例如download.php?filenamereport.pdffile.jsp?path/uploads/guide.doc攻击者通过修改filename或path参数尝试读取服务器任意位置的文件。二、漏洞产生的原因典型的不安全代码PHP 示例$filename $_GET[filename]; $filepath /var/www/downloads/ . $filename; header(Content-Type: application/octet-stream); readfile($filepath);直接拼接用户输入未过滤..、/、\等路径穿越字符。未限制基础目录没有使用realpath()或open_basedir限制可访问范围。未进行白名单校验允许用户任意指定文件名。三、漏洞危害文件类型典型路径泄露信息源代码index.php、config.php、inc/*.inc数据库密码、API密钥、业务逻辑漏洞配置文件/etc/passwd、/etc/shadow需root、web.config、.htaccess系统用户、服务器配置日志文件/var/log/apache2/access.log、error.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. 利用空字节截断旧版 PHPdownload.php?file../../etc/passwd%00.jpg如果后端强制添加.jpg%00可截断后缀。5. 利用 ZIP 或 Phar 协议某些语言// 如果允许 zip:// 或 phar:// download.php?filezip://uploads/evil.zip%23shell.php五、漏洞检测方法手工测试修改下载参数为../../etc/passwd观察返回内容。模糊测试使用 Burp Intruder 批量尝试常见敏感文件路径。代码审计搜索文件读取函数readfile、file_get_contents、fopen、File.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-Type和Content-Disposition: attachment避免文件内容直接在浏览器显示但不能阻止路径遍历。七、与文件包含漏洞的区别对比文件下载漏洞文件包含漏洞目的读取文件内容下载将文件内容作为脚本执行函数readfile、file_get_contents、fopeninclude、require后果信息泄露源码、配置、数据代码执行Getshell典型防御白名单、路径限制、权限最小化白名单、禁用远程包含、路径限制八、实战 CTF 常用 Payload目标Payload 示例读取/etc/passwd?file../../../../etc/passwd读取index.php源码?fileindex.php直接下载读取config.php上级目录?file../config.php使用编码绕过?file%2e%2e%2f%2e%2e%2fetc/passwd绝对路径Linux?file/etc/passwd绝对路径Windows?fileC:\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源码。