Business Logic: Отрицательное количество товаров
Корзина магазина принимает отрицательное количество товаров, позволяя получить отрицательную сумму заказа и увеличить баланс
easygolangPro
Задача
# Negative Quantity: бизнес-инвариант quantity ≥ 1 не выражен в коде
## Сценарий
Вы зарегистрированный пользователь интернет-магазина **SecureShop** с балансом **$500**. В магазине есть товар **CTF Flag** стоимостью **$9999** — обычной покупкой он недоступен. Команда уверена, что цены и баланс пользователя защищены — товары добавляются в корзину штатной формой `/cart/add`, поле `quantity` имеет HTML-атрибут `min="1"`. По данным внутреннего аудита, есть способ оформить заказ на CTF Flag, не получая дополнительных средств легитимным путём, через манипуляцию со штатной формой.
## Цель
1. Изучите, как сервер обрабатывает `POST /cart/add`: как именно поле `quantity` парсится, проверяется и попадает в расчёт стоимости/баланса при `checkout`.
2. Найдите такое значение `quantity`, которое формально проходит штатную обработку (без необходимости подделывать цену, ID товара или баланс), но нарушает бизнес-инвариант стоимости заказа в выгодную для вас сторону.
3. Используйте обнаруженный вектор для пополнения баланса, оформите заказ на CTF Flag и извлеките флаг из подтверждения заказа.
## Теория
Уязвимости класса **Business Logic** возникают, когда бизнес-инварианты приложения (например, «количество товара — положительное целое», «цена ≥ 0», «баланс не растёт от расхода») не выражены в коде. С точки зрения SQL-инъекций и XSS обработчик может быть полностью корректен — параметризованные запросы, экранирование, CSRF — но это не помогает, если значение проходит без бизнес-валидации. CWE-840 (Business Logic Errors), OWASP API5:2023 «Broken Function Level Authorization» в части unvalidated input.
**Уязвимый паттерн:**
```go
// Парсинг числа из формы без бизнес-валидации диапазона
quantity, _ := strconv.Atoi(r.FormValue("quantity"))
// quantity может быть отрицательным — итоговая сумма уйдёт в минус
total := price * quantity
```
HTML-атрибут `min="1"` — это UX-фильтр, который браузер применяет при сабмите формы. Любой клиент, отправляющий запрос напрямую (curl, Burp, DevTools fetch, Python `requests`), не обязан соблюдать атрибуты HTML. Бизнес-валидация — обязанность сервера.
## Точка входа атаки
| Параметр | Значение |
|----------|----------|
| Учётные данные | `demo` / `demo` (баланс $500) |
| Эндпоинт добавления в корзину | `POST /cart/add` (поля `product_id`, `quantity`, `csrf_token`) |
| Эндпоинт оформления | `POST /cart/checkout` |
| Цель | оформить заказ на товар **CTF Flag** ($9999) и извлечь флаг из подтверждения |