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

时间:2011-05-03 21:43:54

标签: javascript xss hyphen

我刚刚注意到你可以在javascript中使用字符串文字之间的破折号进行XSS攻击:

即:

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

我的问题是,那里的js解释器在做什么? 这是什么意思使用破折号? 我认为它只是一个aritmetic操作员。

-----更新-----

抱歉,我没有解释xss攻击的真实背景:

我同意,警报(1)看起来并不十分有害。但实际上,这是一个真实的例子,我是通过使用Burp Suite进行的安全扫描得到的 。主持人正在烦恼我,但我建议将其视为误报漏洞。

无论如何,我正在为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转义功能的质量)。

2 个答案:

答案 0 :(得分:5)

解释器只是转换每个子表达式以尝试形成数学表达式。

而不是:

var foo = 1 - 2 - 1;

你有一个表达式最终成为:

var foo = NaN - NaN - NaN;

这就是fooNaN

的原因

答案 1 :(得分:0)

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

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

实际上,我看不出它会如何导致XSS攻击。传递给你代码的任何字符串实际上都是一个像上面那样的字符串。