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

Сломанная логика 2FA

Лаборатория

2FA broken logic · Apprentice

Решение

Дано

This lab's two-factor authentication is vulnerable due to its flawed logic. To solve the lab, access Carlos's account page.

Your credentials: wiener:peter
Victim's username: carlos
You also have access to the email server to receive your 2FA verification code.

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

Есть уязвимая логика 2FA на сайте, у нас есть свой аккаунт, где мы можем посмотреть, как работает механизм. Для решения лабы нам нужно получить доступ к странице пользователя carlos.

Разведка

Попробуем пройти 2FA-флоу под своим пользователем.

  1. POST /login, в теле имя и пароль. Ответ + редирект на /login2:
    Set-Cookie: verify=wiener; HttpOnly
    Set-Cookie: session=EBdAlyofdB1mRMdQSvTDuKzeWSgj9t64; Secure; HttpOnly; SameSite=None
    
  2. На GET /login2 форма ввода кода 2FA. Вводим его из имейла. POST /login2, в теле код mfa-code=1507, и передаётся кука:
    Cookie: session=EBdAlyofdB1mRMdQSvTDuKzeWSgj9t64; verify=wiener
    

    В ответ 302 — успешный вход.

Интересно, что кука verify ставится на первом шаге, потом на втором шаге редирект на страницу ввода кода. По сути эта кука указывает серверу, для какого пользователя осуществляется запрос, а мы можем её подменить. Попробовать вызвать GET /login2 с verify=carlos и тем самым вызвать создание 2FA-кода для него. И после чего с помощью вызова POST /login2 попробовать осуществить брутфорс-атаку на код, длина всего 4 символа.

  1. Отправим запрос на генерацию кода GET /login2 для carlos, задав verify=carlos.
  2. Получили форму ввода кода, нажмём отправку кода.
  3. Улетел запрос на POST /login2, его и закидываем в Intruder.
  4. Выбираем нагрузку «Brute forcer», задаём 4 символа.
  5. Добавляем переменную в тело запроса mfa-code=§pwd§.
  6. Запускаем атаку.

Ищем 302 редирект. Мы получили код — 0314. Отправляем запрос:

POST /login2
Cookie: session=MAEXN9XadoWSU7iCsN4RFiE6GEQnk1hs; verify=carlos

mfa-code=0314

В ответ 302 и новая кука. Записываем куку session, заменяем у себя в браузере, обновляем страницу.

Лаба решена!