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

SQL Injection: Time-based Blind

Извлечение данных через Time-based Blind SQLi в форме восстановления пароля Flask-приложения.

hardpythonPro
Задача
# SQL Injection: blind через временной канал ## Сценарий Перед вами Flask-приложение интернет-магазина SecureShop. У приложения есть форма «забыли пароль»: пользователь вводит логин, сервер логирует факт запроса (создаёт запись об email-уведомлении в базе) и возвращает «если такой пользователь существует, письмо отправлено». Сама запись об уведомлении (с полем «получатель») хранится в БД — это часть рабочей логики приложения. Реализация имеет ту же фундаментальную ошибку, что и в других SQLi-задачах: значение поля «логин» из формы попадает в SQL-запрос (на этот раз в `INSERT`) **через строковую интерполяцию текста запроса**. Атакующий может управлять структурой запроса через содержимое поля. Особенность этой задачи — обработчик **не возвращает** ни результат запроса, ни ошибки парсера БД, ни даже разное состояние («да/нет»). Любой ввод — даже синтаксически невалидный — приводит к одинаковому ответу. То есть бинарного оракула, как в blind-boolean варианте, тоже нет. Остаётся только один канал — **время ответа сервера**: если в payload удастся заставить БД совершить намеренно «тяжёлую» операцию при выполнении некоторого условия, время ответа на этот запрос будет заметно больше, чем без неё. Этот канал и называется **временным оракулом**: каждый запрос даёт один бит информации (условие истинно или нет) о состоянии БД, и этого достаточно для посимвольного извлечения любых данных. В таблице пользователей есть привилегированная учётная запись `admin` с балансом, достаточным для покупки товара «CTF Flag» в каталоге; флаг отображается на странице профиля владельца такого заказа после оформления покупки. > **Замечание по нагрузке.** SQLite не имеет встроенной функции `SLEEP`, поэтому для создания задержки используется встроенная функция генерации байтового блока заданного размера. Подбирайте размер так, чтобы получить заметную, но небольшую задержку (1–2 секунды) — слишком большой блок может привести к OOM-kill контейнера лабы и потере прогресса. ## Цели 1. Найдите параметр в форме восстановления пароля, через который значение из формы попадает в SQL. Подтвердите, что классические признаки SQLi (видимые ошибки/разные ответы на TRUE/FALSE) **отсутствуют** — именно поэтому атака через временной канал, а не через прямой вывод. 2. Постройте payload, в котором при истинном условии БД выполняет «тяжёлую» операцию, а при ложном — нет. Через семейство таких payload'ов (по одному на каждый кандидат-символ нужного значения на каждой позиции) посимвольно извлеките пароль пользователя `admin`. Удобно автоматизировать на Python (`requests` + замер `time.time` до/после запроса). 3. Войдите как `admin` с извлечённым паролем; купите «CTF Flag»; заберите CTF-флаг со страницы профиля. ## Данные | Параметр | Значение | |----------|----------| | Обычный пользователь | `demo` / `demo` |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru