window.location = window.location 是否易受 XSS 攻击

Is window.location = window.location susceptible to XSS

此问题与代码 window.location = window.location 有关,作为一种刷新页面的方法,与重定向/其他变量无关。

我的理解如下:

window.location = window.location 导致页面刷新,因为浏览器将导航到用户已经所在的相同位置。

通过 DOM 操作对该变量的任何更改都会导致页面 reload/load 攻击者页面,因此这些行将无法使用更改后的值执行,因此不是候选者用于跨站点脚本攻击。

这是正确的吗?

编辑: 我真正想问的是,是否有一种方法可以在不导致页面重新加载的情况下更改 window.location,这样当 window.location = window.location 调用后,浏览器将被发送到另一个位置。

该问题与 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 将在该页面上 运行。相反,如果我正确转义数据,那么它可以在页面中使用,因为它将被解释为文本。

因此,如果我正确理解您的问题,那么 none 这些答案是正确的。可以利用 window.location 来执行 xss。您遇到的障碍似乎 运行 是因为在 window.location 行执行后页面将刷新并跳过 yourpayload 的执行。我假设您能够以某种方式将内容引入 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 中。