目录

文件包含与下载漏洞

文件包含与下载漏洞

一、漏洞概述

1. 定义

  • 文件包含:通过动态变量加载外部文件作为代码执行,常见于PHP的 include()require() 等函数。
  • 文件下载:通过程序接口直接获取服务器文件内容,若未校验文件路径,可导致敏感文件泄露。

2. 危害

  • 代码执行:恶意文件被包含后直接运行(如WebShell)。
  • 敏感信息泄露:配置文件、数据库凭证等被下载。

二、文件包含分类

1. 本地包含

无限制包含

  • 直接指定本地文件路径,无任何过滤
 #案例:  

    php

    // upload.php

    $filename = $_GET'file';

    include($filename);
  • 访问:http://example.com/upload.php?file=1.txt(1.txt含PHP代码)

有限制包含

  • 通过黑名单/白名单过滤文件名,需绕过机制。
  • 绕过方式:
  • 00截断:利用 %00 截断文件名(需 magic_quotes_gpc 关闭)。
http

      http://example.com/upload2.php?filename=1.txt%00
  • 路径长度截断:利用Windows(255字符)或Linux(4096字符)路径限制。
  • 文件名混淆:添加多余后缀(如 1.txt.php )或特殊符号(如 1.txt )。

2. 远程包含

  • 原理:通过allow_url_include配置加载远程文件,危害性更高。
  • 绕过方式:
  • 文件名伪装:强制服务器解析非预期后缀(如 1.txt.html 改为 1.txt )。
  • 协议绕过:使用 data://php:// 等伪协议传输恶意内容。

三、常见脚本协议

PHP支持多种伪协议,用于灵活读取/执行数据
协议功能示例
file://直接访问本地文件系统file:///etc/passwd
php://filter读取并过滤文件内容(如Base64编码)php://filter/read=convert.base64encode/ resource=upload.phpurce=upload.php
php://input读取POST请求原始数据,可执行POST中的PHP代码php://inputPOST_DATA=
zip://读取ZIP压缩包内文件zip://file.zip%23shell.php
data://内联数据流,支持Base64编码data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
案例
  • 读取源码:
http

  http://example.com/?file=php://filter/read=convert.base64-encode/resource=config.php
  • 执行POST代码:
  http

  http://example.com/?file=php://input
  • POST数据:

四、防御策略

1. 输入验证
  • 白名单过滤文件路径(如仅允许 /uploads/*.jpg )。
  • 禁用危险函数(如 eval()system() )。
2. 配置调整
  • 禁用远程文件包含:allow_url_include = Off
  • 限制文件包含路径:open_basedir指定允许目录。
3. 文件处理安全
  • 上传后重命名文件,避免保留原始扩展名。
  • 对包含文件进行内容校验(如检测PHP标签)。

五、文件下载漏洞

  • 原理:未校验文件路径或后缀,允许下载任意文件。
案例
1. Pikachu靶场:
 http

     http://pikachu.com/download.php?file=../../../../etc/passwd
2. Java反序列化漏洞:
  • 下载WEB-INF/web.xml等敏感配置文件。

修复建议

  • 严格校验下载路径(如禁止 ../ 跳转)。
  • 限制可下载文件类型(如仅允许 .pdf.docx )。

六、总结

  • 文件包含与下载漏洞的核心在于动态变量可控和路径过滤不足。防御需结合输入验证、配置加固及安全编码实践。实战中需关注协议特性(如 00截断伪协议 )及绕过技巧。

注:实验环境搭建推荐使用Vulhub或本地靶场(如DVWA、Pikachu),所有操作应在授权范围内进行。