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

Vya*_*tva 5 rest codeigniter

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

\n
if ($this->input->server(\'PHP_AUTH_DIGEST\'))\n{\n    $digest_string = $this->input->server(\'PHP_AUTH_DIGEST\');\n}\nelseif ($this->input->server(\'HTTP_AUTHORIZATION\'))\n{\n    $digest_string = $this->input->server(\'HTTP_AUTHORIZATION\');\n}\nelse\n{\n    $digest_string = "";\n}\n    \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
// This is the valid response expected\n$A1 = md5($digest[\'username\'].\':\'.$this->config->item(\'rest_realm\').\':\'.$valid_pass);\n$A2 = md5(strtoupper($this->request->method).\':\'.$digest[\'uri\']);\n$valid_response = md5($A1.\':\'.$digest[\'nonce\'].\':\'.$digest[\'nc\'].\':\'.$digest[\'cnonce\'].\':\'.$digest[\'qop\'].\':\'.$A2);\n\nif ($digest[\'response\'] != $valid_response)\n{\n    header(\'HTTP/1.0 401 Unauthorized\');\n    header(\'HTTP/1.1 401 Unauthorized\');\n    exit;\n}\n    \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

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

\n

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

\n
\n

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

\n

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

\n

Jas*_* S. 0

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

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

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

为了实现这一点,您需要在 REST 服务器上启动一个会话来记住随机数。确保随机数始终唯一的一个简单方案是使用 uniqid() 等函数将其基于当前时间