SQL Injection: Boolean-based Blind
Извлечение данных через Boolean-based Blind SQLi в эндпоинте проверки купонов.
mediumpythonPro
Задача
# SQL Injection: blind через бинарный канал
## Сценарий
Перед вами Flask-приложение интернет-магазина SecureShop. У приложения есть служебный эндпоинт валидации промокодов: пользователь вводит код купона на странице корзины, сервер проверяет его в базе данных и применяет скидку, если код найден.
Реализация выглядит безобидно, но имеет ту же фундаментальную ошибку, что и в базовом SQLi: код купона из формы попадает в SQL-запрос **через строковую интерполяцию текста запроса**, без отделения данных от кода. Атакующий может управлять структурой запроса через содержимое поля «код купона».
Особенность этой задачи — обработчик **не возвращает** напрямую результат SQL-запроса в ответе. Никакого SELECT'а в response body, никакого error-сообщения с дампом запроса. Сервер либо применяет скидку (если запись найдена), либо нет — и пользователь видит это по результату на странице корзины. Этот односложный «да/нет»-канал и называется **бинарным оракулом**: при правильно сконструированном payload каждый запрос даёт один бит информации (TRUE или FALSE) о состоянии БД. Этого достаточно, чтобы посимвольно извлечь любые данные, к которым у запроса есть доступ — включая пароли других пользователей.
В таблице пользователей есть привилегированная учётная запись `admin` с балансом, достаточным для покупки товара «CTF Flag» в каталоге; флаг отображается на странице профиля владельца такого заказа после оформления покупки.
## Цели
1. Найдите параметр в форме применения купона, через который значение из формы попадает в SQL. Подтвердите, что классический SQLi-payload здесь работает: подберите два payload'а — один с условием TRUE, другой с условием FALSE — и убедитесь, что сервер реагирует на них **по-разному**.
2. Через бинарный оракул извлеките пароль пользователя `admin` посимвольно. Это значит — построить семейство payload'ов, в каждом из которых условие проверяет один конкретный символ пароля на одной конкретной позиции, и автоматизировать перебор.
3. Войдите как `admin` с извлечённым паролем; купите «CTF Flag»; заберите CTF-флаг со страницы профиля.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |