Перейти к содержимому
← Каталог golang SQL Injection

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`
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru