由于以下问题,本季度我难以达到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
......看看当我的本地服务器响应时它会被重写:
我通过Fiddler运行这个并且看不到任何不好的事情,我已经关闭了重写引擎。我正在运行Apache。
为了增加混淆,不同的浏览器会有不同的反应。打字...
http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22
...进入Chrome产量:
进入IE,URL保持完全相同。在Opera中,除非您单击地址栏,否则将删除查询字符串,从而使我相信浏览器会自动更改响应中的地址栏中的URL以使其更具可读性。与IE一样,Safari只保留URL。
我现在要查看Google的回复以获取线索。是否有一些HTTP指令指示浏览器在响应时不要插入URL。
非常感谢任何帮助!
亲切的问候,
詹姆斯
答案 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的问题。
亲切的问候,
詹姆斯