【问题标题】:Why do FireFox and certain other browsers alter the URL in the address bar when the server responds为什么当服务器响应时,FireFox 和某些其他浏览器会更改地址栏中的 URL
【发布时间】:2011-09-17 18:14:33
【问题描述】:

由于以下问题,我在本季度难以满足 PCI-DSS 合规性要求。

当您在浏览器中键入以下内容时...

http://www.mygarble.com/main/Community/Chat?command=CHAT_MESSAGE&displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

...它响应,因此,由于某种我无法确定的原因,浏览器地址栏中的 URL 更改为以下内容:

http://www.mygarble.com/main/Community/Chat?command=CHAT_MESSAGE&displayname="><script>alert(123)<%2Fscript>"

您可以看到原始 URL 中的一些转义字符已被非转义字符替换。

我给出的原因是当服务器响应时,无论它如何响应,FireFox 都会自动重新格式化地址栏中的 URL,以使其更具可读性。我告诉他们我对此无能为力。但是,公平地说,他们反驳说,如果您尝试以下 URL...

http://www.google.com/%22%%203E%3Cscript%3Ealert%28123%29%3C%2Fscript%3%20E%22

...当 Google 服务器响应时,浏览器不会更改 URL,它保持不变:

http://www.google.com/%22%%203E%3Cscript%3Ealert%28123%29%3C%2Fscript%3%20E%22

他们说得有道理。

那么到底发生了什么?我已经缩小了问题的范围,如果我只是请求一个空文本文件,但在它之后附加一些无意义的查询......

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

...瞧,当我的本地服务器响应时,它会被重写:

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

我已经通过 Fiddler 运行了这个,没有发现任何不妥之处,并且我已经关闭了重写引擎。我正在运行 Apache。

更令人困惑的是,不同的浏览器会做出不同的反应。正在打字...

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

...进入 Chrome 产量:

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

进入 IE,URL 保持不变。在 Opera 中,除非您单击地址栏,否则查询字符串会被删除,这让我相信浏览器会在响应时自动更改地址栏中的 URL,以使它们更具可读性。 Safari 和 IE 一样,只保留 URL。

我现在要查看 Google 的回复以获取线索。是否有一些 HTTP 指令指示浏览器不要干预响应中的 URL。

非常感谢任何帮助!

亲切的问候,

詹姆斯

【问题讨论】:

  • 这与 pci-dss 有什么关系?我不明白。

标签: http firefox pci-dss pci-compliance


【解决方案1】:

由于 URL 编码序列无效(“%3”不是有效的编码序列 - 应该有两个十六进制数字),因此 google URL 栏结果不会改变。如果您将第一个链接中的相同 URI 部分附加到 google 域,则:

http://www.google.com/%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

地址栏中的它也会被非转义字符替换(在 Firefox 4.0.1 上,Mac OS X Snow Leopard,荷兰)

关于什么是逃避和什么不逃避的一些有趣的讨论,参见例如。 https://bugzilla.mozilla.org/show_bug.cgi?id=425480.

【讨论】:

  • 感谢您的反馈。我想我自己已经回答了这个问题。有关我刚刚发送给 Security Metrics 的电子邮件,请参见下文。
  • 哦,看来我得等几个小时了,因为我的信誉不够!
【解决方案2】:

在我发现字符只是解码显示而没有真正改变之前,我在Firefox的地址栏中设置了一个测试以了解发生了什么。

这导致了这个演示:'The magic Firefox address bar decoder' 演示(并列出)哪些字符在地址栏中解码显示,以及通过脚本从地址栏中读取的内容。在不同的浏览器中运行页面会显示差异。

Firefox 变化最大,Chrome 只改变了几个字符,IE 和 Safari 没有任何变化。 Firefox 解码的字符选择似乎与 encodeUriComponent 编码的字符选择无关。希望这可以帮助任何人。

【讨论】:

    【解决方案3】:

    我在这个问题上取得了一些进展。考虑以下几点:

    http://www.google.com/%22%%203E%3Cscript%3Ealert%28123%29%3C%2Fscript%3%20E%22
    

    在这种情况下浏览器保持 URL 不变的原因是服务器返回 HTTP 404 响应,表示找不到资源。在这些情况下,Firefox 不会更改 URL。如果您改为尝试使用提示来自 Google 的 200 OK 响应的 URL,例如以下...

    http://www.google.com/?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22
    

    ...您会发现当服务器响应更改后的 URL 时,FireFox 会更改 URL。

    自己试试吧。事实上,如果您将更改后的 URL 剪切并粘贴到电子邮件中,您会发现字符保持不变。

    这与服务器实际响应的内容无关,除了 HTTP 响应代码。如果服务器以“404 Not found”响应,FireFox 选择保持地址栏中的 URL 不变。如果服务器响应“200 OK”,FireFox 会选择更改 URL,取消转义某些字符可能是为了使 URL 更具可读性。如果找不到资源,逻辑是我想这样做没有意义。

    我假设您使用的是 Firefox。事实上,浏览器对这种情况的处理方式不同。我试过在几个浏览器中输入这个 URL(第二个)。我总结了结果:

    Google Chrome 的功能与 Firefox 相同。引号和尖括号显示为普通字符,未转义。

    Internet Explorer 保持 URL 不变,但显示有关 XSS 的消息警告并且不显示 Google 页面。

    Opera 在地址栏中仅显示“www.google.com”。

    Safari 保持 URL 不变。

    我希望这可以解决问题。要让自己相信这一切,你可以做的一件事是运行像 Fiddler 这样的 HTTP 调试代理。您可以看到,在每种情况下,服务器返回的内容都是相同的,只是每个浏览器在服务器响应时如何选择更改 URL。

    亲切的问候,

    詹姆斯

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2016-10-30
      • 2017-05-31
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多