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

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

Union-Based SQL Injection

Получение пароля администратора с использованием UNION SELECT

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Средне+60 XP ~35 мин golang
CWE-89 · A03:2021
Обложка: Union-Based SQL Injection Обложка: Union-Based SQL Injection
Задача
# SQL-инъекция типа UNION (извлечение данных) ## Сценарий Вы — внешний аудитор, приглашённый в **GopherGoods** — онлайн-магазин девайсов и мерча для разработчиков, целиком написанный на Go. Команда уверена, что строгая типизация языка сама по себе защищает их от SQL-инъекций, и с интересом ждёт результатов проверки. Разведка уже дала первый звоночек: стоит отправить в поиск по каталогу спецсимвол, как часть карточек товаров заполняется техническими сообщениями драйвера базы данных. ## Цель 1. Восстановите структуру SQL-запроса каталога: число колонок и их типы, наблюдая за реакцией приложения. 2. Найдите в базе скрытую таблицу учётных записей и разберите её схему. 3. Присоедините к результатам каталога собственную выборку, выведите секрет администратора и получите флаг. ## Теория **UNION-инъекция** — техника, при которой к результатам исходного запроса атакующий присоединяет собственную выборку: оператор объединения склеивает два SELECT-запроса в одну таблицу, если у них совпадают число и типы колонок. Когда ввод конкатенируется прямо в SQL-строку, кавычка закрывает исходное условие — и к запросу дописывается вторая выборка из любых таблиц базы. **Уязвимый паттерн:** ```go // Прямая конкатенация пользовательского ввода в SQL: query := "SELECT id, name, description, price, image FROM products WHERE name LIKE '%" + search + "%'" rows, err := h.db.Query(query) ``` Особенность лабы — строгая типизация драйвера `database/sql`. Если в присоединённой части выборки тип не совпадает с типом колонки исходного запроса, драйвер вернёт ошибку конвертации и откажется показывать строку. Но приложение выводит эти ошибки прямо в карточки товаров — и сообщения об ошибках превращаются в канал разведки: по ним восстанавливаются и число колонок, и их типы. Когда сигнатура подобрана, в текстовые позиции подставляются имена полей интересующей таблицы — и её содержимое отображается в каталоге наравне с товарами. ## Точка входа атаки `GET /catalog` — поиск по каталогу, поле `q`. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** `admin` / `???` — его секрет спрятан в базе и является целью атаки

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

другие лабы по этой уязвимости
Обложка лабы: SQL Injection (Auth Bypass) Обложка лабы: SQL Injection (Auth Bypass)
SQLi

SQL Injection (Auth Bypass)

Обход авторизации с использованием SQL Injection

+30 XP
Go FREE
Exploit Fix
Обложка лабы: Blind Boolean SQL Injection Обложка лабы: Blind Boolean SQL Injection
SQLi

Blind Boolean SQL Injection

Слепая Boolean-based SQL-инъекция через Cookie купона

+90 XP
Go FREE
Exploit Fix
Обложка лабы: Time-Based Blind SQL Injection Обложка лабы: Time-Based Blind SQL Injection
SQLi

Time-Based Blind SQL Injection

Эксплуатация слепой SQL-инъекции, основанной на задержках времени ответа (Time-Based) в SQLite.

+90 XP
Go FREE
Exploit Fix
Обложка лабы: SQL Injection: Second-Order (хранимая инъекция) Обложка лабы: SQL Injection: Second-Order (хранимая инъекция)
SQLi

SQL Injection: Second-Order (хранимая инъекция)

Payload сохраняется в БД через безопасный INSERT, но выполняется в другом запросе через конкатенацию строк

+90 XP
Go FREE
Exploit Fix