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

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

Race Condition: Гонка при активации промокода в Express

Эндпоинт активации промокода в Express + better-sqlite3 содержит TOCTOU между проверкой счётчика и обновлением баланса. Получи бонус несколько раз параллельными запросами, накопи баланс и открой VIP-функцию с флагом.

Автор: Hack & Fix
Освоишь: SELECT FOR UPDATEadvisory-lockidempotency key
Сложно+90 XP ~75 мин nodejs
CWE-362 · A04:2021 Pro
Обложка: Race Condition: Гонка при активации промокода в Express Обложка: Race Condition: Гонка при активации промокода в Express
Задача
# Race Condition (Состояние гонки) ## Сценарий Вы проводите аудит безопасности **ByteWear** — интернет-магазина одежды для разработчиков, построенного на Node.js и Express. Бухгалтерия третий месяц фиксирует странность: бонусные начисления по промокодам в разы превышают количество выданных кодов. По регламенту каждый промокод гасится одним использованием на клиента, и вам поручают проверить, выдерживает ли это правило реальная реализация. ## Цель 1. Изучите механизм активации промокодов на странице корзины. 2. Обойдите ограничение «один промокод — один раз на пользователя» с помощью конкурентных запросов. 3. Многократно зачислив бонусы, доведите баланс до стоимости товара **CTF Flag** ($9999). 4. Оформите заказ — флаг появится на странице профиля. ## Теория Состояние гонки возникает, когда корректность операции зависит от порядка выполнения конкурирующих действий. Классический подвид — TOCTOU (time-of-check to time-of-use): код сначала проверяет условие, а лишь затем изменяет состояние, и в зазор между шагами успевает «проскочить» другой запрос. **Уязвимый паттерн:** ```js // Шаг 1: проверить, что купон ещё не использован: if (usage.cnt > 0) return res.redirect('/cart'); // Шаг 2: зачисление фиксируется позже — асинхронно, с задержкой: await redeemCoupon(user.id, code, value); ``` Атакующий отправляет залп одновременных активаций одного кода: пока первый запрос «в полёте», каждый следующий тоже проходит проверку по ещё не обновлённому состоянию и получает своё зачисление. ## Точка входа атаки `POST /cart/coupon` — форма активации промокода на странице корзины, поле `code` (требуется активная сессия и CSRF-токен формы). В магазине действуют коды `PROMO50`, `PROMO100` и `PROMO200`. * **Обычный пользователь:** `demo` / `demo` (баланс $500) * **Администратор:** `admin` / `???`

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

другие лабы по этой уязвимости
Обложка лабы: Race Condition: Double-spend баланса Обложка лабы: Race Condition: Double-spend баланса
Race

Race Condition: Double-spend баланса

Race condition: чтение и списание баланса без транзакции позволяет двойную трату при параллельных запросах.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Promo Code Race Обложка лабы: Promo Code Race
Race

Promo Code Race

Состояние гонки при активации промокодов.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Promo Code Race Обложка лабы: Promo Code Race
Race

Promo Code Race

Состояние гонки при активации промокодов (PHP).

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: Promo Code Race Обложка лабы: Promo Code Race
Race

Promo Code Race

Состояние гонки при активации промокодов (Python).

+60 XP
Python Pro
Exploit Fix