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

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

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

JSON-endpoint /api/profile принимает state-changing запрос без проверки CSRF-токена и кастомного заголовка X-Requested-With. Простой fetch с Content-Type:text/plain даёт CSRF.

Автор: Hack & Fix
Освоишь: double-submit tokenSameSite=StrictOrigin/Referer check
Средне+60 XP ~30 мин php
CWE-352 · A01:2021 Pro
Обложка: CSRF: JSON API без кастомного заголовка (PHP) Обложка: CSRF: JSON API без кастомного заголовка (PHP)
Задача
# CSRF (Подделка межсайтового запроса к JSON API) ## Сценарий Вы проводите аудит **ДевайсДом** — магазина умных устройств, построенного на нативном PHP. Страница настроек профиля недавно переехала с классических HTML-форм на JSON API: фронтенд отправляет изменения отдельным запросом с JSON-телом. Разработчик отказался добавлять защиту от подделки запросов — по его словам, «форма не может отправить такой формат, а для него браузер обязан выполнить предварительную CORS-проверку». Перед релизом вас, внешнего аудитора, попросили проверить, выдержит ли это утверждение контакт с реальностью: в системе есть административная учётная запись, и смена её пароля через API означала бы полный доступ к магазину. Бот-администратор по заявке из раздела «Report to Admin» открывает присланные ссылки в собственном браузере, уже авторизованным. ## Цель 1. Авторизуйтесь и изучите в DevTools, какой запрос отправляет страница настроек профиля при сохранении изменений. 2. Найдите способ выполнить такой же запрос со сторонней страницы — в обход предположения, на которое полагается разработчик. 3. Через «Report to Admin» доставьте боту страницу, которая сменит пароль администратора на известное вам значение. 4. Войдите под администратора и заберите флаг из админ-панели. ## Теория CSRF (Cross-Site Request Forgery) заставляет браузер жертвы отправить запрос на целевой сайт от её имени: сессионная cookie прикрепляется автоматически, в том числе к запросу, инициированному чужой страницей. От CSRF не спасает и JSON-формат сам по себе. Предварительную CORS-проверку браузер требует только для «непростых» запросов; в категорию «простых» попадают, в частности, запросы с текстовым типом содержимого — их HTML-форма отправлять умеет. Если сервер разбирает тело как JSON независимо от заявленного типа содержимого и не проверяет источник запроса, сторонняя страница доставит валидный JSON без всякой предварительной проверки, и кросс-доменные ограничения ей не помеха. **Уязвимый паттерн:** ```php // Тело разбирается как JSON без проверки источника и подтверждения намерения: $data = json_decode($rawBody, true); if (!empty($data['password'])) { /* пароль текущего пользователя обновляется */ } ``` Обработчик меняет данные той учётной записи, чья cookie пришла с запросом, — значит, заставив браузер администратора отправить JSON с полем смены пароля, атакующий получает контроль над его аккаунтом. ## Точка входа атаки `POST /api/profile` — JSON-эндпоинт настроек профиля; интересующее поле — `password`. * **Обычный пользователь:** `demo` / `demo` * **Доставка эксплойта:** Exploit Server (хостинг вашей страницы) и `POST /report` — отправка ссылки боту * **После смены пароля:** вход администратора через `POST /login`, флаг — в админ-панели (`GET /admin`)

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

другие лабы по этой уязвимости
Обложка лабы: CSRF: SameSite=Lax Bypass через GET-запрос Обложка лабы: CSRF: SameSite=Lax Bypass через GET-запрос
CSRF

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

Критичное действие смены пароля выполняется через GET-запрос. SameSite=Lax не защищает от top-level навигации. Сменив пароль администратора через CSRF, залогинься под admin и забери флаг.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: CSRF: Активация распродажи без токена Обложка лабы: CSRF: Активация распродажи без токена
CSRF

CSRF: Активация распродажи без токена

Админ-эндпоинт активации распродажи не проверяет CSRF-токен. Заставь бота выполнить действие от имени admin.

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: 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