Union-Based SQL Injection
Получение пароля администратора с использованием UNION SELECT
mediumgolang
Задача
# UNION-based SQL Injection (Извлечение данных через каталог)
## Сценарий
Вы — внешний аудитор. Вам поручено проверить безопасность поиска товаров в магазине **SecureShop**. Разработчики использовали Go, считая, что строгая типизация языка спасёт их от инъекций. Однако при вводе спецсимволов приложение ведёт себя странно и иногда возвращает технические ошибки базы данных в карточках товаров.
## Цель
1. Определите количество колонок в SQL-запросе через `ORDER BY`.
2. Используя ошибки драйвера базы данных, определите типы данных в колонках (`int` или `string`).
3. Найдите имя скрытой таблицы пользователей и колонку с паролем.
4. Выведите логин и пароль администратора прямо в каталог товаров и заберите флаг.
## Теория
**UNION-атака** позволяет объединить результаты двух разных `SELECT`-запросов в одну выборку. Если приложение конкатенирует пользовательский ввод в SQL-строку, атакующий может закрыть исходный запрос кавычкой и дописать собственный `UNION SELECT`, вытащив данные из любых таблиц БД.
**Уязвимый паттерн:**
```go
// Прямая конкатенация пользовательского ввода в SQL:
query := "SELECT id, name, description, price, image FROM products WHERE name LIKE '%" + search + "%'"
rows, err := h.db.Query(query)
```
Главная сложность в Go — **строгая типизация драйвера `database/sql`**. В отличие от PHP/MySQL, если в UNION-части подставить строку в колонку числового типа (или наоборот), драйвер вернёт `Scan error: converting driver.Value type string to int` и не покажет данные. Придётся «нащупать» правильную сигнатуру типов, анализируя сообщения об ошибках в карточках товаров.
## Точка входа атаки
* **Эндпоинт:** `GET /catalog?q=...` — поле поиска по каталогу.
* **Обычный пользователь:** `demo` / `demo`