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

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

SQL Injection: Second-Order

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

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Сложно+90 XP ~65 мин python
CWE-89 · A03:2021 Pro
Обложка: SQL Injection: Second-Order Обложка: SQL Injection: Second-Order
Задача
# SQL-инъекция второго порядка ## Сценарий «Фрегат Маркет» — маркетплейс снаряжения для яхтинга. Разработчик недавно прошёл корпоративный курс по SQL-инъекциям и на радостях перевёл все формы записи на параметризованные запросы. Вас позвали на повторный аудит: убедиться, что дыр не осталось. Искать нужно не там, где ввод принимают, а там, где сохранённые данные читают. ## Цель 1. Найдите обработчик, который подставляет логин, сохранённый при регистрации, в другой SQL-запрос через строковую интерполяцию. 2. Зарегистрируйте аккаунт с таким логином, чтобы при последующем чтении условие отбора стало всегда истинным и запрос вернул записи всех пользователей. 3. Откройте страницу профиля: среди заказов окажется чужой заказ с товаром «CTF Flag», и флаг отобразится на странице. ## Теория Инъекция второго порядка срабатывает не в момент ввода, а позже: значение безопасно сохраняется в базу через параметризованный запрос, но затем читается и вклеивается в другой запрос уже как текст. Ошибка мышления — «данные из базы доверенные, мы сами их туда положили». Для парсера SQL сохранённая строка ничем не отличается от свежего ввода: спецсимволы в ней так же меняют структуру запроса. **Уязвимый паттерн:** ```python query = f"SELECT id, product_name, price FROM orders WHERE user_id IN (SELECT id FROM users WHERE username = '{user['username']}')" ``` Логин достаётся из базы через сессию и интерполяцией попадает в новый запрос. Зарегистрировав аккаунт с логином-ловушкой, атакующий при первом же открытии профиля получает выборку чужих заказов: всегда истинное условие превращает «мои заказы» в «все заказы», включая заказ администратора с флагом. ## Точка входа атаки `POST /register` — форма регистрации с полями `username`, `password`, `fullname`; затем вход через `POST /login` и просмотр `GET /profile`. * **Обычный пользователь:** `demo` / `demo` * **Аккаунт для атаки:** создайте сами — логин и есть инструмент

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

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

SQL Injection: WAF Bypass

Обход WAF с чёрным списком SQL-ключевых слов для эксплуатации SQL-инъекции в форме логина.

+90 XP
Python Pro
Exploit Fix
Обложка лабы: 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: UNION SELECT Обложка лабы: SQL Injection: UNION SELECT
SQLi

SQL Injection: UNION SELECT

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

+60 XP
Python Pro
Exploit Fix