浅析文件读取与下载漏洞
字数 1491 2025-08-25 22:58:34

文件读取与下载漏洞深度解析

0x00 漏洞概述

文件读取与下载漏洞属于文件操作漏洞的一种,当网站提供文件查看或下载功能时,如果对用户查看或下载的文件不做适当限制,攻击者就能读取或下载任意文件,包括源文件、敏感配置文件等。

0x01 漏洞产生原因

任意文件读取漏洞

  • 存在读取文件的函数
  • 读取文件的路径用户可控
  • 未对用户输入进行校验或校验不严格
  • 输出了文件内容

任意文件下载漏洞

  • 存在读取文件的函数
  • 文件路径用户可控且未经验证
  • 输出文件内容并提供下载功能

0x02 漏洞代码示例

文件读取漏洞代码

<?php
$filename = "test.txt";
readfile($filename);
?>

<?php
$filename = "test.txt";
echo file_get_contents($filename);
?>

文件下载漏洞代码

<?php
$filename = $_GET['filename'];
echo '<h1>开始下载文件</h1><br /><br />';
echo file_get_contents($filename);
header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>

0x03 常见危险函数

  • readfile()
  • file_get_contents()
  • fopen()

0x04 漏洞利用方式

信息收集目标

  1. 下载常规配置文件:SSH、Weblogic、FTP、MySQL等配置
  2. 下载各种.log文件寻找后台地址或上传点
  3. 下载web业务文件进行白盒审计
  4. 尝试读取/root/.bash_history检查root权限
  5. 读取.ssh目录下的配置信息文件
  6. 读取MySQL下的.bash_history文件

Java+Oracle环境利用

  1. 下载/WEB-INF/classes/applicationContext.xml获取服务器配置
  2. 下载/WEB-INF/classes/xxx/xxx/aaa.class进行反编译
  3. 搜索上传相关API接口
  4. 下载/WEB-INF/Web.xml获取数据库连接信息

Linux特殊利用方式

  • 下载/var/lib/mlocate/mlocate.db文件(需root权限)
  • 使用locate命令查询文件路径
  • 读取/proc/self/cmdline获取当前进程路径信息

0x05 漏洞挖掘方法

扫描工具

  • AWVS
  • AppScan
  • OpenVAS
  • Nessus

手动挖掘

Google搜索语法:

inurl:"readfile.php?file="
inurl:"read.php?filename="
inurl:"download.php?file="
inurl:"down.php?file="

常见参数名:

&RealPath= &readpath= &FilePath= &filepath= &Path= &path= 
&Inputfile= &inputfile= &url= &urls= &Lang= &dis= 
&Data= &data= &readfile= &filep= &Src= &src= &menu= 
META-INF= WEB-INF=

0x06 敏感文件路径

Windows系统

C:\boot.ini                        // 系统版本
C:\Windows\System32\inetsrv\MetaBase.xml  // IIS配置
C:\Windows\repair\sam              // 系统初始密码
C:\Program Files\mysql\my.ini      // MySQL配置
C:\Program Files\mysql\data\mysql\user.MYD  // MySQL root
C:\Windows\php.ini                 // PHP配置
C:\Windows\my.ini                  // MySQL配置

Linux系统

/root/.ssh/authorized_keys         // SSH公钥
/root/.ssh/id_rsa                  // SSH私钥
/root/.ssh/id_ras.keystore         // 访问记录
/root/.ssh/known_hosts             // 已知主机公钥
/etc/passwd                        // 账户信息
/etc/shadow                        // 账户密码
/etc/my.cnf                        // MySQL配置
/etc/httpd/conf/httpd.conf         // Apache配置
/root/.bash_history                // 历史命令
/root/.mysql_history               // MySQL历史命令
/proc/self/fd/fd[0-9]*             // 文件标识符
/proc/mounts                       // 挂载设备
/porc/config.gz                    // 内核配置
/var/lib/mlocate/mlocate.db        // 全文件路径
/porc/self/cmdline                 // 当前进程参数

0x07 漏洞验证方法

文件读取验证

readfile.php?f=etc/passwd
readfile.php?file=etc/passwd%00
readfile.php?f=../index.txt
readfile.php?f=file:///etc/passwd

文件下载验证

通过修改下载参数尝试下载敏感文件

0x08 漏洞判断方法

当参数值为PHP文件时:

  1. 文件被解析 → 文件包含漏洞
  2. 显示源代码 → 文件查看漏洞
  3. 提示下载 → 文件下载漏洞

0x09 漏洞防御措施

通用防御

  1. 过滤.点符号,防止目录遍历
  2. 使用正则严格校验用户输入
  3. 配置php.ini中的open_basedir限制文件访问范围

文件下载专项防御

  1. 将下载区独立于项目路径外
  2. 为每个资源分配固定URL而非参数化
  3. 对文件名进行硬编码或统一编码
  4. 实施文件类型白名单控制
  5. 使用chroot环境限制web目录访问
  6. 将文件地址保存在数据库中
  7. 通过ID而非路径下载文件
  8. 下载前进行权限验证
  9. 将敏感文件放在web不可直接访问的目录
  10. 禁止目录遍历服务
  11. 记录文件下载日志

中间件更新

及时更新web中间件版本,修复已知漏洞

0x0A 实战案例

RoarCTF2019-Web:Easy Java

  1. 发现可下载的help.docx文件
  2. 通过POST方式下载WEB-INF/web.xml
  3. 从配置中发现关键文件位置
  4. 下载/WEB-INF/classes/com/wm/ctf/FlagController.class
  5. 解码获取flag

0x0B 总结

文件操作漏洞(读取、下载、包含、删除、上传)是web安全中的重要威胁,防御需要从输入验证、访问控制、环境隔离等多方面入手。开发人员应严格校验用户输入,限制文件访问范围,而安全人员则需掌握这些漏洞的利用方式以进行有效测试和防御。

文件读取与下载漏洞深度解析 0x00 漏洞概述 文件读取与下载漏洞属于文件操作漏洞的一种,当网站提供文件查看或下载功能时,如果对用户查看或下载的文件不做适当限制,攻击者就能读取或下载任意文件,包括源文件、敏感配置文件等。 0x01 漏洞产生原因 任意文件读取漏洞 存在读取文件的函数 读取文件的路径用户可控 未对用户输入进行校验或校验不严格 输出了文件内容 任意文件下载漏洞 存在读取文件的函数 文件路径用户可控且未经验证 输出文件内容并提供下载功能 0x02 漏洞代码示例 文件读取漏洞代码 文件下载漏洞代码 0x03 常见危险函数 readfile() file_get_contents() fopen() 0x04 漏洞利用方式 信息收集目标 下载常规配置文件:SSH、Weblogic、FTP、MySQL等配置 下载各种.log文件寻找后台地址或上传点 下载web业务文件进行白盒审计 尝试读取 /root/.bash_history 检查root权限 读取 .ssh 目录下的配置信息文件 读取MySQL下的 .bash_history 文件 Java+Oracle环境利用 下载 /WEB-INF/classes/applicationContext.xml 获取服务器配置 下载 /WEB-INF/classes/xxx/xxx/aaa.class 进行反编译 搜索上传相关API接口 下载 /WEB-INF/Web.xml 获取数据库连接信息 Linux特殊利用方式 下载 /var/lib/mlocate/mlocate.db 文件(需root权限) 使用 locate 命令查询文件路径 读取 /proc/self/cmdline 获取当前进程路径信息 0x05 漏洞挖掘方法 扫描工具 AWVS AppScan OpenVAS Nessus 手动挖掘 Google搜索语法: 常见参数名: 0x06 敏感文件路径 Windows系统 Linux系统 0x07 漏洞验证方法 文件读取验证 文件下载验证 通过修改下载参数尝试下载敏感文件 0x08 漏洞判断方法 当参数值为PHP文件时: 文件被解析 → 文件包含漏洞 显示源代码 → 文件查看漏洞 提示下载 → 文件下载漏洞 0x09 漏洞防御措施 通用防御 过滤 . 点符号,防止目录遍历 使用正则严格校验用户输入 配置php.ini中的 open_basedir 限制文件访问范围 文件下载专项防御 将下载区独立于项目路径外 为每个资源分配固定URL而非参数化 对文件名进行硬编码或统一编码 实施文件类型白名单控制 使用chroot环境限制web目录访问 将文件地址保存在数据库中 通过ID而非路径下载文件 下载前进行权限验证 将敏感文件放在web不可直接访问的目录 禁止目录遍历服务 记录文件下载日志 中间件更新 及时更新web中间件版本,修复已知漏洞 0x0A 实战案例 RoarCTF2019-Web:Easy Java 发现可下载的help.docx文件 通过POST方式下载WEB-INF/web.xml 从配置中发现关键文件位置 下载/WEB-INF/classes/com/wm/ctf/FlagController.class 解码获取flag 0x0B 总结 文件操作漏洞(读取、下载、包含、删除、上传)是web安全中的重要威胁,防御需要从输入验证、访问控制、环境隔离等多方面入手。开发人员应严格校验用户输入,限制文件访问范围,而安全人员则需掌握这些漏洞的利用方式以进行有效测试和防御。