浅析文件读取与下载漏洞
字数 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 漏洞利用方式
信息收集目标
- 下载常规配置文件: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搜索语法:
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文件时:
- 文件被解析 → 文件包含漏洞
- 显示源代码 → 文件查看漏洞
- 提示下载 → 文件下载漏洞
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安全中的重要威胁,防御需要从输入验证、访问控制、环境隔离等多方面入手。开发人员应严格校验用户输入,限制文件访问范围,而安全人员则需掌握这些漏洞的利用方式以进行有效测试和防御。