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

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

Boolean-based Blind SQL Injection через cookie купона

Значение купона из cookie подставляется в SQL-запрос без параметризации, позволяя извлечь данные через boolean-based blind инъекцию.

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Сложно+90 XP ~65 мин php
CWE-89 · A03:2021 Pro
Обложка: Boolean-based Blind SQL Injection через cookie купона Обложка: Boolean-based Blind SQL Injection через cookie купона
Задача
# Слепая SQL-инъекция: логический оракул через cookie купона ## Сценарий Вы проводите аудит магазина гаджетов и мерча «Пинта» (нативный PHP, SQLite) перед запуском программы лояльности. Маркетинг попросил проверить механику промокодов: код купона запоминается в браузерной куке и пересчитывает скидку при каждом заходе в корзину и при оформлении заказа. Внешний сканер на страницу корзины ничего не нашёл, но ваш коллега заметил, что корзина по-разному реагирует на «обычный» и «испорченный» код купона — вам поручили разобраться, что именно уходит в базу, и оценить, чем это грозит кассе магазина. ## Цель 1. Превратить пару реакций страницы корзины на купон в бинарный оракул «да/нет» и доказать, что значение куки попадает в SQL-запрос без обработки. 2. Вопросами к оракулу разведать форму запроса: сколько колонок он возвращает и числовая ли колонка, из которой берётся скидка. 3. Не выкачивая данные посимвольно, подсунуть базе собственную строку ответа со стопроцентной скидкой. 4. Оформить заказ на товар «CTF Flag» при нулевой итоговой сумме и забрать флаг со страницы профиля. ## Теория Слепая инъекция возникает там, где результат запроса не отображается, но поведение приложения зависит от того, вернул запрос строку или нет. Атакующий переформулирует извлечение данных в серию вопросов с ответом «да/нет»: условие внутри запроса сравнивает один символ цели с предположением, а реакция страницы выдаёт результат сравнения. **Уязвимый паттерн:** ```php $sql = sprintf("SELECT discount FROM coupons WHERE code = '%s'", $appliedCoupon); $result = $db->query($sql); ``` Значение куки полностью контролируется клиентом и вклеивается в текст запроса форматированием строки. Найденный купон рисует зелёный блок «Coupon applied», пустой результат или ошибка SQL — красный «Invalid coupon»: эта пара состояний и есть канал утечки. Дописывая к коду настоящего купона логическое условие, атакующий задаёт базе вопросы и читает ответы по цвету блока. Но оракул способен на большее, чем «да/нет». Если вместо выкачивания чужих данных подсунуть запросу его собственную строку результата — объединить пустой поиск купона с придуманной строкой, — приложение примет её за найденный купон. Запрос выбирает ровно одну колонку, и это процент скидки: число в подсунутой строке становится скидкой корзины. Тот же пересчёт по куке выполняется при оформлении заказа, а товар «CTF Flag» стоит сильно больше баланса демо-счёта — стопроцентная скидка превращает его в бесплатный. ## Точка входа атаки `GET /cart` после авторизации — запрос с кукой `applied_coupon`; купон применяется формой на странице корзины и хранится до оформления заказа. * **Обычный пользователь:** `demo` / `demo` * **Валидный код купона из сида:** `WELCOME2024` Кука помечена HttpOnly — из консоли браузера её не перезаписать, меняйте значение на вкладке Cookies в инструментах разработчика. Блок статуса купона отображается только при непустой корзине — перед атакой добавьте в корзину товар. Флаг появится на странице `/profile` после покупки товара «CTF Flag».

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

другие лабы по этой уязвимости
Обложка лабы: SQL Injection — обход WAF blacklist Обложка лабы: SQL Injection — обход WAF blacklist
SQLi

SQL Injection — обход WAF blacklist

WAF с blacklist-фильтром блокирует SQL-ключевые слова, но обходится через mixed case.

+90 XP
PHP Pro
Exploit Fix
Обложка лабы: UNION SQL Injection в поиске каталога Обложка лабы: UNION SQL Injection в поиске каталога
SQLi

UNION SQL Injection в поиске каталога

UNION-based SQL-инъекция через поиск товаров позволяет извлечь данные из таблицы пользователей.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: SQL Injection в форме входа Обложка лабы: SQL Injection в форме входа
SQLi

SQL Injection в форме входа

Обход аутентификации через SQL-инъекцию в форме логина.

+30 XP
PHP Pro
Exploit Fix