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

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

Blind Boolean SQL Injection

Слепая Boolean-based SQL-инъекция через Cookie купона

Автор: Hack & Fix
Освоишь: параметризованные запросыprepared statementsleast-privilege DB
Сложно+90 XP ~65 мин golang
CWE-89 · A03:2021
Обложка: Blind Boolean SQL Injection Обложка: Blind Boolean SQL Injection
Задача
# Слепая булева SQL-инъекция ## Сценарий Вы — внешний аудитор безопасности **HexWear**, онлайн-магазина гик-мерча и пентест-гаджетов. Финансовый отдел готовит новую волну промокодов и перед запуском попросил проверить модуль скидок: расхождений в суммах заказов быть не должно. Ручной прогон формы купона подозрений не вызвал, но ваш коллега заметил странность: если исказить сохранённый код скидки спецсимволами, корзина начинает «мигать» — строка скидки то появляется, то исчезает в зависимости от введённого значения. Вам поручили разобраться, что происходит при пересчёте корзины. ## Цель 1. Подготовьте оракул: войдите, добавьте товар в корзину и примените валидный купон — зафиксируйте, как выглядит сводка со скидкой и без неё. 2. Убедитесь, что появлением скидки можно управлять логикой: проверьте дописанное условие в заведомо истинной и заведомо ложной разновидностях. 3. Определите длину секретной строки, которая хранится в служебной таблице базы данных. 4. Извлеките секрет по одному символу — это и есть флаг. ## Теория Классическая SQL-инъекция рассчитывает увидеть результат запроса или сообщение об ошибке. Здесь приложение молчит в обоих случаях: данные наружу не выводятся, тексты ошибок не показываются. Однако страница корзины различает два состояния — «купон сработал» и «купон не сработал» — и это превращает её в булев оракул. **Уязвимый паттерн:** ```go // Код купона из cookie вставляется в SQL-текст напрямую: query := fmt.Sprintf("SELECT discount FROM coupons WHERE code='%s'", coupon) ``` Механика атаки: к значению рабочего купона дописывается дополнительное условие. Если база сочтёт итоговое выражение истинным, пересчёт корзины получит ненулевую скидку и выведет строку со скидкой; если ложным — сводка останется без изменений. Задавая базе вопросы, допускающие только ответы «да» и «нет» — о длине секрета, о символе на конкретной позиции, — атакующий извлекает содержимое произвольных таблиц, не получив от приложения ни байта «лишнего» вывода. ## Точка входа атаки `GET /cart` — страница корзины. Сервер читает cookie `applied_coupon` и подставляет её значение в запрос скидки. Отредактируйте значение cookie в инструментах разработчика браузера и обновите страницу. Корзина при этом не должна быть пустой — иначе строка скидки не появится даже при истинном ответе. Легитимно cookie устанавливает форма `POST /cart/coupon` с полем `code`, но она принимает только существующие коды — для атаки управляйте самой cookie. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** `admin` / `???` * **Рабочие купоны:** `SAVE10`, `HACK20`, `WELCOME2024` — любой из них служит отправной точкой

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

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

Time-Based Blind SQL Injection

Эксплуатация слепой SQL-инъекции, основанной на задержках времени ответа (Time-Based) в SQLite.

+90 XP
Go FREE
Exploit Fix
Обложка лабы: SQL Injection: Second-Order (хранимая инъекция) Обложка лабы: SQL Injection: Second-Order (хранимая инъекция)
SQLi

SQL Injection: Second-Order (хранимая инъекция)

Payload сохраняется в БД через безопасный INSERT, но выполняется в другом запросе через конкатенацию строк

+90 XP
Go FREE
Exploit Fix
Обложка лабы: SQL Injection: Обход WAF через mixed case Обложка лабы: SQL Injection: Обход WAF через mixed case
SQLi

SQL Injection: Обход WAF через mixed case

Case-sensitive blacklist SQL keywords обходится через смешанный регистр (uNiOn, sElEcT)

+90 XP
Go FREE
Exploit Fix
Обложка лабы: Union-Based SQL Injection Обложка лабы: Union-Based SQL Injection
SQLi

Union-Based SQL Injection

Получение пароля администратора с использованием UNION SELECT

+60 XP
Go FREE
Exploit Fix