一、漏洞概述
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`关闭)。
httphttp://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=<?php phpinfo();?> |
zip:// | 读取ZIP压缩包内文件 | zip://file.zip%23shell.php |
data:// | 内联数据流,支持Base64编码 | data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= |
案例
- 读取源码:
httphttp://example.com/?file=php://filter/read=convert.base64-encode/resource=config.php
- 执行POST代码:
httphttp://example.com/?file=php://input
- POST数据:<?php system('whoami'); ?>
四、防御策略
1. 输入验证
- 白名单过滤文件路径(如仅允许`/uploads/*.jpg`)。
- 禁用危险函数(如`eval()`、`system()`)。
2. 配置调整
- 禁用远程文件包含:`allow_url_include = Off`。
- 限制文件包含路径:`open_basedir`指定允许目录。
3. 文件处理安全
- 上传后重命名文件,避免保留原始扩展名。
- 对包含文件进行内容校验(如检测PHP标签)。
五、文件下载漏洞
- 原理:未校验文件路径或后缀,允许下载任意文件。
案例
1. Pikachu靶场:
httphttp://pikachu.com/download.php?file=../../../../etc/passwd
2. Java反序列化漏洞:
- 下载`WEB-INF/web.xml`等敏感配置文件。
修复建议
- 严格校验下载路径(如禁止`../`跳转)。
- 限制可下载文件类型(如仅允许`.pdf`、`.docx`)。
六、总结
- 文件包含与下载漏洞的核心在于动态变量可控和路径过滤不足。防御需结合输入验证、配置加固及安全编码实践。实战中需关注协议特性(如`00截断`、`伪协议`)及绕过技巧。
注:实验环境搭建推荐使用Vulhub或本地靶场(如DVWA、Pikachu),所有操作应在授权范围内进行。