1

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

IE:

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

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

- - - 更新 - - -

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

我同意, alert(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 转义函数的质量)。

4

2 回答 2

6

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

代替:

var foo = 1 - 2 - 1;

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

var foo = NaN - NaN - NaN;

foo这就是为什么NaN

于 2011-05-03T21:51:20.370 回答
0

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

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

实际上,我看不出它是如何导致 XSS 攻击的。传递给您的代码的任何字符串实际上都是与上面类似的字符串。

于 2011-05-03T21:48:50.357 回答