Пишу, по большей части, про историю, свою жизнь и немного про программирование.

XSS

С досады придумал способ использования XSS-уязвимости в случае, если на сайте кавычки и апострофы экранируются слешами. Рассмотрим, например, сайт Tatcenter.

Запрос вида: httр://info.tatcenter.ru/search/?search="><script>location.href="httр://sample.com"</script>
Поможет нам закрыть теги INPUT и A, в которых выводится запрос, потому что строка приводится к виду: …search=\"><script>….

но не выполнить JavaScript не удасться, так как из-за экранирования кавычек нарушается JavaScript-код. Выход нашёлся очень быстро — я вспомнил, что в JavaScript уже давным-давно введён новый тип данные — регулярное выражение. Его ограничители — обычные слеши. Более того, регулярное выражение отлично приводится к строке самим JavaScript, единственное неудобство — слеши-ограничители остаются в строке.

Но! Никто нам не мешает, преобразовав это выражение к строке просто отрезать слеши методом substr или slice. Например , выражение

String(/string/).slice(1,-1)

даст нам строку "string". Прекрасно, но тут перед нами встаёт новая трудность. Обычно XSS-уязвимость используется для того, чтобы передать какую-либо информацию на другой сайт. Для того, чтобы её передать, нам надо получить строку вида "httр://sample.com", но мы не можем её заключить между слешами — она сама содержит слеши.

Тут нам на выручку приходит JavaScript-метод unescape. Слеш в escaped-представлении выглядит как "%2F", таким образом

unescape(String (/httр:%2F%2F/).slice(1,-1))

даст нам строку "httр://". Осталось только скомпоновать всё в одну строку и не забыть, что "%" — значимый символ в URL и его надо преобразовать в комбинацию "%25":

httр://info.tatcenter.ru/search/?search="><script>alert(unescape(String(/a%252Faa/).slice(1,-1)))</script>
4 комментария
Александр 2003

А что бывают сайты, на которых кавычки и апострофы экранируются, а угловые скобки нет?

Строку также можно получить используя

String.fromCharCode(104,116,116,112,58,47,47,115,97,109,112,108,101,46,99,111,109)

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Александр:

Точно! Можно и так.

Сайт разные бывают. Я вот привёл конкретный пример.

Александр 2003

Т. е. info.tatcenter.ru существует?
Я думал это отвлеченный пример, ибо этот домен у меня не открывается.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Александр:

Существует.