【问题标题】:Any logical loop holes in this idea for preventing Cross Site Request Forgery?这个防止跨站点请求伪造的想法中有任何逻辑漏洞吗?
【发布时间】:2010-11-07 12:49:03
【问题描述】:

我已经阅读了几个 XSRF 解决方案,它们依赖于向响应中添加更多令牌,这确实有助于保护仅在 POST 上运行的代码。

即这将是一个依赖于响应 HTTP GET 的页面的一步攻击

<img src="http://amazon.com/buybook/anarchistscookbook/mailto/me/execute.php">

但是使用 jquery 等更好的库,编写恶意 javascript XmlHttpRequest 脚本变得越来越容易,可以进行两步攻击(GET,解析 Anti-XSRF 视图状态/查询字符串/额外 cookie 等),然后提交 POST . (或者是吗?我不担心 AES 很快就会被破解,我是否应该担心针对 HTTP POST 操作的 2 步 XSRF 攻击变得像上面显示的 img 标签攻击一样容易?)

我想一步攻击可以通过在 GET 上不做任何敏感的事情来阻止,这两种攻击都可以通过要求网站用户解决 CAPTCHA 来阻止,然后产生一个查询字符串令牌,它将其余会话的所有 URL 都需要?

到目前为止,它似乎只有在 CAPTCHA 失败时才会失败,例如 OCR 软件是否可以读取文本或是否有机械土耳其人组件。

编辑:考虑到的特定攻击是带有 xhr javascript 或图像标签的电子邮件。因此代码将在电子邮件客户端的浏览器或从本地文件系统加载的 HTML 页面中执行。为简单起见,我认为该站点没有 XSS 漏洞(即恶意用户没有机会将其 HTML 注入站点作为响应发送的 HTML)

【问题讨论】:

    标签: security csrf same-origin-policy


    【解决方案1】:

    我认为您对同源政策感到困惑。请求本地文件中的 html 页面不会规避此策略。事实上,我相信更严格的规则适用于文件资源。您会发现本地 html 文件中的 Javascript 将能够成功请求检索非本地资源。

    现代浏览器不允许使用 Javascript 在本地 HTML 文件中访问远程 HTTP 资源。

    您在哪个浏览器中能够成功地从 file:/// 资源执行跨域 XHR?

    我在 ie6、ie7、ie8、firefox 3、firefox 3.5 以及 windows 上的 chrome、opera 和 safari 的最新版本中对此进行了测试;都拒绝跨域的http请求。

    <html>
    <head>
    <script 
      type="text/javascript" 
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
      $(document).ready(function() {
        $( '#xhr' ).append( 'replace me with remote xhr' );
        $( '#xhr' ).load( 'http://stackoverflow.com/', function() {
          $( '#xhr' ).append( 'xhr load complete' );        
        });
      });
    </script>
    </head>
    <body>
      test
      <div id="xhr">original</div>
    </body>
    </html>
    

    可能一些更旧的浏览器限制较少。

    【讨论】:

    • 更少的“可能”和更多的“已知事实”。在greasemonkey 出现之前,我编写了将远程站点嵌入框架并使用javascript 修改它们的页面。
    【解决方案2】:

    现在 XmlHttpRequests 和 javascript 框架操作都不能跨域工作;那将是纯粹的精神错乱。如今的 CSRF 攻击通常包括您提到的图像标签或自动生成一个 POST 到另一个站点的表单。但是,检索反 XSRF 令牌(可能是基于每个会话生成的加密随机数)几乎是不可能的。只有当它是一个不检查用户会话和 IP 地址的非常糟糕的令牌时,才可能利用服务器端语言来检索它,然后将它与客户端 CSRF 结合起来。除了令牌之外,很多人只是通过检查引用者并阻止所有远程域来阻止 CSRF。由于域限制,几乎不可能使用 XmlHttpRequests 提交 CSRF。

    无论如何,您不必担心 XmlHttpRequest 能够访问远程域。唯一可能发生的情况是如果你有 XSS 漏洞,在这种情况下,正如 EricLaw 所说,你已经被淹没了。

    【讨论】:

    • 如果页面是从本地文件系统加载的(比如恶意电子邮件的结果),那么 xhr 似乎能够向用户登录的站点发布帖子。我不清楚跨域规则如何影响在本地文件系统上运行的 JS。
    • 据我所知,这些技巧已经被阻止了一段时间。此外,如果您正在讨论您的用户下载和运行特洛伊木马,那么您真的无法保护您的网站。
    【解决方案3】:

    关键是JavaScript无法从跨域上下文中读取anti-XSRF令牌,而XMLHTTPRequest只是同源的,所以不能用来窃取令牌。

    如果您的网站已经存在 XSS 漏洞,那么您已经被水淹没了,反 XSRF 令牌将无济于事。

    【讨论】:

    • 嗯,很有趣。您指的是 HTTPOnly 双重提交的 cookie,对吗?关于 XSS,没错,但你不需要 XSS 来实现 XSRF?经典示例是带有 JavaScript 用于 POST 或带有图像标记用于 GET 的电子邮件。
    • 如果网站根本不尝试缓解 XSRF,那么是的,坏人不需要 XSS 来利用它。针对 XSRF 的典型防御是使用一次性令牌,可以是表单,也可以是 cookie。如果相关网站存在 XSS 漏洞,这种防御通常无效。
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2019-05-26
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多