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

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

Timing Attack: Перечисление Пользователей

Обработчик логина имеет разное время ответа для существующих и несуществующих пользователей, что позволяет перечислять аккаунты.

Автор: Hack & Fix
Освоишь: bcrypt/argon2constant-time compareMFA
Сложно+90 XP ~65 мин golang
CWE-287 · A07:2021 Pro
Обложка: Timing Attack: Перечисление Пользователей Обложка: Timing Attack: Перечисление Пользователей
Задача
# Timing-атака: перечисление пользователей через время ответа ## Сценарий Вы проводите аудит безопасности **VaultCart** — интернет-магазина электроники на Go. При неверном входе приложение отвечает одинаковым сообщением для всех случаев — команда уверена, что защита от перечисления учётных записей реализована, и узнать, существует ли пользователь, невозможно. Ваш заказчик сомневается: «текст одинаковый — а всё остальное?» Проверьте, различимы ли сценарии по каким-то ещё осям, кроме тела ответа. ## Цель 1. Сравните поведение формы входа в трёх сценариях: несуществующий пользователь, существующий с неверным паролем, существующий с верным паролем — по статусу, телу и времени ответа. 2. Найдите боковой канал, различающий первые два сценария при идентичном ответе, и подтвердите через него существование учётной записи администратора. 3. Войдите как администратор (его пароль поддаётся словарному перебору — ограничений на попытки нет) и извлеките флаг из админ-панели. ## Теория Перечисление пользователей через **timing-канал** — класс атак, в которых существование учётной записи определяется по физическому времени обработки запроса, даже когда статус, заголовки и тело ответа неразличимы. Корень проблемы: путь обработки проходит через дорогостоящую операцию — проверку хеша пароля — только если пользователь найден; для несуществующего имени обработка обрывается мгновенно. **Уязвимый паттерн:** ```go // Дорогое сравнение хеша выполняется только для найденного пользователя: err := h.db.QueryRow("SELECT id, password FROM users WHERE username=?", username).Scan(&id, &hash) if err != nil { return // мгновенный возврат — пользователя нет } bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) // занимает десятки миллисекунд ``` Проверка хеша пароля намеренно вычислительно дорога — это её защитное свойство против офлайн-перебора. Но в timing-канале она становится маяком: ответ для существующего пользователя с неверным паролем дольше на порядки, чем для несуществующего имени. Единичный замер тонет в сетевом джиттере, поэтому атакующий снимает серии замеров и усредняет — статистика надёжно отделяет «есть такой пользователь» от «нет такого». Получив список реальных учёток, атакующий прицельно бьёт по ним: в этом приложении попытки входа ничем не ограничены. ## Точка входа атаки `POST /login` — форма входа с полями `username` и `password`. * **Рабочий пользователь (калибровка замеров):** `demo` / `demo` * **Цель перечисления и перебора:** `admin` * **Флаг:** админ-панель `GET /admin`, доступная только роли администратора

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

другие лабы по этой уязвимости
Обложка лабы: JWT Authentication: Взлом слабой криптографии Обложка лабы: JWT Authentication: Взлом слабой криптографии
Auth

JWT Authentication: Взлом слабой криптографии

В этой лаборатории сервер использует JWT для авторизации, но совершает сразу две критические ошибки: использует слабый секретный ключ и доверяет заголовку alg.

+90 XP
Go Pro
Exploit Fix
Обложка лабы: JWT Key Confusion (RS256 to HS256) Обложка лабы: JWT Key Confusion (RS256 to HS256)
Auth

JWT Key Confusion (RS256 to HS256)

JWT RS256/HS256 key confusion: the server exposes the public key and doesn't enforce the signing algorithm, allowing token forgery via algorithm switch.

+90 XP
Go Pro
Exploit Fix
Обложка лабы: Предсказуемые Токены Сессии (MD5) Обложка лабы: Предсказуемые Токены Сессии (MD5)
Auth

Предсказуемые Токены Сессии (MD5)

Сессионные токены генерируются через MD5(username), что позволяет предсказать токен администратора и захватить его сессию.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Небезопасный Сброс Пароля (IDOR) Обложка лабы: Небезопасный Сброс Пароля (IDOR)
Auth

Небезопасный Сброс Пароля (IDOR)

Форма сброса пароля принимает user_id из клиента, позволяя атакующему сбросить пароль любого пользователя через IDOR.

+60 XP
Go Pro
Exploit Fix