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

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

SQL Injection: UNION SELECT

Извлечение данных из БД через UNION SELECT в поиске каталога Flask-приложения.

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

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

другие лабы по этой уязвимости
Обложка лабы: SQL Injection: Boolean-based Blind Обложка лабы: SQL Injection: Boolean-based Blind
SQLi

SQL Injection: Boolean-based Blind

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

+60 XP
Python Pro
Exploit Fix
Обложка лабы: SQL Injection: Auth Bypass Обложка лабы: SQL Injection: Auth Bypass
SQLi

SQL Injection: Auth Bypass

Обход авторизации через SQL-инъекцию в форме логина Flask-приложения.

+30 XP
Python Pro
Exploit Fix
Обложка лабы: SQL Injection: Time-based Blind Обложка лабы: SQL Injection: Time-based Blind
SQLi

SQL Injection: Time-based Blind

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

+90 XP
Python Pro
Exploit Fix
Обложка лабы: SQL Injection: Second-Order Обложка лабы: SQL Injection: Second-Order
SQLi

SQL Injection: Second-Order

SQL-инъекция второго порядка: payload сохраняется при регистрации и срабатывает при просмотре профиля.

+90 XP
Python Pro
Exploit Fix