На странице
apsyleg1 мин
#portswigger #authentication #web-security

Перебор имён пользователей по времени отклика сервера

Лаборатория

Username enumeration via response timing · Practitioner

Решение

Дано

This lab is vulnerable to username enumeration using its response times. To solve the lab, enumerate a valid username, brute-force this user's password, then access their account page.

Your credentials: wiener:peter
Candidate usernames
Candidate passwords

Анализ задания

Нужно организовать брутфорс на основе анализа времени ответов сервера. Сперва добываем имя пользователя, потом — пароль для него. Словари имён и паролей предоставлены.

Разведка

Посмотрим, как устроена форма входа. Всё как обычно:

POST /login
username=xxx&password=123

Проведём брутфорс-атаку по именам. Обратим внимание на время получения ответа от сервера. Пароль зададим любой, только длинный — символов 100. Через десяток запросов в ответе стало приходить:

You have made too many incorrect login attempts. Please try again in 30 minute(s).

Ого!

На такой случай можно попробовать использовать заголовок X-Forwarded-For — он указывает бэкенду IP адрес клиента, сделавшего запрос, если тот проходил через прокси. Некоторые проверки по IP смотрят на этот заголовок, и задав его, мы можем обойти ограничение выше, как бы став другим IP адресом.

Для этого в Intruder надо выбрать тип атаки Pitchfork — появится возможность вставлять несколько переменных в запрос. В конец запроса перед телом добавим X-Forwarded-For:

X-Forwarded-For: §ip§

В первую нагрузку можно поставить тип Number, от 1 до 10000. Во вторую закидываем наш список пользователей.

После завершения атаки добавим столбец Response received, чтобы видеть время до начала получения ответа от сервера. Отсортируем запросы по колонке «Response received». Среди запросов видим один, у которого время до получения ответа 1414, в других случаях — не более 457.

Можем попробовать подобрать пароль для ajax — похоже, это наш кандидат. Нагрузка №1 с X-Forwarded-For остаётся. Нагрузка №2 теперь будет в поле password, а имя фиксируем — ajax. Ищем код 302 — редирект после успешного логина. Найден — summer, вернул 302.

Окей, получается ajax / summer.

Лаба решена.