11

更新:GWT 2.3 引入了一种更好的机制来对抗 XSRF 攻击。请参阅http://code.google.com/webtoolkit/doc/latest/DevGuideSecurityRpcXsrf.html


GWT 的 RPC 机制对每个 HTTP 请求执行以下操作 -

  1. 设置两个自定义请求标头 - X-GWT-Permutation 和 X-GWT-Module-Base
  2. 将内容类型设置为 text/x-gwt-rpc;字符集=utf-8

HTTP 请求始终是 POST,并且在服务器端 GET 方法会引发异常(不支持该方法)。

此外,如果这些标头未设置或具有错误的值,服务器将无法处理并出现异常“可能是 CSRF?” 或类似的东西。

问题是:这足以防止 CSRF 吗?有没有办法在纯跨站点请求伪造方法中设置自定义标头和更改内容类型?

4

4 回答 4

6

如果浏览器正在使用这个 GWT RPC,那么它 100% 容易受到 CSRF 的攻击。内容类型可以在 html<form>元素中设置。 X-GWT-Permutation并且X-GWT-Module-Base不在 Flash 的禁止标头黑名单中。因此,可以使用 Flash 进行 CSRF 攻击。您可以信任的 CSRF 保护的唯一标头元素是“引用者”,但这并不总是最好的方法。尽可能使用基于令牌的 CSRF 保护。

以下是我写的一些漏洞利用,它们应该能够阐明我所描述的晦涩攻击。对此的 Flash 漏洞利用看起来像这样是一个改变内容类型的 js/html 漏洞利用。

我的漏洞利用是为 Flex 3.2 编写的,而 Flex 4 (Flash 10) 中的规则发生了变化。这是最新的规则,大多数标头只能针对请求 POST 进行操作。

navigateTo()用于 CSRF 的 Flash 脚本: https ://github.com/TheRook/CSRF-Request-Builder

于 2010-04-09T18:49:28.323 回答
4

GWT 2.3 引入了一种更好的机制来对抗 XSRF 攻击。请参阅GWT RPC XSRF 保护

于 2011-09-07T18:42:40.370 回答
3

我知道我问过这个问题,但经过大约一天的研究(感谢 Rook 的指点!),我想我有了答案。

GWT 提供的开箱即用不会保护您免受 CSRF 的影响。您必须采取GWT 应用程序的安全性中记录的步骤来保持安全。

GWT RPC 将“content-type”标头设置为“text/x-gwt-rpc; charset=utf-8”。虽然我没有找到使用 HTML 表单设置它的方法,但在 Flash 中这样做很简单。

自定义标头 - X-GWT-Permutation 和 X-GWT-Module-Base 有点棘手。不能使用 HTML 设置它们。此外,除非您的服务器在 crossdomain.xml 中明确允许,否则无法使用 Flash 设置它们。请参阅Flash Player 10 安全性

此外,当 SWF 文件希望将自定义 HTTP 标头发送到其自己的源主机以外的任何地方时,请求被发送到的 HTTP 服务器上必须有一个策略文件。此策略文件必须枚举 SWF 文件的源主机(或更大的主机集),以允许将自定义请求标头发送到该主机。

现在 GWT 的 RPC 有两种风格。有旧的自定义序列化格式 RPC,以及新的基于 JSON 的 de-RPC。AFAICT,客户端代码始终设置这些请求标头。旧式 RPC 现在不在服务器端强制执行这些标头,因此可能会发生 CSRF 攻击。新样式的 de-RPC 强制执行这些标头,因此可能会或可能不会攻击它们。

总的来说,如果您关心安全性,请确保在您的请求中发送强大的 CSRF 令牌,并且不要依赖 GWT 来阻止它。

于 2010-04-10T20:30:31.883 回答
0

我不确定,如果有一个简单的方法(我也非常有兴趣找到它!),但至少似乎有一些高级方法可以实现具有任意标头的任意跨站点请求:http:/ /www.springerlink.com/content/h65wj72526715701/我没买论文,但是摘要和介绍听起来很有趣。

也许这里有人已经阅读了论文的完整版,并且可以扩展一点?

于 2010-04-09T20:03:19.843 回答