В статье на примерах разберем, как устроена межсайтовая подделка запросов и покажем, как настроить защиту в двух популярных фреймворках Django и Laravel.
Представьте, что пользователь вашего сайта переводит деньги или меняет пароль в личном кабинете, но даже не подозревает об этом. Именно так работает CSRF-атака.

CSRF-атака: что такое межсайтовая подделка запросов и как защитить от нее пользователей

20 декабря 2024
15 минут
эксперт информационной безопасности в Start X
Андрей Жаркевич
автор, дипломированный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
автор, дипломиро­ванный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
эксперт информационной безопасности в Start X
Андрей Жаркевич
Обучение навыкам безопасного поведения

Что такое CSRF-атака

CSRF или XSRF (Cross-Site Request Forgery) — атака на авторизованного пользователя сайта или веб-приложения, при которой злоумышленник обманом заставляет его выполнить опасное или некорректное действие.

Например, перевести деньги с банковского счета пользователя, изменить его пароль или личные данные на сайте, сделать покупку в интернет-магазине и оплатить ее картой жертвы.
Атака происходит в четыре этапа:

  1. Пользователь авторизуется на сайте. После успешного входа в систему сервер генерирует сессионный идентификатор, который обычно хранится в виде cookie в браузере пользователя. Эти cookie позволяют ему оставаться авторизованным без повторного ввода учетных данных.
  2. Злоумышленник создает ссылку, которая «обращается» к сайту от имени пользователя. Мошенник отправляет ссылку через электронную почту, социальные сети или размещает ее на других веб-сайтах.
  3. Пользователь кликает на ссылку. Когда пользователь переходит по мошеннической ссылке, браузер автоматически «обращается» к серверу доверенного сайта и включает в него сессионные cookie, так как они связаны с доменом доверенного сайта. С точки зрения сервера все в порядке, потому что «обращение» невозможно отличить от намеренного действия пользователя.
  4. Система выполняет запрос злоумышленника. Поскольку система считает, что все корректно, сервер выполняет содержащееся в запросе действие от имени авторизованного пользователя, которому выдана сессионная cookie. Так злоумышленник может достичь своей цели без прямого доступа к учетным данным пользователя.
В отличие от XSS-атаки, CSRF (она же — XSRF) не требует внедрения вредоносного кода на сайт. Злоумышленник эксплуатирует то, что механизм проверки подлинности запроса отсутствует, чтобы заставить браузер пользователя выполнить нежелательные действия. Поэтому полное доверие к любым действиям пользователя в системе недопустимо.
Скачайте карту знаний и навыков по безопасной разработке
В ней — 13 уязвимостей и технологий, которые нужно знать разработчику, чтобы писать безопасный код

Как работает CSRF-атака

Чтобы атака сработала, одновременно должны быть выполнены три условия:

  • Есть целевое действие. В приложении или на сайте должно быть какое-то действие, которое злоумышленник может выполнить без ведома пользователя. Например, добавить нового администратора, изменить пароль пользователя или отправить денежный перевод.
  • Сессии обрабатываются на основе cookie. Чтобы выполнить действие, сайт или приложение отправляет один или несколько HTTP-запросов, при этом оно полагается только на cookie-сессии для идентификации пользователя, который отправил запросы.
  • Нет неизвестных параметров. В запросах на выполнение действий нет значений, которые сложно узнать. Например, если для смены пароля нужно обязательно указать старый пароль, провести атаку не получится, поскольку злоумышленник не знает это значение.
Предположим, что у нас есть веб-приложение, в котором сессии хранятся в cookie небезопасно, в открытом виде. Пользователи могут изменить адрес электронной почты с помощью такой HTML-формы:
<html>
  <body>
    <form action="/user/email" method="POST">
      <input type="email" name="email" value="" />
        <input type="submit" value="Сохранить">
    </form>
  </body>
</html>
Если пользователь введет новый адрес в форму и нажмет «Сохранить», браузер отправит POST-запрос с этими значениями из формы:
POST **/user/email** HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
**Cookie: PHPSESSID=JKcciBhFZ0tTp1xh7QW2DigRqdUZknbC**

**email=user@example.com**
Когда злоумышленник проанализирует такой запрос, то обнаружит, что атака через него будет успешной по трем причинам:

  1. Возможность изменить адрес электронной почты в учетной записи пользователя дает возможность сбросить пароль и перехватить контроль над аккаунтом.
  2. Приложение использует cookie для передачи идентификатора сессии, чтобы определить, какой пользователь отправил запрос. CSRF-токены или другие механизмы для предотвращения некорректных действий не используются.
  3. Все параметры для выполнения действия известны.
После этого злоумышленник подготовит вредоносную HTML-страницу, которая поможет выполнить нужное ему действие:
<html>
    <body>
        <form action="<https://example.com/user/email>" method="POST">
            <input type="hidden" name="email" value="evil@hacker.com" />
        </form>
        <script>
            document.forms[0].submit();
        </script>
    </body>
</html>
Ему останется только разместить страницу в интернете и заманить на нее жертву, например, с помощью фишингового письма, смс, сообщения в мессенджере или рекламного баннера.

Когда жертва зайдет на эту страницу, выполнится скрытая форма с автоматической отправкой. Браузер жертвы подставит в запрос cookie-сессии пользователя со страницы злоумышленника. Серверная часть веб-приложения получит cookie и изменит email пользователя на значение, который указал хакер на вредоносном сайте.

В итоге злоумышленник получит контроль над учетной записью, сможет установить новый пароль и выполнять любые действия от имени жертвы.

Телеграм-канал Start X

Подписаться
Наши разборы мошеннических схем поймет даже бабушка

Как защитить пользователей сайта от CSRF-атаки

Чтобы противодействовать атаке, нужно внедрить специальный секретный токен (CSRF-token), который также называют antiCSRF-токеном.
Вот как выглядит процесс защиты:

  • Генерация. Для каждого пользователя генерируется обновляемый, уникальный и случайный токен, который добавляется к форме и сохраняется на стороне сервера в сессии пользователя.
  • Передача. Токен вставляется в DOM HTML-страницы или передается через API. Каждый запрос, выполняющий изменения в данных, должен содержать этот токен в параметре или в HTTP-заголовке.
  • Проверка. При получении запроса сервер сравнивает полученный токен с тем, который выдали пользователю в момент генерации. Если один из них окажется некорректным — действие не будет выполнено.
На платформе Start EDU с помощью практических заданий учим разработчиков находить уязвимости на сайте и защищать пользователей от CSRF-атак. Запишитесь на бесплатное демо и наш эксперт расскажет, как Start EDU помогает продуктовым командам писать безопасный код и выпускать защищенные продукты.

Во многих фреймворках уже реализован механизм защиты от CSRF-атак на основе секретного токена. Изучите документацию фреймворка, который используете для разработки, и проверьте, есть ли в нем такой механизм.

Например, в популярных Java-фреймворках Spring и GWT есть встроенная защита, которая добавляет токен ко всем «обращениям». Задача разработчика — правильно подготовить встроенные средства защиты от атак перед использованием. После этого будет происходить автоматическая генерация токенов для защиты от уязвимостей.

Теперь покажем, как настроить защиту от атак в двух популярных фреймворках Django и Laravel.

В Django защита от атак с помощью token реализована по умолчанию. Включение модуля django.middleware.csrf.CsrfViewMiddleware выполняется в файле settings. py в разделе MIDDLEWARE:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware'',
]
В Laravel CSRF-token автоматически генерируется для каждой пользовательской сессии. Получить его можно либо с помощью функции csrf_token (), либо через сессию запроса:
use Illuminate\Http\Request;
 
Route::get('/token', function (Request $request) {
    $token = $request->session()->token();
 
    $token = csrf_token();
 
    // ...
});
Если в вашем фреймворке отсутствует встроенная CSRF-защита, рекомендуем пользоваться проверенными модулями от авторитетных вендоров, например, библиотекой OWASP CSRFGuard.

Главное про CSRF-атаки


  • CSRF — это вид атаки, при котором злоумышленник выполняет некорректные действия от имени человека, авторизованного на сайте. Пример такого действия — перевод денег злоумышленнику.
  • Атака происходит, когда злоумышленник отправляет поддельные «обращения» от имени пользователя. Это возможно, если сайт не проверяет, что запрос действительно исходит от авторизованного пользователя. В отличие от XSS-атак, CSRF не требует внедрения кода на сайт.
  • Главный способ противодействия таким атакам — внедрение специального секретного токена, который также иногда называют antiCSRF-token.
  • Во многих фреймворках уже реализован механизм защиты на основе секретного token. Изучите документацию фреймворка, который используете для разработки, и проверьте, есть ли в нем такой механизм.
Мужчина в кресле с ноутбуком

Подпишитесь на дайджест Start X

Еженедельная подборка материалов и аналитики про цифровые атаки на людей, технологии защиты, безопасность инфраструктуры и приложений
Нажимая кнопку «Отправить заявку» вы соглашаетесь с политикой обработки персональных данных.