此问题与代码window.location = window.location
有关,作为刷新页面的方法,不涉及重定向/其他变量。
我的理解如下:
window.location = window.location
会导致页面刷新,因为浏览器将导航到用户已经在的相同位置。
通过DOM操作对此变量进行的任何更改都会导致页面重新加载/加载攻击者页面,因此这些行无法以更改的值执行,因此不适合跨站点脚本攻击。
这是正确的吗?
修改:我真正想问的是,是否有办法在不导致页面重新加载的情况下更改window.location
,以便在window.location = window.location
调用时制作完成后,浏览器将被发送到另一个位置。
答案 0 :(得分:1)
这个问题与window.location
无关,而且与你如何处理新环境中使用的任意数据有关。
如果您从URL获取输入并使用它来构建要重定向到的新URL,那么您可以自行解决问题。采取经典的重定向页面......
http://example.com/redirect?url=http%3A%2F%2Fsomethingevil
如果页面上有JavaScript,然后将window.location
设置为查询字符串参数url
的值,则该页面将转到http://somethingevil
。
XSS的主要方式是允许查询字符串参数将数据注入页面本身。例如,您可能有一个页面显示" Hello Brad",其中" Brad"来自名为name
的URL参数。现在,假设攻击者将URL设置为name=%3Cscript%20src%3D%22http%3A%2F%2Fexample.com%2Fevil.js%22%3E%3C%2Fscript%3E
。如果我只是将name
的值直接注入页面,那么我的脚本evil.js
将在该页面上运行。相反,如果我正确地转义数据,那么它可以在页面中使用,因为它将被解释为文本。
答案 1 :(得分:1)
因此,如果我理解您的正确要求,那么这些答案都不正确。可以利用window.location
来执行xss。您似乎遇到的障碍是,在执行window.location
行之后,页面将刷新并跳过您的有效负载的执行。我假设您能够以某种方式将内容引入window.location右侧的字符串中,并且输入未正确编码为JavaScript字符串。
例如,如果http://vulnerablewebsite/page?param=derp';alert('xss');var+a+%3d+'
产生如下代码:
<script>
window.location='derp';alert('xss');var a = '';
</script>
您可以只利用字符串串联将分配给window.location的时间推迟到执行有效负载之后。像这样:
http://vulnerablewebsite/page?param=derp'+%2B+alert('xss')+%2b+'
将导致以下代码执行有效负载。
<script>
window.location='derp' + alert('xss') + '';
</script>
这确实应该在安全的StackExchange中。