Blind Boolean SQL Injection
Слепая Boolean-based SQL-инъекция через Cookie купона
hardgolang
Задача
# Boolean-based Blind SQL Injection (Дамп секрета через купон)
## Сценарий
Вы проводите аудит безопасности интернет-магазина **SecureShop**. Функционал корзины позволяет применять промокоды. Вы заметили: если ввести спецсимволы в поле купона, видимых ошибок нет — но скидка то появляется, то исчезает в зависимости от вводимого значения. Это классический признак **Blind SQL Injection** с булевым оракулом.
## Цель
1. Подтвердите уязвимость с помощью логических выражений (`1=1` и `1=0`).
2. Определите длину целевой строки в БД через `length()`.
3. Напишите скрипт для посимвольного перебора значения.
4. Получите флаг — он хранится в строке таблицы `secrets` со значением ключа `flag`.
## Теория
**Blind Boolean SQLi** возникает, когда приложение не возвращает данные из БД и не показывает тексты ошибок, но по-разному реагирует на истинные (TRUE) и ложные (FALSE) SQL-запросы. В данном случае:
- **TRUE:** скидка применяется (в ответе виден текст «Discount»).
- **FALSE:** скидка не применяется (итог в корзине без скидки).
Это поведение используется как **оракул** — приложению задаются булевы вопросы вида *«Начинается ли секрет на букву "f"?»* и по наличию/отсутствию скидки определяется ответ.
**Уязвимый паттерн:**
```go
// Значение купона из cookie напрямую конкатенируется в SQL-запрос:
query := fmt.Sprintf("SELECT discount FROM coupons WHERE code='%s'", appliedCoupon)
err := h.db.QueryRow(query).Scan(&d)
```
## Точка входа атаки
```
POST /cart
Cookie: applied_coupon=<payload>
```
- **Учётные данные:** `demo` / `demo`
- **Рабочий купон:** `WELCOME2024` (используйте как основу для payload)