最近我为CodeIgniter下载了Phil Strugeon REST server。 我查看了源代码,当我进入摘要式身份验证时,我看到了以下代码:
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摘要验证的以下文字:
对于后续请求,十六进制请求计数器(nc)必须大于它使用的最后一个值 - 否则攻击者可以简单地“重放”具有相同凭据的旧请求。服务器需要确保计数器为其发出的每个nonce值增加,并适当地拒绝任何错误请求。
服务器应该记住它最近生成的nonce值。它还可能记住每个nonce值的发布时间,在一定时间后到期。如果使用过期值,服务器应使用“401”状态代码进行响应,并将stale = TRUE添加到身份验证标头,指示客户端应使用提供的新nonce重新发送,而不提示用户输入其他用户名和密码。
但是我看不到有关在源代码中检查cnonce,nc或nonce的任何信息。 这是否意味着从客户端向服务器记录通过身份验证的请求的人可能在将来“重播”它并获得新的资源价值?
这真的很脆弱吗?或者我误解了什么?
答案 0 :(得分:0)
在查看codeigniter-restserver时我也注意到了这一点。它很容易受到重播攻击,因为正如你所说,它不会强制执行nonce。
摘要式身份验证需要握手:
要实现此目的,您需要在REST服务器上启动会话以记住nonce。确保nonce始终是唯一的简单方案是使用诸如uniqid()之类的函数将其基于当前时间