令牌和跨站请求伪造

Tokens and Cross-Site Request Forgery

我遇到过其他几个关于 CSRF 的问题,但 none 似乎回答了我的问题。关于 CSRF 的工作原理,我感觉好像缺少了一些东西。

请在回答前阅读整个 post。

我一直在阅读跨站请求伪造以及用于减轻和防止它的各种策略(是的,我知道你应该尽可能多地使用)。

然而,第一个提到的是使用嵌入在网页中的 Nonce/One 时间键作为隐藏的表单参数,所以这就是我关注的重点。

明确地说,我确实理解 Nonce 试图做什么,但它似乎也很容易被击败。当然,如果攻击者能够向另一个站点发送 POST 请求,他们也可以执行 GET 请求,从页面上抓取令牌,并将其包含在他们的请求中?

我试图想出一种方法来了解它的用处,但我真的看不出它在实践中有何帮助。

需要说明的是,我并不是想说我知道得更多。不过,除非我遗漏了一些关于 CSRF 的信息,否则这似乎是一次有效的攻击,而且我没有在任何提供防止 CSRF 攻击指南的网站上看到它。

请让我知道我哪里错了。

谢谢!

CSRF 是关于远程攻击者利用用户在网站上的 session。

首先,举个蹩脚的例子。您与您的银行进行 session(登录)。登录后,攻击者会让您访问他的恶意网站。在恶意网站上,您单击一个很棒的 link 以查看您真正想要的内容。但是,恶意网站会向 url 发布正确的数据以向攻击者转账。您不想那样做,而且您使用的网站似乎与您的银行无关。银行网站仍然收到您向攻击者转账的请求。这是可行的,因为您已经在银行设置了 session,您的 session id 存储在 cookie 中,并且无论用户点击何处,cookie 都会根据目标 url 发送(见下文)。这是 csrf 的基本情况。

因此,如果攻击者让您访问他的恶意网站,为什么他的 javascript 不能先下载银行页面,然后按照您的建议获取 csrf 令牌?

嗯,为什么他不能只读你的银行信息、账号、余额?出于同样的原因,Web 浏览器的 同源策略 (SOP)。如果攻击者网站上的恶意 javascript 向银行 url 发出请求,则请求的来源与其目的地不同。与普遍看法相反,请求将仍然发出,银行服务器将接收并处理它,并发送响应。但是,您的浏览器将不允许调用 javascript 访问来自不同来源的响应(除非发送 CORS headers,但这是一个稍微不同但相关的主题)。

因此,恶意网站上的攻击者无法访问受害用户从不同来源下载的页面,这可以防止您描述的攻击。攻击者当然可以继续自己下载银行页面,但是csrf token当然会和银行自己的session不一样。但是他无法在受害用户的 session.

中获取令牌

换句话说,页面中生成的csrf令牌和服务器上的"remembered"允许服务器检查请求是否来自服务器实际生成的页面。由于 SOP,其他网站无法通过 cross-domain 请求访问此令牌。

请注意,上面关于无论请求来源如何都会发送 cookie 的说法不一定正确。 cookie 的 new-ish SameSite 属性允许对哪些 cookie 应该发送到哪里进行一些控制,并且此属性可以有效地缓解 CSRF 在兼容的浏览器中,并具有一些用户体验影响。

另请注意,XSS 漏洞确实允许攻击者读取 CSRF 令牌 - 或页面中与此相关的任何其他数据。因此 XSS 通常被认为是比 csrf 更严重的缺陷。