在当今的网络安全环境中,文件包含漏洞(File Inclusion Vulnerability)作为一种常见且危害极大的安全漏洞,频繁出现在各类Web应用中。它不仅可能导致敏感信息泄露,还可能被攻击者用来远程控制服务器,造成严重的安全事件。那么,文件包含漏洞到底是什么?它是如何被利用的?又该如何有效防御?本文将为你全面解析。

什么是文件包含漏洞?
文件包含漏洞是指Web应用程序在动态调用外部文件时,由于未对用户输入的文件路径参数进行严格过滤,导致攻击者可以操控程序去包含非预期的文件。如果被包含的文件中包含恶意代码,这些代码将被服务器解析并执行,从而实现任意代码执行、敏感信息读取、甚至服务器权限获取。
通俗理解:
开发人员为了方便代码复用,会使用include、require等函数动态加载文件。但如果这些函数的参数来自用户输入(如URL参数),且未做安全校验,攻击者就可以“骗”服务器去加载恶意文件,这就是文件包含漏洞的根源。
文件包含漏洞的成因
文件包含漏洞的核心成因在于两点:
参数可被用户控制:如通过GET或POST传递的
file=xxx.php参数。未对参数进行有效过滤:程序未限制可包含的文件类型、路径或来源。
例如,以下PHP代码就存在典型的文件包含漏洞:
当用户访问 index.php?file=../../etc/passwd 时,服务器可能直接读取系统敏感文件。
文件包含漏洞的分类
根据包含文件的来源,文件包含漏洞主要分为两类:
1. 本地文件包含(LFI, Local File Inclusion)
攻击者利用漏洞包含服务器本地文件,如:
读取系统配置文件:
/etc/passwd、/etc/shadow(Linux)、C:\boot.ini(Windows)包含日志文件(如Apache、SSH日志)写入WebShell
包含Session文件实现代码执行
利用条件:目标服务器存在可读的敏感文件,或可配合文件上传漏洞使用。
2. 远程文件包含(RFI, Remote File Inclusion)
攻击者包含远程服务器上的恶意文件,直接执行远程代码。
利用条件:
allow_url_fopen = Onallow_url_include = On
⚠️ 注意:现代PHP环境默认关闭这两个配置,因此RFI漏洞相对较少,但一旦存在,危害极大。
常见利用方式与绕过技巧
即使开发人员做了简单限制,攻击者仍可通过多种方式绕过:
| 绕过方式 | 说明 | 适用场景 |
|---|---|---|
| %00截断 | 利用空字符截断后缀,如 file=shell.php%00 | PHP < 5.3.4 |
| 长度截断 | 通过超长路径使系统自动截断,如 file=shell.php/....(4096个点) | Linux > 4096字符 |
| 伪协议利用 | 使用PHP封装协议读取或执行文件 | allow_url_fopen=On |
| 大小写绕过 | 如 file=Shell.PHP | Windows系统 |
| 编码绕过 | 使用URL编码、双写等混淆手段 | WAF或简单过滤场景 |
PHP伪协议的高级利用
PHP支持多种封装协议,攻击者常利用以下协议进行攻击:
| 协议 | 用途说明 |
|---|---|
php://filter | 读取文件源码(Base64编码),如:php://filter/read=convert.base64-encode/resource=config.php |
php://input | 将POST数据当作PHP代码执行,常用于写入WebShell |
data:// | 直接执行传入的PHP代码,如:data://text/plain,<?php phpinfo();?> |
zip:// / phar:// | 包含压缩包内的文件,可配合上传图片马使用 |
✅ 防御提示:建议关闭不必要的PHP封装协议,尤其是
php://input和data://。
常见敏感文件路径(攻击者常读取)
| 系统 | 文件路径 | 用途 |
|---|---|---|
| Linux | /etc/passwd | 用户账户信息 |
/etc/shadow | 用户密码哈希 | |
/var/log/apache2/access.log | Web访问日志 | |
/proc/self/environ | 环境变量(可能含WebShell) | |
| Windows | C:\boot.ini | 系统版本信息 |
C:\php\php.ini | PHP配置文件 | |
C:\Windows\repair\SAM | 系统账户密码备份 |
如何防御文件包含漏洞?
1. 代码层防御
使用白名单机制,限制可包含的文件名。
避免直接使用用户输入作为文件路径。
使用绝对路径,避免目录遍历。
2. 服务器配置
关闭危险配置:
设置
open_basedir限制文件访问范围:
3. 安全开发规范
所有用户输入必须经过过滤和验证。
定期进行代码审计和安全测试。
使用Web应用防火墙(WAF)拦截恶意请求。
文件包含漏洞虽“古老”,但在实际渗透测试和CTF竞赛中仍屡见不鲜。它不仅考验开发人员的安全意识,也对运维人员的配置能力提出要求。安全无小事,一个小小的 include() 函数,若处理不当,就可能成为黑客入侵的“后门”。
作为开发者,应始终遵循“最小权限”和“输入验证”原则;作为安全爱好者,应深入理解其原理与利用方式,才能更好地防御。





















