【问题标题】:CSRF for RESTful API用于 RESTful API 的 CSRF
【发布时间】:2018-09-03 20:43:55
【问题描述】:

据我了解CSRF,这是一个非常简单的方案:

  1. 用户 (Bob) 在其浏览器中具有 MyApp.com 的身份验证 cookie。
  2. 攻击者向 Bob 发送电子邮件,其中包含指向 MyApp-Crack.com 网站的链接,其中带有魔术按钮“点击赢取 10.000 美元”,这是一个带有 action="myapp.com/user/delete 的简单隐藏表单的按钮="sumbit" -account.php" 方法="POST"
  3. 单击此按钮会使用 Bob 的身份验证 cookie 创建对 myapp.com/user/delete-account.php 的 POST 请求。
  4. 请求已通过身份验证并执行所需的操作。

想象一下 MyApp.com 是带有 RESTful 后端的纯 SPA,示例中的 url (myapp.com/user/delete-account.php) 是相当 RESTful API (myapp.com/API/delete-account.json) 并被调用仅来自浏览器 javascript(角度)或移动应用程序(使用 JWT)。

想法:如果我在 JavaScript 中的任何请求中添加特定标头:

headers.append('X-MyApp-Source', 'angular-app');

并添加服务器端检查:

if (user.AuthType == "cookies" && !request.Headers.Contains("X-MyApp-Source"))
{
   return (400, "Bad request, missing source header");
}

攻击者有什么方法可以使用 Bob 的带有请求标头的 cookie 创建请求?

  • MyApp.com 无法嵌入 iframe X-Frame-Options
  • MyApp-Crack.com 上的隐藏 html 表单不会添加此标题
  • 不同域上的javascript添加标头但不发送cookie
    • 这不是真的。属性 XMLHttpRequest.withCredentials: true 将发送 cookie.

我并不是说我的想法是无懈可击的,只是 brianstorm。

谢谢!

【问题讨论】:

    标签: angular .net-core csrf csrf-protection


    【解决方案1】:

    为什么MyApp-Crack.com 不使用withCredentials: true 将相关的auth cookie 发送到myapp.com?它无法读取cookie值,但仍然可以发送。

    还可以使用旧的(或故意恶意的)浏览器插件或扩展(Java、Flash 等的旧版本)来添加标头。它与防止 CSRF 的 Referer/Origin 检查大致相同 - 总比没有好,但不是你能做的最好的。

    所以在理想情况下,它不会直接受到攻击,但也不是很健壮。

    【讨论】:

    • 科索诺姆·加博尔!所以,我最后的说法是不正确的。不同域上的 Javascript 添加标头并发送 cookie。
    猜你喜欢
    • 2014-02-12
    • 2015-03-21
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多