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

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

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

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

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Сложно+90 XP ~65 мин golang
CWE-89 · A03:2021
Обложка: SQL Injection: Second-Order (хранимая инъекция) Обложка: SQL Injection: Second-Order (хранимая инъекция)
Задача
# Second-order SQL-инъекция (хранимая инъекция через профиль) ## Сценарий Вы проводите аудит безопасности **KubeKart** — маркетплейса DevOps-инструментария, написанного на Go. Команда разработки гордится параметризованной регистрацией: спецсимволы в поле полного имени не вызывают ни ошибок, ни подозрительных записей в логах. Однако автоматический сканер фиксирует редкие SQL-ошибки на странице профиля — всегда у пользователей с необычными именами. Похоже, защищена только точка записи данных, а точка чтения осталась без внимания. ## Цель 1. Зарегистрируйте пользователя, чьё полное имя несёт скрытую SQL-конструкцию, и убедитесь, что при записи она не срабатывает. 2. Найдите страницу, где сохранённое имя снова попадает в текст SQL-запроса. 3. Расширьте сохранённую конструкцию так, чтобы вместе с пользователями на этой странице проявился секрет администратора — он и есть флаг лабы. ## Теория **Second-Order SQL Injection** («хранимая» инъекция) — атака, при которой вредоносная конструкция не срабатывает в момент ввода, а активируется позже: при чтении данных и подстановке их в другой SQL-запрос. Первый запрос записи выглядит безопасно даже при внимательной проверке, а уязвимость живёт в скрытом запросе чтения на другой странице. Регистрация в этом приложении честно параметризована: конструкция в поле полного имени уезжает в базу как обычная строка и не исполняется. Но позже страница профиля достаёт это имя из базы и собирает из него новый запрос: **Уязвимый паттерн:** ```go // Значение, прочитанное из БД, снова собирается в SQL через форматирование строки: similarQuery := fmt.Sprintf("SELECT username, fullname FROM users WHERE fullname LIKE '%%%s%%' AND id != %d", user.FullName, user.ID) ``` Сохранённое имя рассматривается как «доверенные внутренние данные», хотя это всё тот же пользовательский ввод — только с задержкой во времени. Кавычка в имени закрывает строковый литерал, меняет структуру запроса и позволяет присоединить к нему произвольную выборку: содержимое служебных таблиц выводится на страницу вместе со списком пользователей. ## Точка входа атаки * `POST /register` — регистрация; поле `fullname` — носитель скрытой конструкции (поля `username`, `password` — обычные). * `POST /login` — вход под созданным пользователем. * `GET /profile` — страница профиля с блоком «People You May Know»: здесь сохранённое имя возвращается в SQL и конструкция срабатывает. * **Пользователь для разведки интерфейса:** `demo` / `demo` > Second-order инъекции — тяжёлая цель для автоматических сканеров: они проверяют связку «запрос → ответ» в одном запросе, а здесь точка входа и точка срабатывания разнесены.

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

другие лабы по этой уязвимости
Обложка лабы: 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: Обход WAF через mixed case Обложка лабы: SQL Injection: Обход WAF через mixed case
SQLi

SQL Injection: Обход WAF через mixed case

Case-sensitive blacklist SQL keywords обходится через смешанный регистр (uNiOn, sElEcT)

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

Union-Based SQL Injection

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

+60 XP
Go FREE
Exploit Fix