Перейти к содержимому
← Каталог golang Business Logic

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) и извлечь флаг из подтверждения |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru