Time-Based Blind SQL Injection
Эксплуатация слепой SQL-инъекции, основанной на задержках времени ответа (Time-Based) в SQLite.
hardgolang
Задача
# Time-based Blind SQL Injection (Дамп секретов через timing-канал)
## Сценарий
Вы проводите аудит безопасности интернет-магазина **SecureShop**. Анализируя трафик, вы заметили нестандартный HTTP-заголовок `X-Track-ID`, который браузер отправляет при запросе каталога товаров. Заголовок обрабатывается внутренней системой аналитики и сохраняется в БД. Сервер **никогда** не возвращает данные, связанные с этим заголовком, и не выводит ошибки SQL — обычный response остаётся одинаковым. База данных — **SQLite**.
## Цель
1. Обнаружить уязвимость, искусственно увеличив время ответа сервера (Time-based detection).
2. Подобрать «тяжёлый» подзапрос нужного веса, чтобы задержка стабильно превышала ~2 секунды.
3. Написать скрипт, который посимвольно извлечёт целевую строку из БД, ориентируясь исключительно на время ответа.
4. Получить флаг — он хранится в строке таблицы `secrets` со значением ключа `flag`.
## Теория
**Time-based Blind SQL Injection** применяется, когда приложение не возвращает никаких данных и не показывает ошибки, но выполняет SQL-запросы синхронно. Единственный канал связи с базой данных — **время ответа**.
Идея: задаём базе вопрос — «Если первая буква секрета `f`, подожди 2 секунды».
- Сервер завис на 2 секунды → ответ **TRUE**.
- Сервер ответил мгновенно → ответ **FALSE**.
**Специфика SQLite:** функции `SLEEP()` нет. Вместо неё используются «тяжёлые» подзапросы, нагружающие CPU/IO — выделение случайных байт через `randomblob()`:
```sql
SELECT count(hex(randomblob(100000000)))
```
**Уязвимый паттерн:**
```go
// Значение HTTP-заголовка вставляется напрямую в INSERT-запрос:
trackID := r.Header.Get("X-Track-ID")
query := fmt.Sprintf("INSERT INTO tracking (tracking_id, user_agent) VALUES ('%s', 'Go-Client')", trackID)
h.db.Exec(query)
```
## Точка входа атаки
* **Эндпоинт:** `GET /catalog`
* **Канал инъекции:** HTTP-заголовок `X-Track-ID`
* **Метод подтверждения:** измерение времени ответа