4

由于以下问题,我在本季度难以满足 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。

我现在要检查谷歌的回复以寻找线索。是否有一些 HTTP 指令指示浏览器不要干预 URL 响应。

非常感谢任何帮助!

亲切的问候,

詹姆士

4

3 回答 3

1

google URL 栏结果不会更改,因为 URL 编码序列无效(“%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

于 2011-06-18T12:16:43.920 回答
1

Before I found out that the characters were only displayed decoded but not really changed, in the address bar by Firefox, I set up a test to find out what happened.

This lead to this demo: 'The magic Firefox address bar decoder' that demonstrates (and lists) which characters are displayed decoded in the address bar and what is read from the address bar by script. Running the page in different browsers shows the differences.

Firefox changes the most, Chrome changes only a few characters, IE and Safari don't change anything. The choice of characters that are decoded by Firefox seems unrelated to the selection of characters that are encoded by encodeUriComponent. Hope this might help anyone.

于 2013-03-26T23:39:22.430 回答
0

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

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-06-20T09:48:41.357 回答