Перейти к содержимому
← Каталог php SQL Injection

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

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

hardphpPro
Задача
# Слепая инъекция по логическому признаку через сохранённый купон ## Сценарий Интернет-магазин «БезопасныйШоп» поддерживает систему промокодов. Когда покупатель применяет промокод на странице корзины, его код сохраняется в браузерном куки `applied_coupon` и при каждом следующем заходе на страницу корзины автоматически пересчитывается скидка. Значение куки попадает в запрос к базе данных без какой-либо обработки — оно склеивается со строкой запроса в момент исполнения. Внешне приложение ведёт себя предсказуемо: если код купона существует в базе, страница корзины показывает блок «Купон применён» со значением скидки. Если код не найден или запрос завершился ошибкой, страница показывает блок «Неверный купон». Атакующий получает в своё распоряжение бинарный канал утечки: ответ страницы зависит исключительно от того, вернул запрос строку или нет, при этом тело ответа в обоих случаях отличается лишь одним фрагментом. Ваша задача — обнаружить это поведение, подтвердить наличие слепой инъекции по логическому признаку и побайтово извлечь чувствительные данные из базы. Финальная цель — добраться до значения, которое сервер выдаёт только привилегированному пользователю, и сдать его в качестве флага. ## Уязвимый паттерн Значение куки `applied_coupon` полностью контролируется браузером — атакующий может положить туда произвольную строку. Приложение использует это значение при формировании SQL-запроса к таблице купонов, не отделяя данные от кода запроса. Любые управляющие конструкции SQL (кавычки, комментарии, подзапросы) внутри значения куки интерпретируются парсером базы данных как часть запроса. Результат запроса напрямую не виден атакующему (страница рендерит только сумму скидки, не идентификаторы строк), но реакция шаблона остаётся бинарной: «Купон применён» при успешной выборке против «Неверный купон» при пустом результате — это и есть скрытый канал утечки. ## Что вы изучите - Принцип работы слепой SQL-инъекции по логическому признаку: атакующий не видит результата запроса напрямую, но видит косвенный сигнал — изменение реакции приложения. - Как искать места, где недоверенные данные попадают в SQL: не только параметры формы и адресной строки, но и заголовки, куки, поля сессии. - Базовую технику побайтового извлечения: подзапрос возвращает один символ целевого значения, сравнивается с предположением, и булев результат сравнения управляет видимым состоянием страницы. - Оптимизацию перебора через двоичный поиск: вместо линейного перебора всех значений в диапазоне атакующий за `log2(N)` запросов сужает диапазон до одного символа. - Автоматизацию атаки скриптом: за десятки секунд можно извлечь хэш пароля или токен сессии целиком, отправляя только GET-запросы к публично доступной странице. ## Цели 1. Найти место, где значение куки `applied_coupon` влияет на SQL-запрос, и проверить, что одинарная кавычка ломает запрос. 2. Подтвердить инъекцию по логическому признаку: при истинном условии страница реагирует так, при ложном — иначе. 3. Извлечь содержимое одной чувствительной колонки таблицы учётных записей побайтово. 4. Получить значение, доступное только привилегированному пользователю, и сдать его как флаг. ## Окружение | Параметр | Значение | |----------|----------| | Адрес лабы | страница `/cart` после авторизации | | Учётная запись для входа | логин `demo`, пароль `demo` | | Существующий валидный код купона | `WELCOME2024` | | Тип СУБД | SQLite | | Куки, влияющий на запрос | `applied_coupon` | ## Подсказки по разведке - Перед атакой авторизуйтесь и добавьте любой товар в корзину — без товаров блок с купоном не отображается. - Откройте инструменты разработчика и посмотрите на список куки страницы корзины: один из них хранит код купона. - Сравните блок с информацией о скидке при разных значениях куки — отличия в одной строке HTML и будут вашим бинарным каналом. - Все атаки выполняются обычными GET-запросами к одной и той же странице, без обращения к скрытым служебным маршрутам.
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru