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

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

SQL Injection: Second-Order через сохранённый username профиля

Second-order SQL injection: вредоносный username безопасно сохраняется при регистрации, но выполняется как часть SQL позже, когда обработчик профиля собирает запрос истории заказов конкатенацией.

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Сложно+90 XP ~65 мин nodejs
CWE-89 · A03:2021 Pro
Обложка: SQL Injection: Second-Order через сохранённый username профиля Обложка: SQL Injection: Second-Order через сохранённый username профиля
Задача
# SQL-инъекция второго порядка: сохранённый логин ## Сценарий Геймдев-студия **«Артель-Софт»** после рефакторинга регистрации просит вас перепроверить магазин мерча на Express и SQLite. Привычные уязвимые места разработчик закрыл: форма регистрации пишет данные в базу параметризованно, и «в лоб» инъекция там не проходит. Ваша гипотеза — где-то позже эти же данные читаются и снова попадают в SQL, уже без параметров. ## Цель 1. Убедитесь, что момент записи защищён и прямая инъекция в форме регистрации не работает. 2. Найдите обработчик чтения, где сохранённый при регистрации логин попадает в другой SQL-запрос сборкой строки. 3. Зарегистрируйтесь со специальным значением логина, войдите и добейтесь, чтобы страница профиля показала заказы всех пользователей — и флаг вместе с ними. ## Теория Инъекция второго порядка срабатывает не в момент ввода, а позже: пользовательские данные безопасно сохраняются в базе, а затем читаются и подставляются в другой запрос уже как «доверенные». Логика «мы сами это записали — проверять не нужно» и есть корень ошибки: сохранённое значение — тот же недоверенный ввод. **Уязвимый паттерн:** ```js const query = `SELECT id 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: Boolean-based Blind (Node.js) Обложка лабы: SQL Injection: Boolean-based Blind (Node.js)
SQLi

SQL Injection: Boolean-based Blind (Node.js)

Извлечение секрета через Boolean-based Blind SQLi в эндпоинте проверки купонов.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: SQL Injection: WAF Bypass Обложка лабы: SQL Injection: WAF Bypass
SQLi

SQL Injection: WAF Bypass

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

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: SQL Injection: UNION SELECT через поиск каталога Обложка лабы: SQL Injection: UNION SELECT через поиск каталога
SQLi

SQL Injection: UNION SELECT через поиск каталога

Извлечение данных из таблицы users через UNION-based SQL injection в поиске каталога Express-приложения.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: SQL Injection: Обход аутентификации в Express Обложка лабы: SQL Injection: Обход аутентификации в Express
SQLi

SQL Injection: Обход аутентификации в Express

Обход аутентификации через классическую SQL-инъекцию в форме логина Express + better-sqlite3.

+30 XP
Node.js Pro
Exploit Fix