использование тире между строковыми литералами в javascript

Я только что заметил, что вы можете провести XSS-атаку, используя тире между строковыми литералами в javascript:

ie:

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

у меня вопрос, что там делает интерпретатор js? что означает использование таких дефисов? Я думал, что это просто арифметический оператор.

----- ОБНОВИТЬ -----

Извините, я не объяснил реальный контекст атаки xss:

Согласен, предупреждение(1) выглядит не очень вредным. Но на самом деле это реальный пример, который я получил при сканировании безопасности, сделанном с помощью Burp Suite . Хостер донимает меня этим, но я бы посоветовал воспринимать это как ложное срабатывание уязвимости.

Во всяком случае, я использую параметр querystring для перенаправления:

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).


person dami    schedule 03.05.2011    source источник
comment
Можете ли вы продемонстрировать, как это может привести к XSS-атаке? Я еще не убежден.   -  person Lightness Races in Orbit    schedule 04.05.2011
comment
да, я обновил свой вопрос   -  person dami    schedule 04.05.2011


Ответы (2)


Интерпретатор просто преобразует каждое подвыражение, пытаясь сформировать математическое выражение.

Вместо:

var foo = 1 - 2 - 1;

у вас есть выражение, которое заканчивается:

var foo = NaN - NaN - NaN;

вот почему foo это NaN

person z5h    schedule 03.05.2011
comment
Ох, похоже на XSS-атаку! Остерегайтесь NaN, я всегда говорю. - person Rudie; 04.05.2011
comment
@dami: нет проблем. Если вы найдете мой ответ приемлемым, можете ли вы отметить его как принятый. Спасибо. - person z5h; 04.05.2011

alert() выполняется не потому, что в строке есть тире, а потому, что вы закрыли строку после bar, "вычли" из нее возврат alert() и вычли из нее строку baz. Таким образом, функция alert() будет вызываться всегда. Если вы не хотите, чтобы это произошло, просто не закрывайте и не открывайте строку заново:

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

На самом деле, я не понимаю, как это может привести к XSS-атаке. Любая строка, переданная вашему коду, на самом деле будет строкой, подобной приведенной выше.

person brandizzi    schedule 03.05.2011