我通常可以与 CSRF 交谈,但不能与 Spring 框架(我没有使用过)交谈。由于我无法用 Spring 本身验证您的声明,因此我将按面值接受您的声明。即:
- 您可以通过使用您选择的任何会话进行有效调用来获取 CSRF 令牌
- 如果您强制任何其他用户使用您的 CSRF 令牌发出请求,Spring 将接受它作为有效令牌
假设您的发现是准确的(我也不怀疑您,我只是无法自己验证),这些是我的直接想法:
- 不应允许 CSRF 令牌像这样跨会话。
- 我当然会认为这是一个安全漏洞。
- 需要有关 Spring 如何验证 CSRF 令牌的其他详细信息来确定此处是否存在实际的攻击向量。
详细地说,CSRF 令牌绝对不能跨会话。每个 CSRF 令牌都应该与生成它的会话相关联,并且它不应该是任何其他会话的有效令牌。正如您所指出的,允许令牌跨会话使攻击者可以事先生成有效令牌。这绝对是个问题。但是,有一些情况可以减轻这里的潜在威胁:
不仅仅是令牌验证
令牌只是防御 CSRF 攻击的一种方式。就个人而言,我发现它们是最直接和最可靠的方法。然而,它们并不是唯一的方法。另一种选择是检查 REFERRER 和 ORIGIN 标头. 如果 Spring 也在检查 REFERRER 和 ORIGIN 标头,那么他们的 CSRF 令牌中的这个弱点不太可能被利用。您所做的测试(通过浏览器工具手动更改 CSRF 令牌)仍会为您留下正确的 REFERRER 和 ORIGIN 标头,这意味着您将通过两个 CSRF 检查。但是,攻击者不可能重现这一点。它对您有用,因为您在实际的应用程序页面上并直接编辑了应用程序页面。攻击者将从完全不同的地方进行 CSRF 攻击,并且不能强制使用 REFERRER 和 ORIGIN 标头。因此,如果 Spring还检查 REFERRER 和 ORIGIN 标头,那么您就可以了。
Spring 两者都做吗?我不知道。为什么Spring会两者兼而有之?我不确定,虽然它符合“纵深防御”的概念,所以做这两个测试也不会太疯狂。如果两者兼而有之,那么很明显,即使 CSRF 令牌中的一个很大的弱点也无关紧要。但是,如果它在某些情况下同时执行并忽略其中之一,那么如果您可以使其忽略标头检查并欺骗 CSRF 令牌,则可能存在攻击向量。
CSRF 令牌过期
也可能存在令牌过期,这将使其难以将其转变为可利用的攻击媒介。事实上,它几乎可以肯定有一个令牌到期。作为攻击者,您可以生成一个有效的 CSRF 令牌,但如果它的有效期很短,那么您需要快速将其放在目标面前。假设您构建了一个 CSRF 攻击向量,当管理员查看您生成的恶意页面时,该攻击向量有效地将您的用户帐户提升为管理员。如果您可以在令牌过期之前诱骗管理员查看您的攻击页面,这只会对您有任何好处。根据您的交付方式和令牌到期的长度,这可能非常困难。
总结一下:这是 CSRF 的规范吗?不,事实上它有潜在的危险。可以利用吗?这更难回答。一如既往,魔鬼在细节中。是否值得深入研究?我会这么说。