【转载】PHP本地文件包含和远程文件包含漏洞

远程文件包含(Remote File Inclusion),简称RFI,与其对应的是本地文件包含(Local File Inclusion,LFI),它们都是通过PHP的包含函数即:require(),require_once(),include()和include_once()来使用。

一般情况下,用户通过包含函数将具有特定功能的函数或类包含到当前脚本中,是没有什么问题的。但是有时候,为了方便,需要动态的包含文件,这就会留下一些攻击漏洞。

通常情况下,LFI攻击威胁不大,因为本地服务器上的文件是比较确定的,攻击者想要上传带有攻击性代码的文件也不是件容易的事。RFI攻击才是我们需要防范的事。那么,RFI攻击是如何实现的呢?

首先,提供一个存在RFI漏洞的代码示例(index.php):

<?php
// 存在RFI漏洞的代码片段

$file = $_GET[‘file‘];
include $file;

?>

  

脚本中使用了利用GET方法来动态包含文件,例如:在index.php同级目录下存在include.php文件,我们就可以通过访问类似URL“127.0.0.1/lab/index.php?file=include.php”来包含include.php文件,随后,服务器将解析include.php脚本,将产生的HTML代码传送给浏览器执行。

目前看来,还没出现什么安全问题,因为还仅仅只是包含本地文件。如果是包含远程文件,问题就来了,因为攻击者是可以任意编码远程文件的。

需要说明的是,进行RFI攻击需要同时具备三个条件(被攻击机器):

  1. allow_url_fopen = On    (默认开启)
  2. allow_url_include = On  (默认关闭)
  3. 被包含的变量前没有目录的限制

同时满足了这三个条件,就等于为攻击者打开了大门。为了清楚地理解,下面给出一个LFI攻击的实例。(说明:在本地搭建一个存在RFI漏洞的环境,通过包含一个远程主机上的文件来攻击这个本地主机)

第一步:设置php.ini文件,将“allow_url_fopen ”和“allow_url_include”都开启,重启Apache。

第二步:创建存在RFI漏洞的脚本文件,如上面的index.php。

第三步:在远程主机上创建一个带有攻击性代码的文本文件hack.txt(Just test),注意这个文件不能被服务器解析,如不能为PHP脚本文件。因为只是演示,文本文件被执行就能满足演示效果了。hack.txt文件内容如下:

hahaha,You are hacked. <?php echo $_GET[‘a‘]; ?>

  

将文本文件放在一个拥有登录权限的主机根目录下,文本文件在互联网上的位置为:http://yourhost/hack.txt。

第四步:将攻击文件的URL带入include,进行攻击,如图所示:

可以看到,文本文件被执行。接着,我们使用其中的PHP代码,如图所示:

可以看到,文本文件中的PHP代码被成功执行,现在只是一个演示,但是已经能说明RFI攻击过程。如果攻击者在文件中放入了系统命令,后果将不堪设想。

上面提到,攻击文件不能是PHP文件,所以有些经验丰富的开发者会考虑将被包含文件的扩展名写死,如:

<?php
// 存在RFI漏洞的代码片段

$file = $_GET[‘file‘];
include $file.‘.php‘;

?>

   这样,通过以上方法包含远程文件,系统就会警告找不到被包含文件,从而避免攻击。

这种方法确实能起到一定作用,但对那些有经验的攻击者来说,这不是问题。我们知道PHP引擎是有C来实现的,C中空字符就是字符串结束符,因此可以使用空字符将扩展名截断,实现RFI攻击。

理解了RFI攻击原理,防御也就简单了。在配置层面,保持PHP的默认设置,将“allow_url_include”关闭;在代码层面,如果一定要动态包含文件,最好明确规定包含哪些文件,进行白名单比对。同时,也可以在包含函数中加入目录限制。

时间: 2025-01-13 21:19:07

【转载】PHP本地文件包含和远程文件包含漏洞的相关文章

Bash远程文件传输命令scp

备份远程文件(远程——>本地) scp -r 远程用户名@ip:文件绝对路径 本地绝对路径 还原远程文件(本地——>远程) scp -r 本地路径 远程用户名@ip:远程绝对路径 如果SSH端口号有变化,则使用 scp -P port [email protected]…………:/dir

linux学习笔记——打包、压缩、远程文件传输

############打包.压缩########################## 1.打包 (打包表示把一堆文件变成一个)tar            ##打包工具        -f        ##指定生成包的名字        -c        ##创建包        -v        ##显示创建过程        -t        ##查看包中内容        -x        ##解包        -r        ##追加文件到包中        -C  

下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片

将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 #region 图片下载[使用流.WebRequest进行保存] 4 /// <summary> 5 /// 图片下载[使用流.WebRequest进行保存] 6 /// </summary> 7 /// <param name="fileUrl">图片URL地址(例如:http://img.baidu.com/video/img/video

[PHP学习教程]004.下载/采集远程文件到本地(Download File)

引言:如何把http://mzitu.com里的图片全部下载下来呢? 一身浩然正气的AC陷入的深思.... 当然这里涉及到的功能有线程,网页请求,页面提取,下载图片等等.今天,我们先讲一下如何下载文件.后面的教程请参看本博客的[PHP自动化-进阶]系列. 函数接口: array download_file ( [string url], [string fileName], [string dirName], [array fileType], [string type]) 方法声明: 下载任何

emacs使用本地emacs server模式打开远程文件

使用emacs的用户都知道,一般要打开远程机器上的文件要使用TrampMode模式,调用方式例如以下: C-x C-f /remotehost:filename RET (or /method:[email protected]:filename) 但,这样打开有点麻烦,你必要输入username和机器ip等 emacs提供了一种client/server的模式,当我们在本地打开一个emacs,能够将它作为server执行 然后,在本地机器的其它都方要用emacs的时候,如在terminal中要

php远程文件包含截断问题

今天在学习<白帽子讲web安全>一书是,提到一个php远程文件包含漏洞 可以从攻击者服务器中的一个写好的攻击脚本中远程执行命令 服务器中有漏洞的页面代码为: #test.php#error_reporting(0); $route="share"; $basePath=$_GET['param']; if ($route == "share") { require_once $basePath.'/action/mshare.php'; } elseif

当地使用impdp导出服务器转储文件,本地使用impdp导入远程数据库用户

本地使用impdp导出服务器转储文件,本地使用impdp导入远程数据库用户 1)expdp是可以在客户端上生成转储文件的 2)impdp是可以在不同的实例之间进行数据的迁移复制的 练习1: 1)将远程数据库WSJB用户使用expdp命令导出到本地磁盘的D:\下 Microsoft Windows [版本 6.1.7600] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\windows\system32>sqlplus system/system S

Git基础教程(建库,并将本地文件提交到远程github仓库)

说明: 1.本教程远程仓库使用的是github 2.全命令行操作 3.以下某些文件夹名称为".XX",此类文件夹在windows中默认是隐藏文件,需要打开设置才能显示出现 具体步骤为[打开资源管理器-工具-文件夹选项-导航窗格-勾选"显示所有文件夹"] 正文: 1.软件准备 ①下载并安装客户端. 百度"Git",根据系统类型自行下载相应版本并安装(点击此处直达),以下教程为windows版本 ②打开客户端. 任意目录右击鼠标,选择"Gi

利用PHP应用程序中的远程文件包含(RFI)并绕过远程URL包含限制

来源:http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html?m=1 前言 文章讲诉了如何绕过远程URL包含限制.在PHP开发环境php.ini配置文件里",allow_url_include"为"off"的情况下,不允许PHP加载远程HTTP或FTP url包含远程文件.但是使用SMB依旧可以加载. 攻击思路 攻击者需要