为什么双重提交 CSRF 令牌应该是加密强随机数?

信息安全 Web应用程序 应用安全 csrf 随机的
2021-08-24 14:53:00

我刚刚浏览了 OWASP 的 CSRF 预防备忘单。关于双重提交cookies方法,它说:

该站点应该生成一个(加密强度高的)伪随机值

这种方法完全依赖于攻击者无法注入 Cookie/Header 的事实。

根据同源策略,攻击者无法读取从服务器发送的任何数据或修改 cookie 值。

那么,为什么伪随机值在密码学上应该是强的?

3个回答

简短回答:防止暴力破解 CSRF 令牌。

让我们举一个简单的例子:假设你的令牌是一个数字,接受从 0 到 9 的值。
现在可以肯定,攻击者无法从 cookie 或标头中读取该值,但她不必这样做 - 她可以进行攻击发送 10 个 CSRF 请求,每个请求一个可能的值。其中之一将是正确的。

使用加密的强随机值可以防止这种情况发生,并且可以防止攻击者尝试扩大这种攻击(通过让攻击发送例如 1000 个请求而不是 10 个或 10,000 个或...)

结合两个答案中最好的:

  1. 令牌长度需要与受害者的数量和每个受害者的请求数成正比。如果攻击者说服X受害者导航到他的页面(通过垃圾邮件或网络钓鱼攻击)并且每个此类页面尝试Y不同的令牌,那么您需要保护自己免受 2 x*y攻击。例如,如果您的令牌长度为 16 位长,则攻击者需要发送 2 16封电子邮件,每封电子邮件尝试 1 个令牌,或 2 8封电子邮件,每封电子邮件尝试 2 8令牌。攻击者可以使用 Javascript 或通过在每个页面嵌入多个恶意图像链接来测试多个令牌。

  2. 您想使用加密安全的随机数生成器来防止攻击者自己请求多个令牌,然后使用他们获得的序列来预测其他用户在不久的将来会获得哪些令牌。

它没有

它必须是伪随机的。

CSRF 与暴力攻击不兼容。考虑攻击向量:

  1. 恶意用户制作带有 HTML 的特殊电子邮件或网页,发布到感兴趣的站点
  2. 用户登录到感兴趣的站点,并且会话 ID 是被动传递的(它是一个 cookie)
  3. 用户被诱骗点击特制电子邮件或网页中的链接
  4. 链接“伪造”请求。该链接不必包含会话 ID,因为它位于 cookie 中。它不必传递在标头中找到的 CSRF 令牌(它是被动传递的——它是一个 cookie)。但它确实必须在表单帖子中包含 CSRF 令牌。

黑客不可能诱骗任何人点击链接数百次。即使它是一个通过单击发送大量请求的脚本(假设黑客已经知道如何做到这一点——浏览器不允许跨域 AJAX 请求,所以我们可能正在谈论一个包含数百个请求的页面清晰的 GIFS 或其他完全古怪的东西),如果不超时,它将无法通过大量搜索空间。

此外,攻击者无法确定攻击是否适用于特定值——这是一种“即发即弃”攻击。

因此,CSRF 令牌可以被暴力破解的想法充其量是牵强附会的。黑客必须亲自登录——这完全是一种不同的攻击。

你真正需要任何熵的唯一原因是因为 CSRF 攻击往往是通过垃圾邮件传递的。假设你是个白痴,你的 CSRF 令牌只有 16 位熵,黑客用完全相同的令牌发送了 65,536 封垃圾邮件。65536/2^16 =其中一种攻击实际上会成功。假设 0% 的电子邮件点击垃圾邮件过滤器,100% 的用户打开它们,并且 100% 的用户碰巧在点击恶意链接的那一刻登录到您的应用程序。

除了希望吸引大量用户之外,黑客无法将攻击规模扩大到足以将其称为具有任何意义的暴力攻击。