Что такое атаки CSRF и как их предотвратить?
Подделка межсайтовых запросов (CSRF) – один из старейших способов использования уязвимостей веб-сайта. Он нацелен на серверные веб-коммутаторы, которые обычно требуют аутентификации, такой как вход в систему. Во время атаки CSRF злоумышленник стремится заставить свою жертву сделать неавторизованный вредоносный веб-запрос от своего имени.
Слабые или некачественные методы защиты веб-сайтов и невнимательность на пути пользователя – некоторые из распространенных причин успешной CSRF-атаки.
Давайте посмотрим, что такое CSRF-атака и какие способы вы можете предотвратить от нее как разработчик или пользователь.
Как CSRF-атаки влияют на вас?
CSRF – это атака, используемая для реализации неавторизованных запросов во время веб-действий, требующих входа в систему или аутентификации пользователя. Атаки CSRF могут использовать идентификаторы сеанса, файлы cookie, а также другие серверные уязвимости для кражи учетных данных пользователя.
Например, включение процедур защиты от CSRF предотвращает междоменные вредоносные взаимодействия.
Как только этот барьер сломается, злоумышленник может быстро воспользоваться идентификатором сеанса пользователя с помощью файлов cookie, созданных браузером пользователя, и встроить тег скрипта в уязвимый веб-сайт.
Манипулируя идентификатором, злоумышленник также может перенаправлять посетителей на другую веб-страницу или использовать методы социальной инженерии, такие как электронная почта, для отправки ссылок, побуждая жертву загрузить вредоносное программное обеспечение.
Как только жертва выполняет такие действия, она отправляет HTTP-запрос на служебную страницу пользователя и санкционирует действие запроса в пользу злоумышленника. Это может иметь разрушительные последствия для ничего не подозревающего пользователя.
Успешная CSRF-атака может привести к тому, что авторизованные пользователи потеряют свои учетные данные для доступа злоумышленнику, особенно во время серверных действий, таких как запросы на изменение пароля или имени пользователя. В худшем случае злоумышленник берет на себя весь сеанс и действует от имени пользователей.
CSRF использовался для перехвата транзакций через Интернет, а также для изменения имен пользователей и паролей, что приводит к потере пользователями доступа к затронутой службе.
Как злоумышленники захватывают ваши сеансы с помощью CSRF: примеры
Основными целями CSRF-атак являются веб-действия с аутентификацией пользователя. Для успеха необходимы непреднамеренные действия жертвы.
Во время атаки CSRF действия GET, DELETE и PUT, а также уязвимые запросы POST являются основными целями злоумышленника.
Давайте посмотрим на значение этих терминов:
- GET: запрос на сбор результата из базы данных; например поиск Google.
- POST: Обычно для отправки запросов через веб-формы. Запрос POST является обычным явлением во время регистрации или входа пользователя в систему, также известный как аутентификация.
- УДАЛИТЬ: удалить ресурс из базы данных. Вы делаете это всякий раз, когда удаляете свою учетную запись в определенной веб-службе.
- PUT: запрос PUT изменяет или обновляет существующий ресурс. Пример – изменение вашего имени в Facebook .
На практике злоумышленники используют захват сеанса для поддержки атаки CSRF. При использовании этой комбинации злоумышленник может использовать взлом, чтобы изменить IP-адрес жертвы.
Изменение IP-адреса затем регистрирует жертву на новом веб-сайте, где злоумышленник вставил ложную ссылку, которая отправляет реплицированную форму или измененный запрос сервера, который они создали через CSRF.
Тогда ничего не подозревающий пользователь думает, что перенаправление исходит от поставщика услуг, и нажимает ссылку на веб-странице злоумышленника. Как только они это сделают, хакеры отправляют форму при загрузке страницы без их ведома.
Пример CSRF-атаки GET-запроса
Представьте себе попытку совершить онлайн-платеж через незащищенную платформу электронной коммерции. Владельцы платформы используют запрос GET для обработки вашей транзакции. Этот запрос GET может выглядеть так:
https://websiteurl/pay?amount=$10&company=[company ABC's account]
Злоумышленник может легко украсть вашу транзакцию, изменив параметры запроса GET. Для этого им нужно только поменять ваше имя на свое или, что еще хуже, изменить сумму, которую вы собираетесь заплатить. Затем они изменяют исходный запрос примерно так:
https://websiteurl/pay?amount=$20000&company=[attacker's account]
После того, как вы нажмете ссылку на этот измененный запрос GET, вы в конечном итоге сделаете непреднамеренный перевод в учетную запись злоумышленника.
Выполнение транзакций с помощью запросов GET – плохая практика и делает действия уязвимыми для атак.
Пример CSRF-атаки POST-запроса
Однако многие разработчики считают, что использование POST-запроса более безопасно для выполнения веб-транзакций. Хотя это правда, к сожалению, запрос POST также уязвим для атак CSRF.
Для успешного перехвата POST-запроса все, что нужно злоумышленнику, – это ваш текущий идентификатор сеанса, несколько реплицированных невидимых форм, а иногда и небольшая социальная инженерия.
Например, форма запроса POST может выглядеть так:
<form action="Company ABC's account" method="POST">
<input type="text" name="name" placeholder="name"><br>
<input type="number" name="amount"><br>
<input type="submit" name="submit">
</form>
Однако злоумышленник может поменять ваши учетные данные, создав новую страницу и изменив форму выше на это:
<body onload="document.getElementById('payment-form').submit();">
<form action="Attacker's account" id="payment-form" method="POST">
<input type="text" hidden name="name" placeholder="name"><br>
<input type="number" hidden value=30000 name="amount"><br>
<input type="submit" hidden name="submit">
</form>
</body>
В управляемой форме злоумышленник устанавливает значение поля суммы равным «30000», меняет номер счета получателя на его номер, отправляет форму при загрузке страницы, а также скрывает поля формы от пользователя.
Как только они захватят текущий сеанс, ваша страница транзакции инициирует перенаправление на страницу злоумышленника, которая предлагает вам щелкнуть ссылку, которую, как они знают, вы, скорее всего, посетите.
При нажатии на нее загружается отправка реплицированной формы, которая переводит ваши средства на счет злоумышленника. Это означает, что вам не нужно нажимать кнопки, такие как «отправить», чтобы транзакция состоялась, поскольку JavaScript автоматически делает это при загрузке следующей веб-страницы.
Кроме того, злоумышленник может также составить черновик электронного письма со встроенным HTML-кодом, в котором вам будет предложено щелкнуть ссылку, чтобы выполнить ту же отправку формы загрузки страницы.
Еще одно действие, уязвимое для CSRF-атаки, – это смена имени пользователя или пароля, пример запроса PUT. Злоумышленник копирует вашу форму запроса и заменяет ваш адрес электронной почты своим.
Затем они крадут ваш сеанс и либо перенаправляют вас на страницу, либо отправляют вам электронное письмо с предложением щелкнуть привлекательную ссылку.
Затем отправляется измененная форма, которая отправляет ссылку для сброса пароля на адрес электронной почты хакера, а не на ваш. Таким образом, хакер изменит ваш пароль и выйдет из вашей учетной записи.
Как предотвратить атаки CSRF в качестве разработчика
Один из лучших методов предотвращения CSRF – использовать часто меняющиеся токены вместо зависимости от файлов cookie сеанса для запуска изменения состояния на сервере.
Многие современные серверные инфраструктуры предлагают защиту от CSRF. Поэтому, если вы хотите самостоятельно избежать технических проблем, связанных с усилением CSRF, вы можете легко справиться с этим, используя серверные фреймворки, которые поставляются со встроенными токенами против CSRF.
Когда вы используете токен анти-CSRF, серверные запросы генерируют случайные строки вместо более статических уязвимых файлов cookie сеанса. Таким образом, вы защитите свой сеанс от угонщика.
Внедрение системы двухфакторной аутентификации (2FA) для выполнения транзакций в вашем веб-приложении также снижает вероятность CSRF.
Можно инициировать CSRF через межсайтовый скриптинг (XSS), который включает внедрение скрипта в пользовательские поля, такие как формы комментариев. Чтобы предотвратить это, рекомендуется включить автоматический экранирование HTML во всех полях пользовательских форм на вашем веб-сайте. Это действие не позволяет полям формы интерпретировать элементы HTML.
Как предотвратить атаки CSRF как пользователь
Как пользователь веб-службы, которая включает аутентификацию, вы также должны сыграть свою роль в предотвращении кражи ваших учетных данных и сеансов злоумышленниками через CSRF.
Убедитесь, что вы используете надежные веб-службы во время действий, связанных с переводом средств.
В дополнение к этому используйте безопасные веб-браузеры, которые защищают пользователей от воздействия сеанса, а также безопасные поисковые системы, защищающие от утечки данных поиска.
Как пользователь, вы также можете полагаться на сторонние аутентификаторы, такие как Google Authenticator или его альтернативы, для проверки вашей личности через Интернет.
Хотя вы можете чувствовать себя беспомощным, чтобы помешать злоумышленнику захватить ваш сеанс, вы все же можете помочь предотвратить это, убедившись, что ваш браузер не хранит такую информацию, как пароли и другие данные для входа.
Усильте свою безопасность в Интернете
Разработчикам необходимо регулярно тестировать веб-приложения на предмет нарушений безопасности во время разработки и развертывания.
Однако, как правило, вводятся другие уязвимости, пытаясь предотвратить другие. Поэтому будьте осторожны, чтобы не нарушить другие параметры безопасности при попытке заблокировать CSRF.