4

最近我为 CodeIgniter 下载了Phil Strugeon REST 服务器。我查看了源代码,当我进行摘要身份验证时,我看到了以下代码:

if ($this->input->server('PHP_AUTH_DIGEST'))
{
    $digest_string = $this->input->server('PHP_AUTH_DIGEST');
}
elseif ($this->input->server('HTTP_AUTHORIZATION'))
{
    $digest_string = $this->input->server('HTTP_AUTHORIZATION');
}
else
{
    $digest_string = "";
}
    

稍后在检查是否存在 $digest_string 和存在用户名之后:

// This is the valid response expected
$A1 = md5($digest['username'].':'.$this->config->item('rest_realm').':'.$valid_pass);
$A2 = md5(strtoupper($this->request->method).':'.$digest['uri']);
$valid_response = md5($A1.':'.$digest['nonce'].':'.$digest['nc'].':'.$digest['cnonce'].':'.$digest['qop'].':'.$A2);

if ($digest['response'] != $valid_response)
{
    header('HTTP/1.0 401 Unauthorized');
    header('HTTP/1.1 401 Unauthorized');
    exit;
}
    

Wikipedia中,我看到以下有关 HTTP Digest Auth 的文本:

对于后续请求,十六进制请求计数器 (nc) 必须大于它使用的最后一个值——否则攻击者可以简单地“重放”具有相同凭据的旧请求。由服务器来确保计数器针对它发出的每个 nonce 值增加,从而适当地拒绝任何错误请求。

服务器应该记住它最近生成的 nonce 值。它还可以记住每个 nonce 值的发布时间,并在一定时间后过期。如果使用了过期的值,服务器应该以“401”状态码进行响应,并将 stale=TRUE 添加到身份验证头中,指示客户端应该使用提供的新随机数重新发送,而不提示用户输入另一个用户名和密码。

但是,我看不到任何有关在源代码中检查 cnonce、nc 或 nonce 的信息。这是否意味着记录从客户端到服务器的请求通过身份验证的人将来可能只是“重放”它并获得新的资源价值?

真的是脆弱吗?还是我误解了什么?

4

1 回答 1

0

在查看 codeigniter-restserver 时,我也注意到了这一点。它很容易受到重放攻击,因为正如您所说,它不强制执行随机数。

摘要式身份验证需要握手:

  1. 客户通过授权提出请求。它将失败,因为客户端还不知道 nonce
  2. 服务器响应 WWW-Authenticate 标头,其中包含要使用的正确随机数
  3. 客户端使用服务器响应中提供的随机数发出相同的请求
  4. 服务器检查随机数是否匹配并提供请求的 url。

为此,您需要在 REST 服务器上启动一个会话以记住 nonce。确保 nonce 始终唯一的一个简单方案是使用诸如 uniqid() 之类的函数将它基于当前时间

于 2013-11-16T14:03:51.013 回答