在当今复杂的网络安全环境中,文件包含漏洞(File Inclusion Vulnerability)作为一种常见且高危的Web安全漏洞,长期威胁着各类动态网站和应用系统的安全。作为数码科技领域的从业者或爱好者,了解文件包含漏洞的原理、分类与利用方式,不仅能提升你的安全意识,更能为开发更安全的应用打下坚实基础。

本文将深入浅出地解析文件包含漏洞的核心机制,结合真实场景与技术细节,带你全面掌握这一关键安全知识点。
什么是文件包含漏洞?
文件包含漏洞(File Inclusion),是指Web应用程序在使用编程语言(如PHP)提供的文件包含函数(如 include()、require())时,未对用户可控的文件路径进行严格校验,导致攻击者可以指定任意本地或远程文件被服务器包含并执行。
这类漏洞的核心风险在于:被包含的文件路径由用户输入控制。一旦攻击者能操控这一路径,就可能读取敏感文件、执行恶意代码,甚至完全控制服务器。
✅ 核心条件:
应用使用了文件包含函数(如 PHP 的
include,require等)。被包含的文件路径受用户输入影响(如通过URL参数传递)。
文件包含漏洞的两大类型
根据被包含文件的来源,文件包含漏洞主要分为两类:
1. 本地文件包含(LFI, Local File Inclusion)
当攻击者能够使服务器包含其本地系统上的文件时,即为本地文件包含。例如:
如果 page 参数未加过滤,攻击者可传入 ../../../../etc/passwd,尝试读取系统敏感文件。
常见利用场景:
读取系统配置文件(如
/etc/passwd、/etc/shadow)包含日志文件(如 Apache 的
access.log)实现代码执行结合文件上传功能,上传“图片马”后通过包含执行
2. 远程文件包含(RFI, Remote File Inclusion)
当服务器允许包含远程URL上的文件时,攻击者可指定其控制的服务器上的恶意脚本,实现远程代码执行。
前提条件:
php.ini中allow_url_fopen = Onphp.ini中allow_url_include = On(默认关闭)
示例:
攻击者请求:
若条件满足,服务器将下载并执行 shell.txt 中的PHP代码,导致远程代码执行(RCE)。
PHP伪协议:文件包含的“高级玩法”
PHP内置的多种伪协议为文件包含漏洞的利用提供了强大工具,尤其在无法直接上传文件时,这些协议成为关键突破口。
1. php://input —— 直接执行POST数据
该协议允许读取HTTP请求体内容。当 allow_url_include=On 时,可直接执行POST中的PHP代码。
利用方式:
服务器将执行 system('whoami') 并返回结果。
2. data:// —— 内联数据执行
通过 data:// 协议,可直接在URL中嵌入PHP代码。
Base64编码示例:
解码后内容为 <?php phpinfo(); ?>,可直接执行。
3. php://filter —— 源码读取利器
该协议不执行代码,而是用于读取文件内容,常用于审计时获取PHP源码。
读取源码示例:
返回内容为Base64编码的 index.php 源码,解码后即可查看。
4. zip:// / phar:// —— 压缩包文件包含
通过上传ZIP压缩包,再利用 zip:// 协议包含其中的PHP文件,绕过文件上传限制。
格式:
文件包含漏洞的危害
| 危害类型 | 说明 |
|---|---|
| 敏感信息泄露 | 读取 /etc/passwd、数据库配置、日志文件等 |
| 远程代码执行(RCE) | 通过包含恶意脚本获取服务器控制权 |
| WebShell植入 | 上传并执行一句话木马,长期控制服务器 |
| 权限提升 | 结合其他漏洞实现提权或内网渗透 |
如何防御文件包含漏洞?
✅ 安全开发建议:
使用白名单机制
避免用户直接控制文件路径
使用ID映射文件名(如
page=1→home.php)禁止目录穿越(过滤
../)关闭危险配置
最小权限原则
Web进程使用低权限账户运行
敏感目录禁止Web用户读取
输入验证与路径规范化
使用
realpath()解析路径并验证是否在允许目录内
文件包含漏洞虽“古老”,但因其隐蔽性和高危害性,至今仍活跃于各类安全事件中。无论是本地包含读取敏感文件,还是远程包含执行恶意代码,亦或是通过PHP伪协议实现高级利用,其核心都在于对用户输入的路径缺乏有效控制。
作为开发者,应始终坚持安全编码规范,避免路径拼接、关闭危险配置、使用白名单;作为安全研究人员,则需熟练掌握各类利用技巧,以便在渗透测试中精准识别风险。
🔐 安全无小事,细节定成败。 掌握文件包含漏洞原理,是每一位数码科技从业者不可或缺的技能。





















