为什么你不能窃取同步器令牌来做 CSRF?

信息安全 http javascript csrf
2021-08-31 20:30:13

我正在阅读 CSRF 并且遇到了同步器令牌。我不明白为什么你不能做一个 CSRF 来获取令牌来做一个真正的 CSRF。

示例:在以下bank.com位置有这样的表格https://bank.com/transfer

<form action="https://bank.com/do_transfer" method="post">
  <input type="hidden" name="synchroniser_token" value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" >
  <input type="hidden" name="to"                 value="ciro">
  <input type="hidden" name="amount"             value="100">
  <button type="submit">Send 100$ to Ciro.</button>
</form>

此代码改编自https://stackoverflow.com/a/26895980/1512962

什么会阻止在客户端使用 JavaScript 进行malicioussite.comGET https://bank.com/transfer(使用已存储在 cookie 中的会话 ID)并为authenticity_token? 然后,他们可以使用该 ID 来做一个真正的CSRF,本质上是一个 CSRF 来做另一个 CSRF。

它需要 JavaScript 来执行,所以它比简单的 0px X 0px 图像更难,但它不仅仅是可行的。

1个回答

阻止恶意站点获取反 CSRF 令牌的是同源策略。同源策略或 SOP 位于浏览器级别,并定义允许 JavaScript 通信的位置。

JavaScript onexample.com无法调用example.org来获取数据。此外,由于端口不同,JavaScript onhttp://www.example.com/无法调用。http://www.example.com:8080/设置了更多限制,可以在此处找到:https ://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy 。

跨域资源共享也有例外,但它有自己的规则,浏览器必须遵循。CORS 可以在这里找到:https ://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 。