Содержание
Что такое XSS-уязвимость и как тестировщику не пропустить ее / Хабр
По моему наблюдению довольно много тестировщиков когда-либо слышали такое понятие, как XSS-уязвимость. Но мало кто может просто и на пальцах рассказать на собеседовании про нее. Или эффективно проверить веб-сайт на наличие этой уязвимости. Давайте вместе разберемся со всем этим подробнее и попробуем сами найти несложную XSS-уязвимость на демо-странице, которую я специально подготовил к этой статье.
Если вы гуру тестирования безопасности и на раз-два участвуете в баунти-программах крупных IT-компаний, а количество найденных вами XSS исчисляется десятками или даже сотнями — можно смело проходить мимо этой статьи. Если же вы новичок в теме и только начинаете интересоваться поиском уязвимостей — добро пожаловать под кат.
Определение
XSS (англ. Cross-Site Scripting — «межсайтовый скриптинг») — довольно распространенная уязвимость, которую можно обнаружить на множестве веб-приложений. Ее суть довольно проста, злоумышленнику удается внедрить на страницу JavaScript-код, который не был предусмотрен разработчиками. Этот код будет выполняться каждый раз, когда жертвы (обычные пользователи) будут заходить на страницу приложения, куда этот код был добавлен. А дальше существует несколько сценариев развития.
Первый: злоумышленнику удастся заполучить авторизационные данные пользователя и войти в его аккаунт.
Второй: злоумышленник может незаметно для жертвы перенаправить его на другую страницу-клон. Эта страница может выглядеть совершенно идентично той, на которой пользователь рассчитывал оказаться. Но вот принадлежать она будет злоумышленнику. Если пользователь не заметит подмены и на этой странице введет какие-то sensitive data, то есть личные данные, они окажутся у злоумышленника.
Третий… да в общем-то много чего еще можно придумать. Почти все, что может JavaScript, становится доступным для злоумышленника. Чуть ниже мы рассмотрим подробнее один из таких примеров. А пока давайте попробуем чуть подробнее обсудить, как именно устроена уязвимость. И почему злоумышленнику удается внедрить свой код в чужое приложение без доступа к его исходникам.
Небольшое предупреждение. Вся информация далее представлена исключительно в информационных целях. Тестировщик должен уметь проверять свое веб-приложение на уязвимости. Однако, использование XSS-уязвимостей на чужих ресурсах является незаконным.
Если говорить про действующее российское законодательство, когда исследователь тестирует чужой продукт на предмет уязвимостей или проникает в чужую сеть без ведома и согласия владельца, его действия могут быть расценены как неправомерные.
Но вернемся к XSS.
Как устроена уязвимость?
Прежде всего, как именно удается внедрить на страницу JavaScript-код, которого там раньше не было? И как получается распространить этот код среди других пользователей?
Например, можно добавить JavaScript-код в поле ввода, текст из которого сохраняется и в дальнейшем отображается на странице для всех пользователей. Это может быть поле для ввода информации о себе на странице профиля социальной сети или комментарии на форуме.
Злоумышленник вводит текст (и за одно вредоносный код), который сохраняется на странице. Когда другие пользователи зайдут на эту же страницу, вместе с текстом они загрузят и JavaScript-код злоумышленника. Именно в момент загрузки этот код отработает. Конечно, уязвимость сработает, только если текст при сохранении не будет обезопасен. О том, как это сделать, и почему разработчики иногда забывают об этом, поговорим чуть позже.
Это лишь самый простой и очевидный пример того, где может быть спрятана уязвимость. Более интересный пример мы с вами чуть ниже рассмотрим на специально подготовленной демо-страничке.
А пока давайте двигаться дальше.
Почему такие ошибки часто встречаются на веб-проектах?
Суть в том, что браузер не может самостоятельно отличить обычный текст от текста, который является CSS, HTML или JavaScript-кодом. Он будет пытаться обрабатывать все, что находится между тегами <script>, как JavaScript-код. Все, что находится между тегами <style>, считать CSS. И все, что похоже на тег, считать HTML-кодом.
Если разработчик хочет, чтобы какой-то текст только выглядел как код, но таковым не являлся (то есть не обрабатывался браузером, а выводился как есть), этот текст надо специально обработать прежде, чем отдать его браузеру. Такая обработка называется “экранированием”.
В процессе экранирования текста в этом тексте все спец. символы заменяются их “аналогами”, и браузер уже знает наверняка, что это просто текст. Важнее всего обрабатывать тот текст, который приходит от пользователя, так как любой пользователь может оказаться злоумышленником и вместе с текстом прислать какой-нибудь код. Увы, иногда разработчики забывают об экранировании в тех или иных местах веб-приложения, и текст выводится без всякой обработки. Причин для этого может быть несколько.
Например, не всегда программист держит в уме все места, где текст, заданный пользователем, попадает на страницу. Более того, иногда разные части сайта могут создаваться в разное время и/или разными людьми. В этом случае вероятность ошибки возрастает.
Еще причина может быть в том, что уязвимость находится не в коде самого разработчика, а в коде библиотеки, которую он использует. Обычно это какие-то готовые фреймворки для создания веб-сервисов. В таком случае разработчик, конечно, может даже не подозревать то, что подключая к проекту этот фреймворк, он автоматически подключает к нему же уже готовую уязвимость.
Такой риск есть всегда. Все же писать приложение полностью с нуля, не используя вообще никаких библиотек, в наше время долго и дорого. Далеко не каждая компания может позволить себе разработку такого уровня.
В этом случае вся надежда на тестировщиков.
Чем опасна XSS-уязвимость?
Давайте еще раз, более детально, поговорим об опасности XSS-уязвимости. Сама по себе уязвимость не является опасной. Опасной она становится тогда, когда ее находит злоумышленник и начинает ее использовать в своих целях. Использование уязвимости называется “вектором атаки”. В случае XSS векторов атаки довольно много.
Самый простой пример — кража авторизационных cookie пользователей веб-приложения. Чаще всего сайт, на котором присутствует авторизация, отличает авторизованного пользователя по так называемой сессионной cookie. Если ее нет, то пользователь не авторизован. А если она есть, то по значению этой cookie сервер может отличить одного пользователя от другого.
Все cookie хранятся на компьютере пользователей. Если я авторизуюсь своим пользователем, я буду видеть свое значение cookie. А значение чужой просто так узнать не смогу.
То же касается JavaScript-кода, который выполняется в браузере пользователя. Этот JavaScript-код будет видеть значение cookie того пользователя, в браузере которого он исполняется и только его.
Теперь допустим, что злоумышленнику удастся внедрить JavaScript-код на страницу веб-приложения. У любого пользователя, который теперь зайдет на эту страницу, будет исполняться в браузере JavaScript-код. Он будет читать значение cookie этого пользователя (теперь уже жертвы). Осталось только передать это значение злоумышленнику — и дело сделано. Но как передать значение, ведь вредоносный код исполняется в браузере жертвы?
Все довольно просто. Этот же JavaScript-код может создать AJAX-запрос на удаленный сервер. Например, на вот такой URL: www.zloy-site.ru/stolen={значение_cookie_жертвы}
Домен zloy-site принадлежит злоумышленнику из нашего примера. Все запросы, которые приходят на этот домен, записываются в базу данных. Посмотрев на параметры URL, злоумышленник узнает значения cookie жертв и сможет их использовать, чтобы попасть в их аккаунты.
Как мы обсудили выше — это не единственное, чем опасна XSS-уязвимость. Так что ради безопасности и для защиты своих пользователей необходимо уметь искать и закрывать подобные уязвимости на ваших проектах.
Где искать XSS? Как с ней бороться? Демо-страница с примером
В первую очередь стоит проверять на XSS-уязвимости те места на сайте, в которых у обычного пользователя есть возможность повлиять на контент. Если он может добавить в какое-то место определенный текст, он сможет попытаться добавить и JavaScript-код.
Давайте это рассмотрим на конкретном примере. Я подготовил очень простую песочницу, где спряталась XSS-уязвимость. Предлагаю попробовать ее найти вместе.
Открываем песочницу: https://playground.learnqa.ru/demo/xss
Для начала посмотрим, как устроена страница. Это по сути очень простой каталог книг, в котором есть поиск. Если ввести в запросе “Рей Брэдбери” мы увидим все книги, которые есть в этом каталоге этого автора.
Внимательный пользователь уже заметил, что текст, который мы вводили в поле поиска, тут же оказался в URL. Нам этот момент еще пригодится.
А пока давайте попробуем вставить какую-нибудь ерунду в поле поиска: “fwefewf”.
Мы увидим, что в этом случае ничего найти на странице не удалось. А текст запроса повторился в тексте ошибки:
Итак, мы с вами обнаружили место, где появляется текст, вводимый нами. Следовательно, это и есть потенциальное место для XSS-уязвимости. Давайте попробуем вставить самый популярный JavaScript-код для проверки, есть ли там уязвимость.
<script>alert(123)</script>
В случае, если страница является уязвимой, после ввода этого кода на странице появится вот такое окошко:
Оно и будет означать, что наш JavaScript-код исполнился и мы нашли XSS-уязвимость.
Итак, вводим код и видим следующее предупреждение:
Форма не позволяет нам осуществить поиск по такому значению, так как форма валидируется и хочет работать только с буквами и цифрами. На первый взгляд кажется, что разработчик все учел и защитил страницу от XSS, но это не совсем так.
Помните, чуть выше мы с вами заметили, что текст, который мы вводим в поле поиска, отображается в URL в так называемом GET-параметре? Имя этого параметра “q”, а значение — то, что мы вводим в поле поиска. Это сделано для того, чтобы можно было скопировать URL вместе с этой самой строкой поиска и в следующий раз открыть страницу сразу с нужными авторами.
Например, вот такой URL откроет страницу сразу только с книгами Рея Брэдбери: playground.learnqa.ru/demo/xss?q=Рей+Брэдбери
В отличие от формы, валидацию URL разработчик сделать не мог — любой пользователь в своем браузере может ввести любой URL, какой захочет, в том числе и с любым значением GET-параметра. Задача разработчика в этом случае — не забыть учесть все варианты и написать правильный обработчик значения этого GET-параметра.
Проверим, не забыл ли наш разработчик все учесть тут. Попробуем в GET-параметр “q” подставить тот самый JavaScript-код: https://playground.learnqa.ru/demo/xss?q=<script>alert(123)</script>
Перейдя по этому URL мы видим, что на странице появилось окошко со значением 123. Но почему?
Все довольно просто. Помните, когда сайт не может найти нужные книги по заданному поисковому запросу, он текст этого поискового запроса выводит в тексте ошибке? Мол, не нашли ничего по запросу “бла-бла”. Вот вместо этого “бла-бла” у нас теперь JavaScript-код с алертом. Разработчик написал валидацию поля ввода и решил, что так он защитил сайт от того, чтобы JavaScript мог оказаться в поисковом запросе. И не стал экранировать текст ошибки. Нам же удалось обойти валидацию через URL, поменяв там значение поискового запроса.
Ради интереса теперь можем вывести значение нашей сессионной cookie, для этого вместо <script>alert()</script> в URL надо подставить другой код: <script>alert(document.cookie)</script>
С этим я уже предоставлю поиграться вам самостоятельно. 🙂
Найдя ошибку, стоит обратиться к разработчикам — они ее исправят.
Способов закрыть ошибку довольно много. Экранировать текст — не единственный из них. Еще можно запретить самому JavaScript видеть некоторые cookie. Для этого у cookie есть специальный параметр “http only”. Если он выставлен в TRUE, JavaScript никак не сможет узнать, что такая cookie вообще выставлена и не сможет ее прочитать и передать злоумышленнику даже в том случае, если ему удастся найти XSS на вашем проекте.
Все это — лишь малый, далеко не полный список манипуляций, предотвращающий XSS-уязвимости. Как писалось выше — при обнаружении XSS в ходе тестирования лучше всего пообщаться с программистами.
Если Вам интересно знать больше про тестирование безопасности, хочется лучше разобраться в устройстве клиент-серверной архитектуры, понять и отточить самые эффективные способы поиска уязвимостей на настоящем веб-приложении, приходите на мой курс “Тестирование безопасности”. Вся необходима информация есть в моем профиле.
Вас ждет только полезная и нужная теория без воды и большое количество практических примеров и заданий. Вы будете исследовать множество веб-страниц, напичканных самыми разными уязвимостями. Итоговой работой станет большое исследование либо вашего рабочего проекта, либо одного из веб-приложений таких гигантов как Google, Facebook, Twitter и так далее.
Что такое XSS-уязвимость и как тестировщику не пропустить ее
Автор: Виталий Котов
38; margin-top: 0pt; margin-bottom: 0pt;» dir=»ltr»>По моему наблюдению довольно много тестировщиков когда-либо слышали такое понятие, как XSS-уязвимость. Но мало кто может просто и на пальцах рассказать на собеседовании про нее. Или эффективно проверить веб-сайт на наличие этой уязвимости. Давайте вместе разберемся со всем этим подробнее и попробуем сами найти XSS-уязвимость на демо-странице, которую я специально подготовил к этой статье. 🙂
Определение
XSS (англ. Cross-Site Scripting — «межсайтовый скриптинг») — довольно распространенная уязвимость, которую можно обнаружить на множестве веб-приложений. Ее суть довольно проста, злоумышленнику удается внедрить на страницу JavaScript-код, который не был предусмотрен разработчиками. Этот код будет выполняться каждый раз, когда жертвы (обычные пользователи) будут заходить на страницу приложения, куда этот код был добавлен. А дальше существует несколько сценариев развития.
Первый: злоумышленнику удастся заполучить авторизационные данные пользователя и войти в его аккаунт.
Второй: злоумышленник может незаметно для жертвы перенаправить его на другую страницу-клон. Эта страница может выглядеть совершенно идентично той, на которой пользователь рассчитывал оказаться. Но вот принадлежать она будет злоумышленнику. Если пользователь не заметит подмены и на этой странице введет какие-то sensitive data, то есть личные данные, они окажутся у злоумышленника.
Третий… да в общем-то много чего еще можно придумать. Почти все, что может JavaScript, становится доступным для злоумышленника. Чуть ниже мы рассмотрим подробнее один из таких примеров. А пока давайте попробуем чуть подробнее обсудить, как именно устроена уязвимость. И почему злоумышленнику удается внедрить свой код в чужое приложение без доступа к его исходникам.
Небольшое предупреждение. Вся информация далее представлена исключительно в информационных целях. Тестировщик должен уметь проверять свое веб-приложение на уязвимости. Однако, использование XSS-уязвимостей на чужих ресурсах является незаконным.
Если говорить про действующее российское законодательство, когда исследователь тестирует чужой продукт на предмет уязвимостей или проникает в чужую сеть без ведома и согласия владельца, его действия могут быть расценены как неправомерные.
Но вернемся к XSS.
Как устроена уязвимость?
Прежде всего, как именно удается внедрить на страницу JavaScript-код, которого там раньше не было? И как получается распространить этот код среди других пользователей?
Например, можно добавить JavaScript-код в поле ввода, текст из которого сохраняется и в дальнейшем отображается на странице для всех пользователей. Это может быть поле для ввода информации о себе на странице профиля социальной сети или комментарии на форуме.
Злоумышленник вводит текст (и за одно вредоносный код), который сохраняется на странице. Когда другие пользователи зайдут на эту же страницу, вместе с текстом они загрузят и JavaScript-код злоумышленника. Именно в момент загрузки этот код отработает. Конечно, уязвимость сработает, только если текст при сохранении не будет обезопасен. О том, как это сделать, и почему разработчики иногда забывают об этом, поговорим чуть позже.
Это лишь самый простой и очевидный пример того, где может быть спрятана уязвимость. Более интересный пример мы с вами чуть ниже рассмотрим на специально подготовленной демо-страничке.
А пока давайте двигаться дальше.
Почему такие ошибки часто встречаются на веб-проектах?
Суть в том, что браузер не может самостоятельно отличить обычный текст от текста, который является CSS, HTML или JavaScript-кодом. Он будет пытаться обрабатывать все, что находится между тегами <script>, как JavaScript-код. Все, что находится между тегами <style>, считать CSS. И все, что похоже на тег, считать HTML-кодом.
Если разработчик хочет, чтобы какой-то текст только выглядел как код, но таковым не являлся (то есть не обрабатывался браузером, а выводился как есть), этот текст надо специально обработать прежде, чем отдать его браузеру. Такая обработка называется “экранированием”.
В процессе экранирования текста в этом тексте все спец. символы заменяются их “аналогами”, и браузер уже знает наверняка, что это просто текст. Важнее всего обрабатывать тот текст, который приходит от пользователя, так как любой пользователь может оказаться злоумышленником и вместе с текстом прислать какой-нибудь код. Увы, иногда разработчики забывают об экранировании в тех или иных местах веб-приложения, и текст выводится без всякой обработки. Причин для этого может быть несколько.
Например, не всегда программист держит в уме все места, где текст, заданный пользователем, попадает на страницу. Более того, иногда разные части сайта могут создаваться в разное время и/или разными людьми. В этом случае вероятность ошибки возрастает.
Еще причина может быть в том, что уязвимость находится не в коде самого разработчика, а в коде библиотеки, которую он использует. Обычно это какие-то готовые фреймворки для создания веб-сервисов. В таком случае разработчик, конечно, может даже не подозревать то, что подключая к проекту этот фреймворк, он автоматически подключает к нему же уже готовую уязвимость.
Такой риск есть всегда. Все же писать приложение полностью с нуля, не используя вообще никаких библиотек, в наше время долго и дорого. Далеко не каждая компания может позволить себе разработку такого уровня.
В этом случае вся надежда на тестировщиков. 🙂
Чем опасна XSS-уязвимость?
Давайте еще раз, более детально, поговорим об опасности XSS-уязвимости. Сама по себе уязвимость не является опасной. Опасной она становится тогда, когда ее находит злоумышленник и начинает ее использовать в своих целях. Использование уязвимости называется “вектором атаки”. В случае XSS векторов атаки довольно много.
Самый простой пример — кража авторизационных cookie пользователей веб-приложения. Чаще всего сайт, на котором присутствует авторизация, отличает авторизованного пользователя по так называемой сессионной cookie. Если ее нет, то пользователь не авторизован. А если она есть, то по значению этой cookie сервер может отличить одного пользователя от другого.
Все cookie хранятся на компьютере пользователей. Если я авторизуюсь своим пользователем, я буду видеть свое значение cookie. А значение чужой просто так узнать не смогу.
То же касается JavaScript-кода, который выполняется в браузере пользователя. Этот JavaScript-код будет видеть значение cookie того пользователя, в браузере которого он исполняется и только его.
Теперь допустим, что злоумышленнику удастся внедрить JavaScript-код на страницу веб-приложения. У любого пользователя, который теперь зайдет на эту страницу, будет исполняться в браузере JavaScript-код. Он будет читать значение cookie этого пользователя (теперь уже жертвы). Осталось только передать это значение злоумышленнику — и дело сделано. Но как передать значение, ведь вредоносный код исполняется в браузере жертвы?
Все довольно просто. Этот же JavaScript-код может создать AJAX-запрос на удаленный сервер. Например, на вот такой URL: www.zloy-site.ru/stolen={значение_cookie_жертвы}
Домен zloy-site принадлежит злоумышленнику из нашего примера. Все запросы, которые приходят на этот домен, записываются в базу данных. Посмотрев на параметры URL, злоумышленник узнает значения cookie жертв и сможет их использовать, чтобы попасть в их аккаунты.
Как мы обсудили выше — это не единственное, чем опасна XSS-уязвимость. Так что ради безопасности и для защиты своих пользователей необходимо уметь искать и закрывать подобные уязвимости на ваших проектах.
Где искать XSS? Как с ней бороться? Демо-страница с примером.
В первую очередь стоит проверять на XSS-уязвимости те места на сайте, в которых у обычного пользователя есть возможность повлиять на контент. Если он может добавить в какое-то место определенный текст, он сможет попытаться добавить и JavaScript-код.
Давайте это рассмотрим на конкретном примере. Мы подготовили для вас очень простую песочницу, где спряталась XSS-уязвимость и сейчас вместе с вами будем ее искать.
Открываем песочницу: https://playground.learnqa.ru/demo/xss
Для начала посмотрим, как устроена страница. Это по сути очень простой каталог книг, в котором есть поиск. Если ввести в запросе “Рэй Брэдбери” мы увидим все книги, которые есть в этом каталоге этого автора.
Внимательный пользователь уже заметил, что текст, который мы вводили в поле поиска, тут же оказался в URL. Нам этот момент еще пригодится. 🙂
А пока давайте попробуем вставить какую-нибудь ерунду в поле поиска: “fwefewf”.
Мы увидим, что в этом случае ничего найти на странице не удалось. А текст запроса повторился в тексте ошибки:
Итак, мы с вами обнаружили место, где появляется текст, вводимый нами. Следовательно, это и есть потенциальное место для XSS-уязвимости. Давайте попробуем вставить самый популярный JavaScript-код для проверки, есть ли там уязвимость.
<script>alert(123)</script>
В случае, если страница является уязвимой, после ввода этого кода на странице появится вот такое окошко:
Оно и будет означать, что наш JavaScript-код исполнился и мы нашли XSS-уязвимость.
Итак, вводим код и видим следующее предупреждение:
Форма не позволяет нам осуществить поиск по такому значению, так как форма валидируется и хочет работать только с буквами и цифрами. На первый взгляд кажется, что разработчик все учел и защитил страницу от XSS, но это не совсем так.
Помните, чуть выше мы с вами заметили, что текст, который мы вводим в поле поиска, отображается в URL в так называемом GET-параметре? Имя этого параметра “q”, а значение — то, что мы вводим в поле поиска. Это сделано для того, чтобы можно было скопировать URL вместе с этой самой строкой поиска и в следующий раз открыть страницу сразу с нужными авторами.
Например, вот такой URL откроет страницу сразу только с книгами Рея Брэдбери: https://playground.learnqa.ru/demo/xss?q=Рэй+Брэдбери
В отличие от формы, валидацию URL разработчик сделать не мог — любой пользователь в своем браузере может ввести любой URL, какой захочет, в том числе и с любым значением GET-параметра. Задача разработчика в этом случае — не забыть учесть все варианты и написать правильный обработчик значения этого GET-параметров.
Проверим, не забыл ли наш разработчик все учесть тут. Попробуем в GET-параметр “q” подставить тот самый JavaScript-код: https://playground.learnqa.ru/demo/xss?q=<script>alert(123)</script>
Перейдя по этому URL мы видим, что на странице появилось окошко со значением 123. Но почему?
Все довольно просто. Помните, когда сайт не может найти нужные книги по заданному поисковому запросу, он текст этого поискового запроса выводит в тексте ошибке? Мол, не нашли ничего по запросу “бла-бла”. Вот вместо этого “бла-бла” у нас теперь JavaScript-код с алертом. Разработчик написал валидацию поля ввода и решил, что так он защитил сайт от того, чтобы JavaScript мог оказаться в поисковом запросе. И не стал экранировать текст ошибки. Нам же удалось обойти валидацию через URL, поменяв там значение поискового запроса.
Ради интереса теперь можем вывести значение нашей сессионной cookie, для этого вместо <script>alert()</script> в URL надо подставить другой код: <script>alert(document.cookie)</script>
С этим я уже предоставлю поиграться вам самостоятельно. 🙂
Найдя ошибку, стоит обратиться к разработчикам — они ее исправят.
Способов закрыть ошибку довольно много. Экранировать текст — не единственный из них. Еще можно запретить самому JavaScript видеть некоторые cookie. Для этого у cookie есть специальный параметр “http only”. Если он выставлен в TRUE, JavaScript никак не сможет узнать, что такая cookie вообще выставлена и не сможет ее прочитать и передать злоумышленнику даже в том случае, если ему удастся найти XSS на вашем проекте.
Все это — лишь малый, далеко не полный список манипуляций, предотвращающий XSS-уязвимости. Как писалось выше — при обнаружении XSS в ходе тестирования лучше всего пообщаться с программистами.
Если Вам интересно знать больше про тестирование безопасности, хочется лучше разобраться в устройстве клиент-серверной архитектуры, понять и отточить самые эффективные способы поиска уязвимостей на настоящем веб-приложении, приходите на мой курс “Тестирование безопасности”.
Вас ждет только полезная и нужная теория без воды и большое количество практических примеров и заданий. Вы будете исследовать множество веб-страниц, напичканных самыми разными уязвимостями. Итоговой работой станет большое исследование либо вашего рабочего проекта, либо одного из веб-приложений таких гигантов как Google, Facebook, Twitter и так далее. 🙂
Обсудить в форуме
Что такое межсайтовый скриптинг? Типы XSS, примеры и защита
< Вернуться к руководствам
- Главная страница
- Направляющие
- Что такое межсайтовый скриптинг?
В наши дни гораздо правильнее думать о веб-сайтах как о онлайн-приложениях, выполняющих ряд функций, а не как о старых статических страницах. Большая часть этой надежной функциональности связана с широким использованием языка программирования JavaScript. Хотя JavaScript позволяет веб-сайтам делать довольно интересные вещи, он также представляет новые и уникальные уязвимости — межсайтовый скриптинг (XSS) является одной из самых серьезных угроз.
Защитите свой сайт
Что такое межсайтовый скриптинг (XSS)?
Межсайтовый скриптинг, обычно называемый XSS, происходит, когда хакеры запускают вредоносный код JavaScript в браузере жертвы.
В отличие от атак удаленного выполнения кода (RCE), код запускается в браузере пользователя. После первоначальной инъекции сайт обычно не полностью контролируется злоумышленником. Вместо этого злоумышленник прикрепляет свой вредоносный код к законному веб-сайту, фактически обманывая браузеры, заставляя их запускать свое вредоносное ПО всякий раз, когда сайт загружается.
Использование JavaScript в межсайтовых сценариях
JavaScript — это язык программирования, который запускается на веб-страницах в вашем браузере. Этот клиентский код добавляет веб-странице функциональность и интерактивность и широко используется во всех основных приложениях и платформах CMS.
В отличие от серверных языков, таких как PHP, код JavaScript внутри вашего браузера не может повлиять на веб-сайт для других посетителей. Он привязан к вашему собственному навигатору и может выполнять действия только в окне вашего браузера.
Хотя JavaScript является клиентской стороной и не запускается на сервере, его можно использовать для взаимодействия с сервером путем выполнения фоновых запросов. Злоумышленники могут использовать эти фоновые запросы для добавления нежелательного спам-контента на веб-страницу без ее обновления, сбора аналитики о браузере клиента или выполнения действий асинхронно.
Как работают атаки с использованием межсайтовых сценариев?
Когда злоумышленники внедряют свой собственный код на веб-страницу, что обычно достигается путем использования уязвимости в программном обеспечении веб-сайта, они затем могут внедрить свой собственный скрипт, который выполняется браузером жертвы.
Поскольку JavaScript запускается на странице браузера жертвы, конфиденциальные данные о аутентифицированном пользователе могут быть украдены из сеанса, что, по сути, позволяет злоумышленнику атаковать администраторов сайта и полностью скомпрометировать веб-сайт.
Другое популярное использование атак с использованием межсайтовых сценариев — когда уязвимость доступна на большинстве общедоступных страниц веб-сайта. В этом случае злоумышленники могут внедрить свой код для целевых посетителей веб-сайта, добавив собственную рекламу, фишинговые подсказки или другой вредоносный контент.
Какие существуют типы атак с использованием межсайтовых сценариев?
Теперь, когда мы рассмотрели основы, давайте углубимся. В зависимости от своих целей злоумышленники могут использовать межсайтовые сценарии различными способами. Давайте рассмотрим некоторые из наиболее распространенных типов атак.
1 Сохраненный (постоянный) межсайтовый скриптинг
Атаки с хранимым межсайтовым скриптингом происходят, когда злоумышленники сохраняют свою полезную нагрузку на скомпрометированном сервере, в результате чего веб-сайт доставляет вредоносный код другим посетителям.
Поскольку этот метод требует от злоумышленника только начальных действий и впоследствии может скомпрометировать многих посетителей, это наиболее опасный и наиболее часто используемый тип межсайтового скриптинга.
Примеры сохраненных атак с использованием межсайтовых сценариев включают поля профиля, такие как ваше имя пользователя или адрес электронной почты, которые сохраняются на сервере и отображаются на странице вашей учетной записи.
2Отраженный (непостоянный) межсайтовый скриптинг
Атаки с отраженным межсайтовым скриптингом происходят, когда полезная нагрузка сохраняется в данных, отправляемых из браузера на сервер. Эти атаки популярны в попытках фишинга и социальной инженерии, потому что уязвимые веб-сайты предоставляют злоумышленникам бесконечный набор веб-сайтов, выглядящих как законные, которые они могут использовать для атак.
Примеры отраженных атак с использованием межсайтовых сценариев включают в себя случаи, когда злоумышленник сохраняет вредоносный сценарий в данных, отправленных из формы поиска или контакта на веб-сайте.
Типичным примером отраженного межсайтового скриптинга является форма поиска, где посетители отправляют свой поисковый запрос на сервер, и только они видят результат.
Злоумышленники обычно отправляют жертвам настраиваемые ссылки, которые направляют ничего не подозревающих пользователей на уязвимую страницу. На этой странице они часто используют различные методы для подтверждения концепции.
3Самостоятельный межсайтовый скриптинг
Самостоятельный межсайтовый скриптинг возникает, когда злоумышленники используют уязвимость, которая требует очень специфического контекста и ручных изменений. Единственный, кто может быть жертвой, — это вы сами.
Эти конкретные изменения могут включать в себя такие вещи, как значения файлов cookie или установку вашей собственной информации в полезную нагрузку.
Примером самостоятельного межсайтового скриптинга является запуск непроверенного кода на платформах социальных сетей или в онлайн-играх, где за запуск кода предлагается некоторое вознаграждение или информация.
4Слепой межсайтовый скриптинг
Атаки с использованием слепого межсайтового скриптинга происходят, когда злоумышленник не может видеть результат атаки. В этих атаках уязвимость обычно находится на странице, доступ к которой имеют только авторизованные пользователи.
Этот метод требует большей подготовки для успешного запуска атаки; в случае сбоя полезной нагрузки злоумышленник не будет уведомлен.
Чтобы повысить вероятность успеха этих атак, хакеры часто используют полиглоты, которые предназначены для работы во многих различных сценариях, например, в атрибуте, в виде обычного текста или в теге скрипта.
Примером слепой атаки с использованием межсайтовых сценариев может быть случай, когда имя пользователя уязвимо для XSS, но только с административной страницы, ограниченной для пользователей-администраторов.
5Межсайтовые сценарии на основе DOM
Атаки на основе межсайтовых сценариев на основе DOM происходят, когда не сам сервер уязвим для XSS, а JavaScript на странице.
Поскольку JavaScript используется для добавления интерактивности на страницу, аргументы в URL-адресе можно использовать для изменения страницы после ее загрузки. Изменяя DOM, когда он не очищает значения, полученные от пользователя, злоумышленники могут добавить вредоносный код на страницу.
Примером атаки межсайтового скриптинга на основе DOM может быть, когда веб-сайт меняет выбор языка с языка по умолчанию на язык, указанный в URL-адресе.
Как предотвратить атаки с использованием межсайтовых сценариев?
Злоумышленники используют различные методы для использования уязвимостей веб-сайтов. В результате не существует единой стратегии снижения риска атаки с использованием межсайтовых сценариев.
Концепция межсайтового скриптинга основана на небезопасном вводе данных пользователем, который напрямую отображается на веб-странице. Если пользовательский ввод должным образом дезинфицировать, атаки с использованием межсайтовых сценариев будут невозможны. Существует несколько способов гарантировать, что пользовательский ввод не может быть скрыт на ваших веб-сайтах.
Чтобы защитить свой веб-сайт, мы рекомендуем вам усилить безопасность веб-приложений с помощью следующих защитных мер.
1Значения списка разрешений
Ограничить ввод пользователя определенным списком разрешений. Эта практика гарантирует, что на сервер отправляются только известные и безопасные значения. Ограничение пользовательского ввода работает только в том случае, если вы знаете, какие данные вы получите, например содержимое раскрывающегося меню, и непрактично для пользовательского содержимого.
2Избегайте и ограничивайте использование HTML во входных данных
Хотя HTML может потребоваться для расширенного содержимого, его следует ограничить доверенными пользователями. Если вы разрешаете стилизацию и форматирование входных данных, вам следует рассмотреть возможность использования альтернативных способов создания контента, таких как Markdown.
Наконец, если вы используете HTML, обязательно очистите его с помощью надежного дезинфицирующего средства, такого как DOMPurify, чтобы удалить весь небезопасный код.
3Sanitize Values
Когда вы используете пользовательский контент на странице, убедитесь, что это не приведет к HTML-контенту, заменив небезопасные символы соответствующими объектами. Сущности выглядят так же, как обычные символы, но их нельзя использовать для создания HTML.
4Использовать флаги HTTPOnly для файлов cookie
Сеансовые файлы cookie — это механизм, который позволяет веб-сайту распознавать пользователя между запросами, и злоумышленники часто крадут сеансы администратора, удаляя их файлы cookie. После кражи файла cookie злоумышленники могут войти в свою учетную запись без учетных данных или авторизованного доступа.
Используйте файлы cookie HttpOnly, чтобы запретить JavaScript считывать содержимое файла cookie, что затрудняет кражу сеанса злоумышленником.
Примечание: Этот метод только предотвращает чтение файла cookie злоумышленниками. Злоумышленники по-прежнему могут использовать активный сеанс браузера для отправки запросов, действуя от имени пользователя-администратора. Этот метод также полезен только при использовании файлов cookie в качестве основного механизма идентификации.
5Используйте WAF для защиты от атак с использованием межсайтовых сценариев
Вы можете использовать брандмауэр для виртуального исправления атак против вашего веб-сайта. Этот метод перехватывает такие атаки, как XSS, RCE или SQLi, еще до того, как вредоносные запросы достигнут вашего веб-сайта. Он также имеет преимущество защиты от крупномасштабных атак, таких как DDOS.
Действия после взлома
В случае межсайтового скриптинга существует ряд шагов, которые вы можете предпринять, чтобы исправить свой веб-сайт.
1Locate Vulnerable Code
Первым шагом в восстановлении после межсайтового сценария является определение места расположения уязвимости. Вы можете обратиться к нашему полезному руководству по взломанному веб-сайту для получения подробных инструкций.
2Удаление вредоносного содержимого и бэкдоров
Получив информацию о местонахождении вредоносного ПО, удалите все вредоносное содержимое или неверные данные из базы данных и восстановите ее до чистого состояния. Вы также захотите проверить остальную часть вашего веб-сайта и файловых систем на наличие бэкдоров.
3Исправьте уязвимость
Хакеры часто используют уязвимости в базах данных, приложениях и сторонних компонентах. Как только вы определили уязвимое программное обеспечение, примените исправления и обновления к уязвимому коду вместе с любыми другими устаревшими компонентами.
4Обновите свои учетные данные
При компрометации важно изменить все ваши пароли и секреты приложений, как только уязвимость будет исправлена. Предотвратите повторное заражение, очистив свои данные, чтобы убедиться, что в базе данных нет мошеннических пользователей-администраторов или бэкдоров.
5Настройка WAF
Рассмотрите возможность настройки брандмауэра веб-приложений для фильтрации вредоносных запросов на ваш веб-сайт. Они могут быть особенно полезны для защиты от новых уязвимостей до того, как будут выпущены исправления.
Если вы считаете, что ваш веб-сайт подвергся атаке с использованием межсайтовых сценариев, и вам нужна помощь, наши услуги по удалению и защите от вредоносных программ могут отремонтировать и восстановить ваш взломанный веб-сайт.
Наша специальная группа реагирования на инциденты и брандмауэр веб-сайта могут безопасно удалить вредоносный код из файловых систем и базы данных вашего веб-сайта, полностью восстановив его до исходного состояния.
Дополнительные ресурсы
Узнайте, как определить проблемы, если вы подозреваете, что ваш сайт WordPress был взломан.
Смотреть сейчас
Присоединяйтесь к нашей серии электронных писем, поскольку мы предлагаем практические шаги и основные методы обеспечения безопасности для владельцев сайтов WordPress.
Зарегистрироваться
По нашим данным, тремя наиболее часто заражаемыми платформами CMS были WordPress, Joomla! и Мадженто.
Прочитать
Изучите передовые методы обеспечения безопасности для веб-сайтов WordPress, чтобы улучшить состояние веб-сайта и снизить риск взлома.
См. сейчас
Что такое XSS | Пример сохраненного межсайтового сценария
Что такое межсайтовый сценарий (XSS)
Межсайтовый сценарий (XSS) — распространенный вектор атаки, при котором вредоносный код внедряется в уязвимое веб-приложение. XSS отличается от других векторов веб-атак (например, SQL-инъекций) тем, что не нацелен непосредственно на само приложение. Вместо этого пользователи веб-приложения подвергаются риску.
Успешная атака с использованием межсайтовых сценариев может иметь разрушительные последствия для репутации онлайн-бизнеса и его отношений с клиентами.
В зависимости от серьезности атаки учетные записи пользователей могут быть скомпрометированы, активированы троянские программы и изменено содержимое страниц, что вводит пользователей в заблуждение, заставляя их добровольно передавать свои личные данные. Наконец, сеансовые файлы cookie могут быть обнаружены, что позволит злоумышленнику выдавать себя за действительных пользователей и злоупотреблять их личными учетными записями.
Атаки с использованием межсайтовых сценариев можно разделить на два типа: хранимые и отраженные.
Сохраненный XSS, также известный как постоянный XSS, является более опасным из двух. Это происходит, когда вредоносный скрипт внедряется непосредственно в уязвимое веб-приложение.
Отраженный XSS подразумевает отражение вредоносного сценария из веб-приложения в браузере пользователя. Скрипт встроен в ссылку и активируется только после нажатия на эту ссылку.
Что хранятся межсайтовые сценарии
Чтобы успешно выполнить сохраненную XSS-атаку, злоумышленник должен найти уязвимость в веб-приложении, а затем внедрить вредоносный сценарий на свой сервер (например, через поле комментария).
Одной из наиболее частых целей являются веб-сайты, которые позволяют пользователям обмениваться контентом, включая блоги, социальные сети, платформы для обмена видео и доски объявлений. При каждом просмотре зараженной страницы вредоносный скрипт передается в браузер жертвы.
Пример атаки с сохраненным XSS
При просмотре веб-сайта электронной коммерции злоумышленник обнаруживает уязвимость, позволяющую встраивать теги HTML в раздел комментариев сайта. Встроенные теги становятся постоянной функцией страницы, заставляя браузер анализировать их вместе с остальным исходным кодом при каждом открытии страницы.
Злоумышленник добавляет следующий комментарий: «Отличная цена за отличный товар! Прочитайте мой обзор здесь .
С этого момента каждый раз при доступе к странице HTML-тег в комментарии будет активировать файл JavaScript, который размещен на другом сайте и имеет возможность красть файлы cookie сеанса посетителей.
Используя сеансовый файл cookie, злоумышленник может скомпрометировать учетную запись посетителя, предоставив ему легкий доступ к его личной информации и данным кредитной карты. Между тем, посетитель, который, возможно, никогда не прокручивал страницу вниз до раздела комментариев, не знает, что атака имела место.
В отличие от отраженной атаки, когда сценарий активируется после нажатия на ссылку, для хранимой атаки требуется только, чтобы жертва посетила скомпрометированную веб-страницу. Это увеличивает охват атаки, подвергая опасности всех посетителей, независимо от уровня их бдительности.
С точки зрения злоумышленника, постоянные XSS-атаки относительно сложнее выполнить из-за трудностей с обнаружением как посещаемого веб-сайта, так и веб-сайта с уязвимостями, позволяющими постоянно внедрять скрипты.
Сохраненное предотвращение/смягчение атак XSS
Брандмауэр веб-приложений (WAF) является наиболее часто используемым решением для защиты от атак XSS и веб-приложений.