为什么FireFox和某些其他浏览器会在服务器响应时更改地址栏中的URL

时间:2011-06-18 12:01:06

标签: http firefox pci-dss pci-compliance

由于以下问题,本季度我难以达到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>"

您可以看到原始网址中的某些转义字符已被未转义的字符替换。

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

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

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

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以使其更具可读性。与IE一样,Safari只保留URL。

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

非常感谢任何帮助!

亲切的问候,

詹姆斯

3 个答案:

答案 0 :(得分:1)

Google网址栏结果不会更改,因为网址编码顺序无效(“%3”不是有效的编码顺序 - 应该有两个十六进制数字)。如果您将第一个链接中的相同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

答案 1 :(得分:1)

在我发现字符只显示已解码但未真正更改之前,在Firefox的地址栏中,我设置了一个测试以查明发生了什么。

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

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

答案 2 :(得分:0)

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

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

在这种情况下浏览器保持URL不变的原因是服务器返回HTTP 404响应,表示无法找到资源。在这些情况下,Firefox不会对URL进行任何更改。如果您改为尝试提示Google提供200 OK回复的网址,例如以下内容......

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的问题。

亲切的问候,

詹姆斯