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

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