Блог LearnQA

Что такое XSS-инъекция на пальцах

Привет, коллеги.

В предыдущих постах мы уже осветили два довольно важных типа уязвимостей - SQL-инъекции и подделку запросов (CSRF). В этой решили добавить тему самых популярных уязвимостей, рассказав про XSS.

XSS (англ. Cross-Site Scripting — «межсайтовый скриптинг») — довольно популярная уязвимость, которую до сих пор можно найти на большом количестве веб-приложений. Суть уязвимости заключается в следующем - злоумышленнику удается внедрить на страницу веб-приложения JavaScript-код, который не был предусмотрен разработчиками этого приложения. Этот код будет выполняться каждый раз, когда жертвы (обычные пользователи) будут заходить на страницу приложения, куда этот код был внедрен. Использовать внедренный код злоумышленники могут по-разному.

Один из способов - злоумышленнику удастся заполучить авторизационные данные пользователя и войти в его аккаунт. Или злоумышленник может незаметно для жертвы перенаправить его на другую страницу-клон. Эта страница может выглядеть так же, как так, на которой пользователь рассчитывал оказаться. Но находиться они будет на другом домене, принадлежащем злоумышленнику. Если пользователь не заметит подмены и на этой странице введет какие-то свои личные данные, они окажутся у злоумышленника. Так как же устроена эта уязвимость? Давайте разбираться.

Прежде всего не ясно, как же именно можно внедрить JavaScript-код на сайт? Все просто, например, можно добавить JavaScript-код в поле ввода, текст из которого сохраняется и в дальнейшем отображается на странице для всех пользователей. Это может быть поле для ввода информации о себе на странице профиля социальной сети или комментарии на форуме.

Злоумышленник вводит текст (и за одно вредоносный код), который сохраняется на странице. Когда другие пользователи зайдут на эту же страницу, вместе с текстом они загрузят и JavaScript-код злоумышленника. Именно в момент загрузки этот код выполнится браузером.

Суть в том, что браузер не может самостоятельно отличить обычный текст от текста, который является CSS, HTML или JavaScript-кодом. Он будет пытаться обрабатывать все, что находится между тегами <script>, как JavaScript-код. Все, что находится между тегами <style>, считать CSS. И все, что похоже на тег, считать HTML-кодом.

Если разработчик хочет, чтобы какой-то текст только выглядел как код, но таковым не являлся (то есть не обрабатывался браузером, а выводился как есть), этот текст надо специально обработать прежде, чем отдать его браузеру. Такая обработка называется “экранированием”.

Увы, иногда разработчики забывают об экранировании в тех или иных местах веб-приложения, и текст выводится без всякой обработки. В этом случае вся надежда на тестировщиков. Так что если вам интересно научиться находить XSS-инъекции и другие типы уязвимостей на вашем проекте, приходите на наш курс по тестированию безопасности - https://www.learnqa.ru/security

Кстати, это уже вторая статья об XSS на нашем сайте. Ссылка на первую.

Спасибо за внимание!