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

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

SQL Injection — обход WAF blacklist

WAF с blacklist-фильтром блокирует SQL-ключевые слова, но обходится через mixed case.

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Сложно+90 XP ~65 мин php
CWE-89 · A03:2021 Pro
Обложка: SQL Injection — обход WAF blacklist Обложка: SQL Injection — обход WAF blacklist
Задача
# SQL-инъекция: обход чёрного списка ключевых слов ## Сценарий Вы проводите повторный аудит маркетплейза промтоваров «Форпост» (нативный PHP, SQLite). После прошлогоднего инцидента разработчик закрыл поиск каталога самописным «WAF»: перед выполнением запроса параметр поиска проверяется по чёрному списку SQL-ключевых слов, и при совпадении ввод отвергается с сообщением о блокировке. Заказчик просит оценить, можно ли считать поиск закрытым, — а вас настораживает сам подход: фильтр стоит поверх кода, который формирует запрос конкатенацией строк. ## Цель 1. Подтвердите, что фильтр работает: прямые SQL-конструкции в поиске каталога блокируются. 2. Изучите, как именно фильтр сравнивает ввод со списком, найдите щель и обойдите блокировку. 3. Через инъекцию перечислите таблицы базы и найдите ту, у которой нет публичных эндпоинтов. 4. Извлеките из неё сохранённый секрет и сдайте его как флаг. ## Теория Чёрный список перечисляет «опасные слова» и надеется, что атакующий не сумеет выразить ту же конструкцию иначе. SQL при этом регистронезависим: движок базы исполняет ключевое слово в любом регистре одинаково. Если фильтр ищет вхождение подстроки в одном фиксированном регистре, простая смена регистра обходит его — а уязвимость за фильтром никуда не исчезает. **Уязвимый паттерн:** ```php if (strpos($input, $keyword) !== false) { return false; } // список — в одном регистре // ...за фильтром — обычная конкатенация: $query = "SELECT id, name, description, price, image FROM products WHERE name LIKE '%" . $search . "%'"; ``` Фильтр сравнивает подстроки с учётом регистра, база данных регистр игнорирует. Обойдя блокировку, атакующий получает полноценную инъекцию: закрывает литерал, определяет число колонок сортировкой и дописывает вторую выборку — карточки каталога отрисуют строки из любой таблицы, включая служебную таблицу метаданных SQLite, которая перечисляет всю схему базы. ## Точка входа атаки `GET /catalog` с параметром `q` — поиск по каталогу, доступен без авторизации. * **Обычный пользователь (для разведки интерфейса):** `demo` / `demo` * Блокируемый ввод отвечает сообщением «Suspicious input blocked by WAF» — так вы узнаёте фильтр в лицо. Флаг — строка `flag{...}` из скрытой таблицы базы: она появится в карточке каталога и сдаётся в форме проверки лабы.

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

другие лабы по этой уязвимости
Обложка лабы: Boolean-based Blind SQL Injection через cookie купона Обложка лабы: Boolean-based Blind SQL Injection через cookie купона
SQLi

Boolean-based Blind SQL Injection через cookie купона

Значение купона из cookie подставляется в SQL-запрос без параметризации, позволяя извлечь данные через boolean-based blind инъекцию.

+90 XP
PHP Pro
Exploit Fix
Обложка лабы: UNION SQL Injection в поиске каталога Обложка лабы: UNION SQL Injection в поиске каталога
SQLi

UNION SQL Injection в поиске каталога

UNION-based SQL-инъекция через поиск товаров позволяет извлечь данные из таблицы пользователей.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: SQL Injection в форме входа Обложка лабы: SQL Injection в форме входа
SQLi

SQL Injection в форме входа

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

+30 XP
PHP Pro
Exploit Fix