使用 CORS 的 CSRF
Posted
技术标签:
【中文标题】使用 CORS 的 CSRF【英文标题】:CSRF using CORS 【发布时间】:2013-07-12 14:26:29 【问题描述】:我正在研究 html5 的安全问题。我看到了 Shreeraj Shah 所做的所有演讲。我尝试使用我自己的服务器模拟基本的 CSRF 攻击,使用 withCredentials 标记设置为 true(因此在响应消息中应该重放 cookie)并将 Content-Type 集添加到请求中的 text/plain (绕过预检调用) . 当我尝试开始攻击时,浏览器告诉我 XMLHttpRequest 由于 Access-Control-Allow-Origin 标头而无法完成。所以我在受害者网页的标题中放了一个 * ,浏览器告诉我,当我发送带有设置为 true 的请求时,我不能使用 * 字符。 我试图用存储在同一个域中的网络应用程序做同样的事情,一切都很好(我想这是因为浏览器不检查请求是否来自同一个域)。
我在问,这是现代浏览器最近为了避免此类问题而设置的新功能? 因为在 Shreeraj 的视频中,请求是跨不同域的,并且有效...
谢谢大家,对不起我的英语:-)
编辑:
我想我找到了 CSRF 攻击无法像 Shreeraj 的演示文稿中那样正常工作的原因。 我阅读了 2010 年发布的上一个 CORS 文档,我发现当 Access-Control-Allow-Origin 设置为 * 时,没有任何关于 with credential flag 设置为 true 的建议,但是如果我们查看最后两个关于 CORS(2012 和 2013)的出版物,在第 6.1 节中,其中一个注释是,如果 Access-Control-Allow-Origin 设置为 *,我们无法使用将凭据标志设置为 true 的请求。
以下是链接:
上一期(2010):http://www.w3.org/TR/2010/WD-cors-20100727/
最后两个(2012、2013):http://www.w3.org/TR/2012/WD-cors-20120403/ --- http://www.w3.org/TR/cors/
这是我正在谈论的部分:http://www.w3.org/TR/cors/#supports-credentials
如果我们查看以前的文档,我们找不到它,因为没有。
我认为这就是为什么今天 Shreeraj Shah 在 2012 年进行的简单 CSRF 攻击不起作用的原因(当然在遵循 w3c 建议的现代浏览器中)。可以吗?
【问题讨论】:
【参考方案1】:尽管出现浏览器错误,仍会发出请求(如果没有预检)。
Access-Control-Allow-Origin
只允许访问来自不同域的响应,它不会影响实际的 HTTP 请求。
例如即使example.com
没有使用 AJAX 设置 CORS 标头,evil.com
仍然可以向 example.com/transferMoney
发出 POST 请求。
【讨论】:
以上是关于使用 CORS 的 CSRF的主要内容,如果未能解决你的问题,请参考以下文章
使用 laravel-cors 和 axios 进行 POST 的 Laravel “CSRF 令牌不匹配”
带有 CSRF/CORS 的带有 TokenAuthentication 的 Django REST 框架