在javascript中字符串之间使用破折号

using dashes between string literals in javascript

本文关键字:破折号 之间 字符串 javascript      更新时间:2023-09-26

我刚刚注意到,您可以通过在javascript中的字符串字面量之间使用破破号来进行XSS攻击:

ie:

var foo = 'bar'-alert(1)-'baz'; 
//this will display the alert

我的问题是,js解释器在做什么?使用破折号是什么意思?我以为它只是一个算术运算符。

----- UPDATE -----

对不起,我没有解释xss攻击的真正上下文:

我同意,警报(1)看起来不是很有害。这是一个真实的例子,是我用Burp Suite做的安全扫描。主机是困扰我,但我建议把它作为一个假阳性漏洞。

无论如何,我使用querystring参数redirección:

http://mysite.com/foo.php?returnto=bar.php

也是用javascript制作的:

echo '<script>alert("bye!");window.location="'.escapeXSS($_REQUEST['returnto']).'";</script>';

攻击者可能会在那里插入一个匿名函数,在重定向之前执行:

http://mysite.com/foo.php?returnto=bar.php'-function(){/* do something */}()-'

的结果将是:

<script>alert("bye!");windows.location='bar.php'-function(){/* do something */}()-'';</script>

使函数执行(取决于PHP转义函数的质量)。

解释器只是对每个子表达式进行强制转换,试图形成一个数学表达式。

代替:

var foo = 1 - 2 - 1;

你有一个表达式,最终是:

var foo = NaN - NaN - NaN;

这就是为什么fooNaN

执行alert()不是因为它在字符串中有破折号,而是因为您在bar之后关闭了字符串,"减去"了alert()的返回并从中减去了字符串baz。因此,函数alert()将始终被调用。如果您不希望它发生,只需不关闭并重新打开字符串:

var foo = 'bar-alert(1)-baz'; 

实际上,我不知道它如何导致XSS攻击。任何传递给代码的字符串实际上都是像上面那样的字符串。