做了CNSS的新生题遇到了这样的题型,发现了这篇文章,所以自己就翻译了一下,顺便提升一下英语,渣英语请见谅。 原文: Bypassing .htaccess/.htpasswd Based Authentication


介绍

其实这个标题有点标题党的嫌疑,实际上身份验证方式叫做BA(Basic Access的缩写)。表单自身请求一个HTTP用户代理(user-agent)来提供凭证。即使在系统内的活动中没有已建立的活动会话(active sessions)。如果你仍然不知道我在说些什么,看看我在文章开始时特意放的图片。

利用

其实,我可以跳过所有多余的信息来简要的描述如何利用这个技巧来实现攻击,但是授人以鱼不如授人以渔。我想让那些阅读这篇文章的读者获得实际的逻辑,了解处理这个事件的代码逻辑,以及整个供给链是如何建立的。首先,假设我们有以下这样的.htaccess规则

1
2
3
4
AuthUserFile /mnt/web/guide/somewhere/somepath/.htpasswd
AuthGroupFile /dev/null
AuthName [Directory we want to restrict access to]
AuthType Basic

上面的规则虽然是最基本的,然而可以成功的登录。URL被解析到服务器的功能是由mod_php所支持的。如果PHP所做的是将请求方式呈现为HEAD或者是POST。在发送的方法为GETS时,将导致用于发送payload的无效方法不会被进一步检查(因为PHP没有验证这一点),甚至是shell的输出。因此,我们收到的状态码为200就意味着请求已经成功了。 现在为了避免这种情况的出现,我们需要做用于请求的方法的限制,拦截除POSTGET外的所有请求方法。

1
2
3
4
<LimitExcept GET POST>
  Order Allow,Deny
  Deny from all
</LimitExcept>

在一些实际利用的例子中,主要是讲请求重放至身份验证系统的目录中。你可以通过多种方法来做,但是为了本教程,我要用其中的两种。简单的方法是使用附加的Live HTTP Headers,它允许你查看(或/和)修改请求头,另一个方法是使用基于PHP的脚本来打开或建立与指定服务器的原始socket链接。

使用HTTP Live Headers,只需要指定方法(应不同于POSTGET),并且能事先重放请求,以便你可以修改改请求。 一旦生效,你将不需要给表单提供任何凭证从而自动获得授权。在另一方面,我要解释的是先前已经提到的socket连接。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
error_reporting(0);

$request = "Keeper / HTTP/1.1\r\n
User-Agent: Mozilla/4.0 (Compatible; whatever)\r\n
Host: google.com\r\n
Accept: */*\r\n";

$urltarget = $_POST;

$socket = fsockopen($urltarget);
fwrite($socket,$request);
$received = fread($socket,1024*1024);
echo $received;

?>

socket建立与目标的链接,并返回请求的状态来确认原因。首先,我们定义变量$request下的http头,然后,我们指定的URL应该是一个表单提供输入后的POST值(你可以写三行HTML以便检视或者忽略$_POST的使用,并直接使用该URL)。然后我们使用fsockopen()fwrite()来建立实际的连接。我们将结果储存在变量$received下,大小为1MB(这只是为了确认我们收到请求的完整性)

来,让我们通过telnet来看看这个方法是如何工作的。

使用GETS方法,我们收到了501代码,这意味着服务器无法识别请求方法,或者缺乏支持此请求的能力来获得我们的授权。

结论

以上就是我想要分享的内容。当然,我们可以进一步的深入,但是要了解整个处理过程的基本方案,不仅仅只局限与实现随机查询,攻击向量,payloads甚至没有实现(就像sql注入和XSS…)