Перейти к содержимому

Поиск по платформе

CSRF: SameSite=Lax Bypass через GET-запрос

Мутирующий эндпоинт смены email реализован через GET. SameSite=Lax не защищает от top-level навигации. Измени email администратора через CSRF.

Автор: Hack & Fix
Освоишь: double-submit tokenSameSite=StrictOrigin/Referer check
Средне+60 XP ~30 мин golang
CWE-352 · A01:2021 Pro
Обложка: CSRF: SameSite=Lax Bypass через GET-запрос Обложка: CSRF: SameSite=Lax Bypass через GET-запрос
Задача
# CSRF: обход SameSite=Lax через GET-запрос ## Сценарий Магазин походного снаряжения **SnowTrail** дорабатывали в спешке перед сезоном. Разработчица Аня добавила «удобный» эндпоинт смены email, принимающий параметры прямо в URL, — якобы для интеграций и тестов. Команда спокойна: cookie сессии выставляется с атрибутом `SameSite=Lax`, а значит, «межсайтовые запросы кук не получат». Заказчик не стал ждать сезона и нанял вас проверить это утверждение. Администратор магазина читает присланные через форму жалоб ссылки в том же браузере, в котором залогинен. ## Цель 1. Разберитесь, в каких случаях браузер всё-таки отправляет `Lax`-cookie вместе с запросом с чужого сайта. 2. Подготовьте на Exploit Server страницу, которая при открытии выполнит переход верхнего уровня на уязвимый URL с параметром, подменяющим email. 3. Через форму жалоб доставьте ссылку боту-администратору. 4. Убедитесь, что email администратора сменился: после этого флаг появится в каталоге в карточке товара «CTF Flag». ## Теория Атрибут cookie `SameSite` управляет их прикреплением к кросс-доменным запросам. `Strict` — cookies уходят только при действиях внутри сайта. `Lax` — компромисс ради удобства: cookies **отправляются при переходе верхнего уровня** по ссылке (GET-навигация), но не при кросс-доменных POST и фоновых запросах. Пока GET-запросы не имеют побочных эффектов, это безопасно. Ошибка SnowTrail — сочетание двух решений: операция, меняющая состояние (смена email), повешена на GET, а cookie сессии выставлена с `Lax`. Переход по ссылке, авто-обновление страницы или перенаправление из скрипта — всё это GET-навигация верхнего уровня, при которой браузер приложит cookie жертвы к запросу на домен приложения. **Уязвимый паттерн:** ```go // Смена email повешена на GET-маршрут, а cookie сессии — SameSite=Lax: mux.HandleFunc("GET /api/email/change", changeEmail) http.SetCookie(w, &http.Cookie{Name: "session_token", SameSite: http.SameSiteLaxMode, ...}) ``` Общее правило: GET должен оставаться безопасным и идемпотентным методом. Любое изменение состояния — через методы, которые `Lax` не пропускает кросс-доменно, и с отдельной защитой вроде CSRF-токена. ## Точка входа атаки | Параметр | Значение | |----------|----------| | Ваш аккаунт | `demo` / `demo` | | Уязвимый эндпоинт | `GET /api/email/change`, параметр `email` | | Доставка боту | `POST /report`, поле `url` | | Хостинг payload | Exploit Server (панель лабы) | | Где появится флаг | `GET /catalog`, карточка «CTF Flag» |

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: CSRF: Атака через JSON API без кастомных заголовков Обложка лабы: CSRF: Атака через JSON API без кастомных заголовков
CSRF

CSRF: Атака через JSON API без кастомных заголовков

JSON API эндпоинт не требует кастомных заголовков. Используй CSRF для смены пароля admin через API.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: CSRF: Обход проверки Referer-заголовка Обложка лабы: CSRF: Обход проверки Referer-заголовка
CSRF

CSRF: Обход проверки Referer-заголовка

Приложение использует проверку заголовка Referer вместо CSRF-токена. Обойди проверку и смени email администратора.

+60 XP
Go Pro
Exploit Fix