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

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

Timing-атака на форму входа

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

Автор: Hack & Fix
Освоишь: bcrypt/argon2constant-time compareMFA
Средне+60 XP ~35 мин nodejs
CWE-287 · A07:2021 Pro
Обложка: Timing-атака на форму входа Обложка: Timing-атака на форму входа
Задача
# Timing-атака на форму входа: перечисление пользователей ## Сценарий Вы — внешний аудитор **FoxMarket**, онлайн-магазина электроники на Express. Владелец уверен, что форма входа ничего не выдаёт: на любую неудачную попытку она отвечает одинаковым текстом про неверные данные. Ваш коллега усомнился — по его прикидке, в разных случаях сервер проделывает разный объём работы. Вам поручили проверить это измерением. ## Цель 1. Убедитесь, что приложение работает: войдите под обычным аккаунтом. 2. Найдите побочный канал, по которому форма входа разглашает существование учётных записей: одинаковый текст ответа не означает одинакового поведения сервера. 3. Измерениями перечислите существующие логины из списка типичных кандидатов. 4. Войдите как `admin` (пароль выдан вам заказчиком аудита), купите товар **CTF Flag** и получите флаг в профиле. ## Теория Timing side-channel — утечка информации через время ответа. Текст ошибки одинаков для случаев «нет такого пользователя» и «неверный пароль», но внутренняя работа различается: в первом обработчик возвращается почти мгновенно, во втором выполняет криптографически дорогую сверку пароля с хешем, съедающую десятки миллисекунд. Разница стоимости вычислений становится измеримой разницей времени ответа. **Уязвимый паттерн:** ```javascript // Дорогая проверка выполняется только для существующих логинов: if (!row) { return res.render('login.html', { error: 'Invalid credentials' }); } if (!bcrypt.compareSync(password, row.password)) { return res.render('login.html', { error: 'Invalid credentials' }); } ``` Быстрая ветка отвечает за миллисекунды, медленная — на порядки дольше. Замеряя время ответа для разных логинов, атакующий отличает существующие учётные записи от выдуманных, не зная ни одного пароля. ## Точка входа атаки `POST /login` — форма входа с полями `username` и `password`. * **Обычный пользователь:** `demo` / `demo` * **Целевая учётная запись:** `admin` / `SuperSecret` (выдана заказчиком аудита)

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

другие лабы по этой уязвимости
Обложка лабы: Брутфорс Формы Входа (Нет Rate Limiting) — Node.js Обложка лабы: Брутфорс Формы Входа (Нет Rate Limiting) — Node.js
Auth

Брутфорс Формы Входа (Нет Rate Limiting) — Node.js

Форма входа Express-приложения не ограничивает количество попыток, позволяя подобрать пароль администратора перебором по словарю.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: JWT alg:none — обход аутентификации без подписи Обложка лабы: JWT alg:none — обход аутентификации без подписи
Auth

JWT alg:none — обход аутентификации без подписи

Сервер принимает JWT с alg:none и доверяет роли из claims — подделайте токен для получения прав администратора в SecureShop.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: JWT: подбор слабого секрета и подделка admin-токена Обложка лабы: JWT: подбор слабого секрета и подделка admin-токена
Auth

JWT: подбор слабого секрета и подделка admin-токена

Сервер подписывает JWT слабым секретом из словаря. Получив один валидный токен, атакующий за секунды подбирает секрет по словарю офлайн, подписывает новый токен с role=admin и забирает флаг.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: Слабая Парольная Политика Обложка лабы: Слабая Парольная Политика
Auth

Слабая Парольная Политика

Регистрация принимает любой пароль без проверки сложности. Пароль администратора — 'admin'.

+30 XP
Node.js Pro
Exploit Fix