Перейти к содержимому

Поиск по платформе

SQL Injection: UNION SELECT через поиск каталога

Извлечение данных из таблицы users через UNION-based SQL injection в поиске каталога Express-приложения.

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Средне+60 XP ~35 мин nodejs
CWE-89 · A03:2021 Pro
Обложка: SQL Injection: UNION SELECT через поиск каталога Обложка: SQL Injection: UNION SELECT через поиск каталога
Задача
# SQL-инъекция: извлечение данных через поиск по каталогу ## Сценарий Компания **«БарсДиджитал»** открыла багбаунти на своём магазине гаджетов: приложение на Express с базой SQLite, и отчёты по веб-части щедро оплачиваются. Поиск по каталогу — первое, что вы решили проверить: строка из формы уходит в условие фильтрации SQL, а найденные товары сервер сразу отрисовывает на странице. Служба безопасности уверена, что «поиск всего лишь фильтрует товары» и ничего не может утекнуть. ## Цель 1. Подтвердите, что строка поиска попадает в SQL-запрос как часть синтаксиса, и определите состав колонок исходного запроса. 2. Присоединив к запросу собственную выборку, извлеките из базы пароль учётной записи **admin** — он придёт прямо на страницу каталога. 3. Войдите как **admin**, купите товар **CTF Flag** и заберите флаг со страницы профиля. ## Теория Когда приложение возвращает результат запроса прямо в ответе, SQL-инъекция превращается в канал чтения базы: атакующий присоединяет к исходному запросу вторую выборку, и её строки выводятся на страницу как «обычные» результаты. Условие соединения выборок — одинаковое число и совместимые типы колонок, поэтому атака начинается с их определения. **Уязвимый паттерн:** ```js const query = `SELECT id, name FROM products WHERE name LIKE '%${search}%'`; ``` Строка поиска интерполируется в текст SQL целиком, вместе с маской фильтрации. Закрыв строковый литерал кавычкой, атакующий дописывает к запросу выборку из любой таблицы базы и комментарием отсекает остаток исходного условия. Число колонок исходного запроса удобно подобрать перебором: сортировка по возрастающему номеру колонки подсказывает, где проходит граница. ## Точка входа атаки `GET /catalog` — параметр `q` (форма поиска по названию товара); вход в магазин для покупок — форма логина. * **Обычный пользователь:** `demo` / `demo` * **Целевая учётная запись:** `admin` / `???` (пароль — цель извлечения)

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: SQL Injection: Обход аутентификации в Express Обложка лабы: SQL Injection: Обход аутентификации в Express
SQLi

SQL Injection: Обход аутентификации в Express

Обход аутентификации через классическую SQL-инъекцию в форме логина Express + better-sqlite3.

+30 XP
Node.js Pro
Exploit Fix
Обложка лабы: SQL Injection: Boolean-based Blind (Node.js) Обложка лабы: SQL Injection: Boolean-based Blind (Node.js)
SQLi

SQL Injection: Boolean-based Blind (Node.js)

Извлечение секрета через Boolean-based Blind SQLi в эндпоинте проверки купонов.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: SQL Injection: Second-Order через сохранённый username профиля Обложка лабы: SQL Injection: Second-Order через сохранённый username профиля
SQLi

SQL Injection: Second-Order через сохранённый username профиля

Second-order SQL injection: вредоносный username безопасно сохраняется при регистрации, но выполняется как часть SQL позже, когда обработчик профиля собирает запрос истории заказов конкатенацией.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: SQL Injection: WAF Bypass Обложка лабы: SQL Injection: WAF Bypass
SQLi

SQL Injection: WAF Bypass

Обход WAF с чёрным списком SQL-ключевых слов для эксплуатации SQL-инъекции в форме логина Express + better-sqlite3.

+90 XP
Node.js Pro
Exploit Fix