SQL Injection: Обход аутентификации в Express
Обход аутентификации через классическую SQL-инъекцию в форме логина Express + better-sqlite3.
easynodejsPro
Задача
# SQL Injection: обход авторизации через форму входа
## Сценарий
Перед вами Express-приложение интернет-магазина SecureShop. Приложение использует SQLite (через `better-sqlite3`) для хранения учётных записей и каталога товаров. На странице входа форма с полями username/password — типовая авторизация.
Реализация выглядит безобидно, но имеет фундаментальную ошибку, к которой склонны разработчики, начинавшие путь до распространения параметризованных запросов: значения из формы попадают в SQL-запрос **через строковую интерполяцию текста запроса**, без отделения данных от кода. Это даёт атакующему возможность управлять структурой запроса через содержимое полей формы — классический SQL Injection в auth-эндпоинте.
В таблице пользователей есть привилегированная учётная запись `admin` с балансом, достаточным для покупки товара «CTF Flag» в каталоге; флаг отображается на странице профиля владельца такого заказа после оформления покупки.
## Цели
1. Подтвердите, что в форме входа значения полей попадают в SQL-запрос **как часть SQL-синтаксиса**, а не как данные. Простейший детектор — символ-кавычка в username, ожидаемая реакция — серверная ошибка SQL.
2. Обойдите проверку пароля и войдите как `admin`, **не зная** его пароля.
3. После входа из-под admin'а добавьте товар «CTF Flag» в корзину, оформите покупку, и заберите CTF-флаг со страницы профиля.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |
| Целевая учётная запись | `admin` (пароль не известен — его не нужно угадывать) |