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

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

CSRF: JSON API без кастомного заголовка (Flask)

JSON API endpoint /api/profile не требует кастомного заголовка X-Requested-With. Смени пароль admin через CSRF-атаку на API.

Автор: Hack & Fix
Освоишь: double-submit tokenSameSite=StrictOrigin/Referer check
Средне+60 XP ~30 мин python
CWE-352 · A01:2021 Pro
Обложка: CSRF: JSON API без кастомного заголовка (Flask) Обложка: CSRF: JSON API без кастомного заголовка (Flask)
Задача
# CSRF: атака на JSON API ## Сценарий Вы проводите аудит **GridMall** — интернет-магазина на Flask. Тимлид Вера недавно перевела настройки профиля с классических HTML-форм на современный JSON API: фронтенд отправляет POST-запросы с JSON-телом, бэкенд отвечает JSON-ом. Вера уверена, что новый API защищён от подделки запросов «сам по себе»: HTML-форма не может отправить JSON, а для межсайтовых запросов браузер выполняет предварительную проверку. Руководство засомневалось и заказало внешний аудит. В магазине есть механизм «Report to Admin»: ссылка уходит администратору, и его браузер (бот) страницу открывает. Если вера в «самозащиту» JSON ошибочна, это готовый канал атаки **Cross-Site Request Forgery** на учётную запись с наибольшими привилегиями. ## Цель 1. Авторизуйтесь как обычный пользователь и изучите в инструментах разработчика, как фронтенд общается с API настроек профиля: метод, заголовки, тело запроса. 2. Определите, какие из этих атрибутов сервер действительно требует, а какие — лишь привычка клиента, и найдите способ выполнить тот же запрос со сторонней страницы. 3. Доставьте подготовленную страницу администратору через механизм отчётов, чтобы его браузер сменил пароль администратора на известное вам значение. 4. Войдите под администраторской учётной записью с новым паролем и заберите флаг из админ-панели. ## Теория Браузер делит межсайтовые запросы на «простые» и требующие предварительной проверки: нестандартные заголовки и экзотический тип содержимого заставляют браузер сначала спросить разрешения у сервера. Однако парсинг тела на сервере нередко терпим к заявленному типу: если API соглашается разобрать «простой» запрос, чьё тело написано в нотации JSON, предварительная проверка не выполняется вовсе, а сессионная cookie прикрепляется как к обычной отправке формы. Сервер, не требующий ни токена, ни нестандартного заголовка, принимает такой запрос как авторизованный. **Уязвимый паттерн:** ```python @app.route('/api/profile', methods=['POST']) def api_update_profile(): user = get_user() if not user: return jsonify({"error": "unauthorized"}), 401 data = request.get_json(force=True, silent=True) ``` Проверяется только сессия. Легитимный клиент шлёт нестандартный заголовок, но сервер его не сверяет — поэтому «простой» межсайтовый запрос проходит наравне со штатным. ## Точка входа атаки `POST /api/profile` — тело в нотации JSON с полями `fullname`, `email`, `password` (достаточно одного). Доставка — `POST /report` с полем `url`: ссылка на страницу, размещённую на сервере эксплойтов. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** управляется ботом отчётов; его исходный пароль вам не нужен

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

другие лабы по этой уязвимости
Обложка лабы: CSRF: Обход проверки Referer (Flask) Обложка лабы: CSRF: Обход проверки Referer (Flask)
CSRF

CSRF: Обход проверки Referer (Flask)

Приложение проверяет Referer как защиту от CSRF, но проверка некорректна — атакующий может обойти её, указав домен жертвы как часть пути.

+60 XP
Python Pro
Exploit Fix
Обложка лабы: CSRF: SameSite=Lax Bypass через GET-запрос (Flask) Обложка лабы: CSRF: SameSite=Lax Bypass через GET-запрос (Flask)
CSRF

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

Endpoint смены email доступен через GET. SameSite=Lax не защищает от top-level GET navigation — измени email admin одной ссылкой.

+60 XP
Python Pro
Exploit Fix
Обложка лабы: CSRF: Атака через JSON API без кастомных заголовков Обложка лабы: CSRF: Атака через JSON API без кастомных заголовков
CSRF

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

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

+60 XP
Go Pro
Exploit Fix