2. Взлом почты с помощью XSS-уязвимостей
В этом разделе я расскажу, как взломать почту с помощью XSS уязвимостей. Что такое XSS уязвимость?
Аббревиатура XSS расшифровывается как Сross Site Sсriрting (“межсайтовый скриптинг”). Принято его называть именно XSS, а не СSS, так как СSS введена намного раньше, и означает она Сasсading Style Sheets – «каскадные таблицы стилей» (применяются в оформлении HTML-станиц). Сross – это «крест», поэтому первая буква в «межсайтовом скриптинге» заменена именно на «X». XSS – это уязвимость на сервере, позволяющая внедрить в генерируемую скриптами на сервере HTML-страницу произвольный код путём передачи его в качестве значения нефильтруемой переменной. Под «нефильтруемой» переменной подразумевается переменная, которая перед её использованием в скрипте (например, PHP) не проверяется на наличие запретных символов, таких, как: <,>,’,” и многих других.
РOST-запрос передаёт переменные через массив, неотображаемый в адресной строке браузера; GET-запрос обнаруживает себя в адресной строке следующим образом:
http://www.somesite.com/index.php?fi...cond=2&third=3
Тут
http://www.somesite.com/index.php — некая страница, к которой мы обращаемся, а first=1&second=2&third=3 — это переменные, передаваемые скрипту. В GET-запросе переменные записываются следующим образом:
имя_переменной_1=значение_п ременной_1&имя_переменной_2= значение_переменной_2&…&имя _переменной_n=значение_пере енной_n
То есть для наглядности примера, запишем еще один GET-запрос:
http://www.somesite.com/index.php?им...менной_n
PHP-скрипт может генерировать html-страницу, в которой выводит значение одной из переданных переменных без всякой фильтрации. НО! Если Вы, составляя GET-запрос, вместо обычного значения переменной подставит какие-нибудь ключевые тэги (например, <sсriрt> или <br>), то они выполнятся интерпретатором!
XSS-уязвимости используются в большинстве случаев для кражи кукисов (сookies в большинстве случаев хранят сессию, присвоив себе которую, можно быть на сайте под чужим аккаунтом. Также они хранят зашифрованный пароль, расшифровав который, можно завладеть аккаунтом). Но XSS-баги не ограничиваются кражей сookies.
Что же позволяют осуществить XSS-уязвимости?
1) Кражу конфиденциальной информации посетителя.
2) Всё, что умеют СGI-, РERL-, PHP-, ASР-скрипты.
3) Непредусмотренные стандартом возможности браузера. (Благодаря уязвимостям в самых браузерах)
В следующем примере я буду использовать браузер Internet Explorer 7. (В этой части статьи будет множество всяких ссылок; эти ссылки нужно вводить либо вручную, либо копировать в буфер обмена и вставлять в браузер; никак иначе я не советую, потому что CTRL + клик по ссылке может не правильно отобразить страницу)
Рассмотрим сайт
http://rambler.ru . Воспользуемся поиском сайта. Введем произвольный поисковый запрос, например, “Hollywood” и нажмем кнопку “Найти!”. В результате поисковик выдаст множество сайтов, но внимание мы обратим на адрес страницы в браузере.
(Внимание! На момент написания статьи данная XSS-уязвимость работала. Но на момент модифицирования её закрыли. В цели обучения я привожу новую XSS-сигнатуру: http://ftpsearch.rambler.ru/db/ftpsearch/search.html?words=XSS&ftype=5"><script>alert('XSS' )</script>&form=0&hu=1&what=0)
В меня она выглядит вот так:
http://nova.rambler.ru/search?btnG=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8!&query= Hollywood
Теперь договоримся, что для поиска XSS-уязвимостей будем использовать следующий JavaScript код:
Код:
<script>alert("XSS")</script>
Данный код выводит сообщение с текстом “XSS”. Попробуем ввести в поисковую строку этот JavaScript код. Откроется страница с некоторым адресом и с обычным для поисковика содержимым. Но обратим внимание на заголовок окна. У меня он выглядит так:
Rambler: поиск по Интернету. '<script>alert("XSS")</script>' — Windows Internet Explorer
Давайте посмотрим исходный код страницы, в котором найдем первое совпадение со строчкой “<script>alert("XSS")</script>”, то есть строчкой, которую мы ввели в качестве поискового запроса. Нашли? Она должна находиться между HTML тэгами <title> и </title>, которые и отвечают за текст заголовка окна браузера. У меня все это выглядит вот так:
Код:
<title>Rambler: поиск по Интернету. '<script>alert("XSS")</script>'</title>
А теперь представим, что случиться, если мы тэг </title> разместим
перед нашим скриптом. Получился бы код:
Код:
<title>Rambler: поиск по Интернету. '</title><script>alert("XSS")</script>'
который интерпретатор
выполнит, поскольку не происходит фильтрации символов, о которых я писал раньше. Но как этого достичь? Оказывается, что очень просто! Давайте введем в поисковую строку такой запрос:
Код:
</title><script>alert("XSS")</script>
то есть сами попытаемся закрыть тэг </title>. Как это ни странно, но JavaScript код выполнился, и мы видим результат:
Неплохо, правда? Снова смотрим на адрес страницы. Так он выглядит у меня:
http://nova.rambler.ru/search?btnG=%...3C%2Fscript%3E
Тут переменная query содержит необходимый нам поисковый запрос, то есть строку “</title><script>alert("XSS")</script>” в зашифрованном виде. Помните, как первый раз мы ввели строку “Hollywood” в качестве поискового запроса? Тогда адрес страницы выглядел так:
http://nova.rambler.ru/search?btnG=%...uery=Hollywood
Видим, что query=Hollywood, что и подтверждает мои слова.
Перейдем по ссылке:
http://nova.rambler.ru/search?btnG=%...XSS")</script>
И снова видим окошко с текстом “XSS”. Давайте попробуем “опустить” переменную btnG, то есть просто удалим её из адреса страницы, и посмотрим, будет ли работать скрипт. Откроем ссылку:
http://nova.rambler.ru/search?query=...XSS")</script>
Работает!
Только что мы с Вами вывели XSS-уязвимость в сайте www.rambler.ru. Она присутствует потому, что не происходит фильтрации спецсимволов, и мы можем закрыть тэг <title>, что бы выполнился наш код.