codeigniter Phil Strugeon REST服务器-Digest Auth中是否真的存在安全漏洞,或者我误解了什么?

xuo3flqw  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(146)

最近我为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值而增加,从而适当地拒绝任何错误的请求。
服务器应记住它最近生成的随机数值。它还可能记住每个随机数值是何时发出的,并在一段时间后使它们过期。如果使用了过期值,服务器应使用“401”状态代码进行响应,并将stale=TRUE添加到验证标头中,指示客户机应使用提供的新随机数值重新发送。而不提示用户输入另一用户名和密码。
但是我在源代码中没有看到任何关于检查cnce,nc或nonce的内容,这是否意味着记录了客户端到服务器的请求并通过了身份验证的人可以在将来“重放”它并获得新的资源值?
是真的有漏洞吗?还是我误解了什么?

zwghvu4y

zwghvu4y1#

我在看codeigniter-restserver时也注意到了这一点,它很容易受到重放攻击,因为正如你所说,它没有强制执行nonce。
摘要式身份验证需要握手:
1.客户端使用Authorization发出请求。请求将失败,因为客户端还不知道nonce
1.服务器使用WWW-Authenticate报头进行响应,该报头包含要使用的正确随机数
1.客户端使用服务器响应中提供的随机数发出相同的请求
1.服务器检查随机数是否匹配并提供所请求的URL。
要实现这一点,您需要在REST服务器上启动一个会话来记住nonce。确保nonce始终唯一的一个简单方案是使用uniqid()等函数使其基于当前时间。

相关问题