【问题标题】:XSS between HTTP and HTTPS versions of the same domain同一域的 HTTP 和 HTTPS 版本之间的 XSS
【发布时间】:2013-04-11 21:11:33
【问题描述】:

我想要完成的是使用 ajax 的内联登录,它执行以下操作:

  1. 登录链接显示在不安全的 HTTP 页面上,比如“http://www.somedomain.com/somepage/此处未收集登录信息

  2. 单击登录链接时,会创建一个 iframe,其 src 指向“https://www.somedomain.com/rest_api/values/这是登录表单首次显示的位置,通过 HTTPS

  3. 在新的 iframe 弹出窗口中,用户会看到一个登录表单,该表单本身是通过 HTTPS 加载的安全登录表单,用户填写表单并单击继续,然后返回给自己。

  4. 假设用户已成功登录,则会对可通过 window.parent.document 访问的脚本进行 jquery 调用,该脚本会使用当前用户小部件更新原始页面,然后调用要销毁的 iframe。

当我强制 iframe 使用相同的域和协议时,这很有效,但是当我进入 HTTP 并强制 IFRAME 使用 HTTPS 加载登录脚本时,我得到可怕的“权限被拒绝访问属性成功登录后,Firebug 中的“文档”错误。

我知道需要设置 Access-Control-Allow-Origin 标头,因此它被动态设置为使用请求页面的任何域的 HTTPS 版本,我已经在 Firebug 的标头响应中验证了这一点原始页面请求。

那么为什么我仍然收到错误,响应头显示:

Access-Control-Allow-Origin: https://www.somedomain.com

所以我还需要设置什么,或者问题可能在其他地方吗?

感谢您的帮助!


编辑:上面更新指出我并不愚蠢,登录表单确实是安全加载的;)

【问题讨论】:

  • 在第 1 步,您已经失败了。登录页面必须通过 HTTPS 提供,否则您的安全性将非常低
  • @SLaks 也许我不清楚,当您单击登录创建 IFRAME 时,您还没有填写任何内容,您所做的只是启动创建 IFRAME 的脚本,并且将 src 设置为通过 HTTPS 在其中加载登录表单。所以确实是安全的。
  • @SLaks 我误解了吗?我阅读它的方式是登录表单显示在指向 https 域的 iFrame 中。因此,登录表单本身位于 https 上,它无法与父页面对话,因为它的来源不同(不是 https)
  • @SLaks 我描述的方式可能有点令人困惑,iframe 确实通过 HTTPS 加载了登录表单,尽管父窗口是通过 HTTP 加载的。通过 HTTPS 加载的登录表单和最终的表单提交都在 IFRAME 中通过 HTTPS 完成,所以除非我遗漏了一些东西,否则所有通信都是安全的。成功登录时会出现问题,成功页面只是加载一个页面,该页面执行立即 jquery 调用以使用新的用户小部件填充父页面,然后销毁 iframe。有意义吗?
  • @oucil:这根本没有帮助。攻击者修改原始页面以在 iframe 中加载https://evil.com/login-stealer,用户一点也不聪明。用户应该(但可能没有)接受培训,只有在地址栏中看到 https 时才输入密码。

标签: jquery iframe https xss


【解决方案1】:

除了@SLaks 上面提出的“我应该/不应该”问题之外,这是有效的,但任何网站都需要自行权衡的问题......我面临的技术问题是, Access-Control-Allow-Origin 单独还不够,需要和以下一起设置:

Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: X-Requested-With

如果第一个对于我所描述的确切场景是必要的,我不肯定,因为 jquery 只是在成功的 POST 之后运行 而不是 POST 或 GET 调用本身,但它就在那里供您参考,因为我需要它用于我们网站的其他用例。

第二个...Allow-Headers 是最重要的,因为标头包含X-Requested-With: XMLHttpRequest,因为它最初是使用 jquery 中的 XMLHttpRequest 调用的,特别是 .ajax() em>。

三个都到位后,我就再也没有遇到过任何问题。希望这对处于相同情况的其他人有所帮助!


编辑:自欺欺人,HTTPS 到 HTTP 仍然不起作用,从剩下的一天我仍然试图弄清楚这一点,很明显它不会,尽管它应该这样做。

所以最终的解决方案是,通过 HTTPS 加载登录页面,通过 HTTPS 提交,并在成功登录后重定向到 HTTP 以向父级发送调用以删除登录 iframe。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多