← Каталог / nodejs / SQL Injection Извлечение секрета через Boolean-based Blind SQLi в эндпоинте проверки купонов.
hardnodejsPro
Задача
# SQL Injection: blind через бинарный канал
## Сценарий
Перед вами Express + better-sqlite3 приложение интернет-магазина 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` |
Похожие лабораторные
Ещё лабораторные по этому типу уязвимости
Обход аутентификации через классическую SQL-инъекцию в форме логина Express + better-sqlite3.
nodejseasyPro
Exploit Fix
Извлечение данных из таблицы users через UNION-based SQL injection в поиске каталога Express-приложения.
nodejsmediumPro
Exploit Fix
Second-order SQL injection: вредоносный username безопасно сохраняется при регистрации, но выполняется как часть SQL позже, когда обработчик профиля собирает запрос истории заказов конкатенацией.
nodejshardPro
Exploit Fix
Обход WAF с чёрным списком SQL-ключевых слов для эксплуатации SQL-инъекции в форме логина Express + better-sqlite3.
nodejshardPro
Exploit Fix
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы —
support@hackandfix.ru