带有 JSON POST 的 CSRF

信息安全 http csrf json
2021-08-21 19:58:14

我正在玩一个接受 JSON 请求并且响应也是 JSON 的测试应用程序。我正在尝试为仅接受带有 POST 方法的 JSON 数据的事务进行 CSRF 请求。如果使用 get 方法(例如 in )请求 URL,应用程序会抛出错误<script src=

此外,为了使攻击有意义,即要通过交易,我必须在请求中发送数据。如果我创建自己的页面并发送 JSON 请求,cookie 不会传播,因此服务器会返回未经身份验证的错误消息。

服务器的原始请求中没有随机令牌。

我想知道在这种情况下是否有任何方法可以成功进行 CSRF 攻击。

2个回答

您至少必须检查Content-Type: application/json请求。

不可能通过 POST<form>提交请求Content-Type: application/json但是您可以将正文中具有有效 JSON 结构的表单提交为enctype="text/plain".

不可能针对非跨域感知服务器执行跨域 ( CORS ) XMLHttpRequest POST,因为这将导致“预飞行”HTTP OPTIONS 请求首先批准它。Content-Type: application/json但是你可以发送一个跨域 XMLHttpRequest POST withCredentials如果它是text/plain.

所以即使有application/json检查,你也可以非常接近 XSRF,如果不是完全在那里的话。而且你用来确保安全的行为有些模糊,并且仍处于工作草案阶段;它们不是网络未来的硬性保证。

这些可能会中断,例如,如果enctype在未来的 HTML 版本中将新的 JSON 添加到表单中。(WHATWG 将text/plainenctype 添加到 HTML5 并且最初也尝试添加text/xml,因此这不是不可能发生的。)您增加了 CORS 实现中更小、更微妙的浏览器和插件错误的危害风险。

因此,虽然您现在可能可以侥幸成功,但如果没有适当的反 XSRF 令牌系统,我绝对不建议您继续前进。

根据https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_Flash,这可以使用 Flash 加以利用

通过浏览器堆栈发出带有 cookie 的跨域 HTTP GET 和 POST 请求的能力,与通常在浏览器中其他地方看到的限制相比更少。这是通过 URLRequest API 实现的。最值得注意的是,该功能包括指定任意 Content-Type 值和发送二进制有效负载的能力。

我自己没有测试过,但听起来很合理。

更新:看起来最新的 Flash 版本默认不再允许任何跨域请求,从而导致无法利用。

更新 #2:然而,在 flash 处理 307 重定向时存在一个长期存在的漏洞,这意味着这仍然是可利用的