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

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

SQL Injection: WAF Bypass

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

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Сложно+90 XP ~65 мин nodejs
CWE-89 · A03:2021 Pro
Обложка: SQL Injection: WAF Bypass Обложка: SQL Injection: WAF Bypass
Задача
# SQL-инъекция: обход самодельного WAF ## Сценарий Магазин снаряжения **«Гряда-Софт»** готовится впервые вынести свой Express-магазин с базой SQLite в публичный интернет, и вас позвали на «стресс-тест» защиты входа. Разработчик уже начитался про атаки на формы логина и гордится самодельным фильтром: значения полей проверяются на вхождение «опасных» SQL-слов и запрос с ними отвергается. Ваша задача — проверить, держит ли эта защита реальную нагрузку. ## Цель 1. Убедитесь, что фильтр существует и блокирует привычный вариант атаки на форму входа, а сам запрос к базе по-прежнему собирается строкой. 2. Изучите логику фильтра и найдите эквивалентную SQL-конструкцию, которую он не распознаёт. 3. Через найденный обход войдите как **admin**, купите товар **CTF Flag** и заберите флаг со страницы профиля. ## Теория Чёрный список «опасных слов» защищает только от копирования чужих примеров, но не от самой инъекции: за фильтром остаётся обработчик, склеивающий SQL из пользовательского ввода. Достаточно одной щели в списке — и атака проходит в исходном виде. **Уязвимый паттерн:** ```js const blocked = ['select', 'union', 'or', 'and', '--', '#']; // каждое слово ищется в полях формы как подстрока, с учётом регистра const query = `SELECT id FROM users WHERE username = '${username}' AND password = '${password}'`; ``` Фильтр сравнивает строки так, как это делает JavaScript — с учётом регистра, а SQL ключевые слова регистром пренебрегает. Смешанный регистр оператора или блочный комментарий вместо однострочного не совпадают ни с одним словом списка, но полностью работоспособны в запросе: условие проверки пароля отсекается, и вход выполняется без знания пароля. ## Точка входа атаки `POST /login` — форма входа с полями `username` и `password`; фильтр отвергает «подозрительный» ввод сообщением об ошибке на странице логина. * **Обычный пользователь:** `demo` / `demo` * **Целевая учётная запись:** `admin` / `???`

Похожие лабораторные (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: Second-Order через сохранённый username профиля Обложка лабы: SQL Injection: Second-Order через сохранённый username профиля
SQLi

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

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

+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