May 10

CSRF-Уязвимости

Приветствую! На связи админ канала Falcon Bytes!

Сегодня мы разберемся, что такое CSRF и рассмотрим некоторые примеры такой уязвимости.

Теория

CSRF (cross-site request forgery, подделка межсайтовых запросов) — это вид атаки, когда злоумышленник заставляет ваш браузер отправить запрос на сайт, где вы уже авторизованы, но без вашего согласия. Например, вы зашли на сайт и авторизовались, а потом перешли по ссылке на другой сайт, где злоумышленник поместил скрытый код, который автоматически отправляет запрос на первый сайт от вашего имени. Это может быть опасно, если первый сайт доверяет всем запросам без проверки, потому что злоумышленник может выполнить различные действия от вашего имени без вашего ведома.

Пример

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

Наглядная схема CSRF атаки

Саня - ваш преданный пользователь, который написал новый пост с текстом:

"Подписывайтесь на канал falcon-bytes.github.io"

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

www.huitter.com/post?message=Подписывайтесь+на+канал+falcon-bytes.github.io

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

Теперь представим говнюка, которого зовут Коля Говножуев. Коля изменяет URL-Адрес и включает в него нагрузку вроде такой:

Тут кнопка бабло! Жми ссылку cutt.ly/SKjf8dm9

В сокращенной ссылке Коля поставил такую ссылку:

www.huitter.com/post?message=Тут+кнопка+бабло!+Жми+ссылку+cutt.ly/SKjf8dm9

Коля отправляет Сане текст:

Тут кнопка бабло! Жми ссылку cutt.ly/SKjf8dm9

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

Как можете понять, это не очень здорово, когда на вашем ресурсе присутствует такая уязвимость. Особенно это критично, когда это банковский сайт.

Защита

Есть несколько способов защиты от CSRF. Вот что рекомендует OWASP (The Open Web Application Security Project) – организация, специализирующаяся на исследованиях веб-безопасности:

  1. Инициализация CSRF-токенов. Этот метод считается наиболее рекомендуемым. CSRF-токен - это ключ, выдаваемый пользователю для определенных действий.
  2. Ограничение кук. Это означает использование специальных атрибутов кук, чтобы браузер мог отправлять их только на наш домен и поддомены.
  3. Использование нестандартных заголовков. Этот подход предполагает ограничение использования доменов, с которых могут быть отправлены запросы.
  4. Валидация заголовков origin. Здесь проверяется совпадение между источником (source) и целью (target) нашего заголовка origin.

У каждого из перечисленных методов есть свои ограничения.

Поэтому наиболее универсальным и эффективным способом защиты все-таки является первый - инициализация CSRF-токена - то есть подписание пользователя и предоставление прав на действия только подписанному пользователю.

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

Мы подписываем этим токеном действия, которые могут изменить сервер (например, POST, PUT, DELETE), и рассматриваем их как доверенные.

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

Когда сайт защищен от CSRF атак, то в почти все запросы передают параметр CSRF токена, который был выдан пользователю, когда он загрузил страницу. Сервер проверяет соответствие запроса и CSRF токена, который был выдан пользователю, и если они не соответствуют, сервер отклоняет запрос.

Как делается защита на популярных языках программирования:

Django

Чтобы включить защиту CSRF в Django, настройте миддлварь соответствующим образом. Затем добавьте токены защиты от подделки в свои HTML-формы в разделе следующим образом:

<form action="." method="post">
  {% csrf_token %}
</form>  

Токены можно проверить с помощью pre-processor, или вручную.

Flask

The flask-wtfготово добавить защиту от подделки токены в ваши HTML-формы. Просто оберните приложение Flask в CSRFProtectобъект:

from flask import Flask
from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect()

def create_app():
    app = Flask(__name__)
    csrf.init_app(app)

Затем вы можете добавить токены защиты от подделки в HTML-формы:

<form method="post">
    {{ form.csrf_token }}
</form>

C#

Эта статья подробно описывает защиту от CSRF атак

https://learn.microsoft.com/en-us/aspnet/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages

Для более глубокого понимания темы советую почитать эту статью:

https://www.invicti.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/ в ней описывается, как работает защита от CSRF атак при помощи кук.

На связи был админ канала Falcon Bytes, успехов!