Представим, что мы сидим в чате и во время разговора сайт просит нас еще раз авторизоваться — ввести логин и пароль. Возможно, случился сбой, поэтому мы вводим свои данные. Но в итоге сообщение пропадает, и через пару минут нас выкидывает из чата, а пароль больше не подходит.
Любые проекты, чаты и сайты пишут люди. Чем крупнее проект, тем больше шансов, что у сайта или приложения найдутся так называемые «дыры» — незащищенные участки, которыми могут воспользоваться злоумышленники.
В этом уроке мы познакомимся с понятием уязвимости и разберем одну из самых простых в исполнении атак — XSS
Уязвимости и атаки
Цели злоумышленников при атаках на сайты или приложения обычно следующие:
-
Кража персональных данных пользователей
-
Кража аккаунтов
-
Кража банковских данных
-
Передача вирусов на компьютеры пользователей
Чтобы преступники не достигли их, на помощь приходят специалисты, которые занимаются «этичным хакингом». Их называют пентестерами — от английского PenTester, или специалистами по проникновению. Их задача — проанализировать сайт или приложения, найти незащищенные места и определить, как этим может воспользоваться злоумышленник.
Также предотвратить атаки могут тестировщики, хоть они и не являются специалистами по информационной безопасности. Но они могут проверить сайт на самые базовые и распространенные виды атак. Это не закроет все проблемы с безопасностью, но простые способы взлома можно исправить без привлечения специалистов.
Существует два самых распространенных типа атак:
-
Cross-site Script (XSS)
-
SQL Injection
В дополнительных материалах к этому уроку будет приложена ссылка на список ТОП-10 атак в интернете по версии OWASP — некоммерческой организации, которая исследует информационную безопасность и виды атак на ресурсы.
В примере про чат злоумышленник смог отправить под видом сообщения HTML-разметку с формой для авторизации. В этой ситуации слабым звеном оказалось окно с выводом сообщения. Разработчики не предусмотрели, что можно отправить любую HTML-разметку вместо сообщения, и она будет выведена на экране.
В этом случае говорят, что злоумышленник нашел уязвимость и использовал ее. Уязвимость — это недостаток в системе, с помощью которого можно нарушить работу всей системы или отдельной ее части. Одна из таких уязвимостей связана с возможностью отправки кода через формы на сайте или в приложении. Атака, которая использует эту уязвимость, называется XSS. Разберем ее подробнее.
XSS
Когда злоумышленник отправил вместо обычного сообщения разметку на HTML, он использовал атаку Cross-Site Scripting или XSS. Сокращение начинается с буквы «X», чтобы не было путаницы с языком стилей CSS. При XSS должен выполниться любой сторонний код, который был передан на сайт. Это может быть:
-
HTML-разметка
-
JavaScript код
То есть код, который может выполниться в браузере любого пользователя. Такому типу атак подвержены все элементы на странице, в которые можно ввести текст, например, поля форм.
Для примера создадим такой сайт и отправим код в незащищенное поле. Код — обычный JavaScript код, в котором выводится сообщение для пользователя в отдельном окне:
<script>alert('Я отправил вам скрипт! Пришлите денег, пожалуйста :(')</script>
Так выглядит страница до ввода сообщения со скриптом:
При вводе сообщения со скриптом браузеры всех пользователей автоматически выполнят скрипт, так как в чате нет защиты от XSS:
Это происходит, потому что браузер обрабатывает все символы в сообщении, в том числе и служебные, такие как <
, >
. Чтобы безопасно вывести сообщение и не выполнить код, используется замена символов на мнемоники.
Мнемоники — специальные символы, которые браузер не обрабатывает как код. Такой процесс называется экранированием символов и повсеместно используется в программировании.
В примере выше, чтобы защититься от выполнения кода, стоит заменить все символы <
на мнемонику <
, а символы >
на >
. Браузеры не умеют обрабатывать такой текст как код, но для пользователя все символы вернутся в исходное состояние.
<script>alert('Я отправил вам скрипт! Пришлите денег, пожалуйста :(')</script>
Для тестирования XSS используются два способа:
-
Если переданная строка в форме где-то отображается после отправки, то возможно отправить любой HTML-тег с текстом. Например,
<h1>Hello</h1>
-
Вместо HTML воспользуйтесь кодом на JavaScript, как в примере выше. Действие функции
alert()
будет заметно сразу
Необходимо взять примеры из этого урока и вставить их в поля формы тестируемого сайта. Будет нагляднее, если результат выводится сразу, например, как у формы комментариев. Также нужно представить себя злоумышленником, который ищет уязвимость в проекте.
Если ни один из способов не сработал, значит, простыми способами атаку не использовать. Это не означает, что уязвимостей нет, но так отсекаются самые распространенные способы, которыми любят пользоваться начинающие хакеры.
Чтобы проверить сайт на XSS, необходимо проанализировать все поля, в которых пользователь может оставлять текст. В большинстве случаев это происходит в формах, поэтому проверка на XSS происходит во время тестирования форм.
При использовании XSS атака происходит на пользователей, а не на сам сайт и его внутреннюю структуру. В противовес такому подходу используют атаку под названием SQL Injection. Она направлена на базу данных сайта.
Выводы
В этом уроке мы базово рассмотрели тему информационной безопасности и простых атак на веб-приложения. Так как тема безопасности большая для одного урока, то мы остановились на одной из простых в исполнении атаки — Cross-site Script.
XSS простая, но ее последствия не настолько безобидны. С помощью XSS можно получить данные о пользователе или подсунуть ему поддельную форму регистрации.
Суть уязвимости состоит в том, что не обрабатываются поля формы, поиска, комментариев. Если разработчики не экранируют символы в таких полях, то появится возможность отправить и выполнить вредоносный код на сайте или в приложении
С опытом вы сможете тестировать большое количество разных атак и дополнительно защищать приложение от злоумышленников.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты