Автор оригинала: Kumar Chandrakant.
1. Обзор
В этом уроке мы опишем атаки перечисления в целом. Более конкретно, мы рассмотрим атаки перечисления имен пользователей на веб-приложение. И, самое главное, мы рассмотрим варианты их обработки с помощью Spring Security.
2. Объяснение атак Перечисления
Перечисление технически означает полный и упорядоченный список всех элементов в коллекции. Хотя это определение ограничено математикой, его сущность делает его мощным инструментом взлома. Перечисление часто раскрывает векторы атаки, которые могут быть использованы для эксплуатации. В этом контексте он часто известен как перечисление ресурсов.
Перечисление ресурсов, как следует из названия, – это способ собрать список ресурсов с любого хоста. Эти ресурсы могут представлять любую ценность, включая имена пользователей, службы или страницы. Эти ресурсы могут выявить потенциальные уязвимости в хосте.
Теперь существует несколько возможных способов, исследованных или даже неисследованных, чтобы использовать эти уязвимости.
3. Популярные атаки перечисления для веб – приложений
В веб-приложении одной из наиболее часто используемых атак перечисления является атака перечисления имени пользователя. Это в основном использует любую явную или неявную функцию веб-приложения для сбора допустимых имен пользователей. Злоумышленник может использовать популярные варианты имени пользователя для атаки на веб-приложение.
Теперь, какая функция в веб-приложении может показать, является ли имя пользователя допустимым или нет? Честно говоря, она может быть настолько разнообразной, насколько это возможно. Это может быть функция, как задумано, например, страница регистрации, позволяющая пользователю узнать, что имя пользователя уже занято.
Или это может быть так же неявно, как тот факт, что попытка входа с допустимым именем пользователя занимает гораздо больше времени, чем попытка с недопустимым именем пользователя.
4. Настройка для эмуляции атаки перечисления имен пользователей
Мы будем использовать простое пользовательское веб-приложение, использующее Spring Boot и Spring Security, чтобы продемонстрировать эти векторы атаки. Это веб – приложение будет иметь минимальный набор функций для поддержки демонстрации. Подробное обсуждение того, как настроить такое приложение, описано в предыдущем руководстве .
Общие функции веб-приложения часто раскрывают информацию, которая может быть использована для запуска атак перечисления. Давайте пройдемся по ним.
4.1. Регистрация Пользователя
Для регистрации пользователя требуется уникальное имя пользователя, а адрес электронной почты часто выбирается для простоты. Теперь, если мы выберем электронное письмо, которое уже существует, приложение должно сообщить нам об этом:
В сочетании с тем фактом, что список электронных писем нетрудно найти, это может привести к атаке перечисления имен пользователей, чтобы выудить действительные имена пользователей в приложении.
4.2. Вход пользователя в систему
Аналогично, когда мы пытаемся войти в приложение, оно требует, чтобы мы предоставили имя пользователя и пароль. Теперь, если имя пользователя, которое мы предоставляем, не существует, приложение может вернуть нам эту информацию:
Это, как и прежде, достаточно просто использовать для атаки перечисления имен пользователей.
4.3. Сброс Пароля
Сброс пароля часто реализуется для отправки ссылки на сброс пароля на электронную почту пользователя. Теперь, опять же, это потребует, чтобы мы предоставили имя пользователя или адрес электронной почты:
Если это имя пользователя или адрес электронной почты не существует в приложении, приложение сообщит об этом, что приведет к аналогичной уязвимости, как мы видели ранее.
5. Предотвращение Атак Перечисления Имен Пользователей
Существует несколько способов предотвратить атаку перечисления имен пользователей. Многие из них мы можем достичь с помощью простых настроек в функциях, таких как сообщения пользователей в веб-приложении.
Более того, весенняя безопасность со временем созрела достаточно, чтобы поддерживать обработку многих из этих векторов атак. Существуют готовые функции и точки расширения для создания пользовательских гарантий. Мы рассмотрим некоторые из этих методов.
Давайте рассмотрим популярные варианты, доступные для предотвращения таких атак. Пожалуйста, обратите внимание, что не все из этих решений подходят или даже возможны в каждой части веб-приложения. Мы обсудим это более подробно по ходу дела.
5.1. Настройка сообщений
Во-первых, мы должны исключить все возможности непреднамеренного предоставления большего количества информации, чем требуется. Это было бы сложно при регистрации, но довольно просто на страницах входа в систему и сброса пароля.
Например, мы можем легко сделать сообщение для страницы входа в систему абстрактным:
Мы можем сделать аналогичные изменения в сообщении для страницы сброса пароля.
5.2. Включая КАПЧУ
Хотя настройка сообщений хорошо работает на некоторых страницах, есть такие страницы, как регистрация, где это сложно сделать. В таких случаях мы можем использовать другой инструмент под названием CAPTCHA.
Теперь, на этом этапе, стоит отметить, что любая атака перечисления, скорее всего, является роботизированной из-за огромного количества возможностей для прохождения. Следовательно, обнаружение присутствия человека или робота может помочь нам предотвратить атаку . КАПЧА служит популярным способом достижения этой цели.
Существует несколько возможных способов реализации или интеграции сервисов CAPTCHA в веб-приложение. Одним из таких сервисов является reCAPTCHA от Google, который можно легко интегрировать на странице регистрации .
5.3. Ограничение скорости
Хотя КАПЧА хорошо служит этой цели, она добавляет задержку и, что более важно, неудобства для законных пользователей. Это более актуально для часто используемых страниц, таких как вход в систему.
Одним из методов, который может помочь предотвратить роботизированные атаки на часто используемые страницы, такие как вход в систему, является ограничение скорости . Ограничение скорости относится к предотвращению последовательных попыток доступа к ресурсу после определенного порогового значения.
Например, мы можем блокировать запросы с определенного IP-адреса в течение дня после трех неудачных попыток входа в систему:
Пружинная защита делает это особенно удобным.
Мы начнем с определения слушателей для AuthenticationFailureBadCredentialsEvent и AuthenticationSuccessEvent. Эти прослушиватели вызывают службу, которая записывает количество неудачных попыток с определенного IP-адреса. После достижения заданного порога последующие запросы блокируются в UserDetailsService .
Подробное обсуждение этого подхода доступно в другом учебном пособии .
5.4. Геоограничение
Кроме того, мы можем зафиксировать местоположение пользователя по стране во время регистрации. Мы можем использовать это для проверки попытки входа в систему, исходящей из другого места. Если мы обнаружим необычное место, можно будет предпринять соответствующие действия:
- Выборочно включить капчу
- Применение пошаговой аутентификации (как часть многофакторной аутентификации)
- Попросите пользователя надежно проверить местоположение
- Временно блокируйте пользователя при последовательных запросах
Опять же, Spring Security через свои точки расширения позволяет подключить пользовательскую службу проверки местоположения в AuthenticationProvider . Конкретная разновидность этого была подробно описана в предыдущем учебнике .
5.5. Многофакторная Аутентификация
Наконец, мы должны отметить, что аутентификация на основе пароля часто является первым и в большинстве случаев единственным необходимым шагом. Но нередко приложения используют механизмы многофакторной аутентификации для повышения безопасности . Это особенно верно для чувствительных приложений, таких как онлайн-банкинг.
Существует множество возможных факторов, когда речь заходит о многофакторной аутентификации:
- Фактор знаний: Это относится к тому, что знает пользователь, например PIN-код
- Фактор владения: Это относится к тому, чем обладает пользователь, например, токеном или смартфоном
- Фактор инерции: Это относится к тому, что пользователь по своей сути имеет, например, отпечатки пальцев
Spring Security также очень удобна здесь, так как позволяет нам подключить пользовательский поставщик аутентификации|/. Приложение Google Authenticator является популярным выбором для реализации дополнительного фактора владения. Это позволяет пользователям генерировать эфемерный токен в приложении на своем смартфоне и использовать его для аутентификации в любом приложении. Очевидно, что это требует предварительной настройки пользователя в приложении, либо во время регистрации, либо позже.
Интеграция Google Authenticator в приложение Spring Security была подробно рассмотрена в предыдущем руководстве .
Что еще более важно, такое решение, как многофакторная аутентификация, подходит только в том случае, если оно необходимо приложению . Следовательно, мы не должны использовать его в первую очередь для предотвращения атак перечисления.
5.6. Задержки По Времени Обработки
При обработке запроса, такого как логин, проверка наличия имени пользователя часто является самым первым, что мы делаем. Если имя пользователя не существует, запрос немедленно возвращается с ошибкой. Напротив, запрос с действительным именем пользователя будет включать в себя множество дальнейших шагов, таких как сопоставление пароля и проверка роли. Естественно, время для реагирования на оба этих случая может варьироваться.
Теперь, даже если мы абстрагируем сообщение об ошибке, чтобы скрыть факт того, является ли имя пользователя действительным или нет, значительная разница во времени обработки может насторожить злоумышленника.
Возможным решением этой проблемы может быть добавление принудительной задержки, чтобы исключить разницу во времени обработки. Однако, поскольку это не та проблема, которая может возникнуть с уверенностью, мы должны использовать это решение только в случае необходимости.
6. Завершение Работы
Хотя мы рассмотрели множество трюков, которые можно использовать, когда дело доходит до атак перечисления имен пользователей, естественно спросить, когда использовать что? Очевидно, что на этот вопрос нет единого ответа, поскольку он в значительной степени основан на типе приложения и его требованиях.
Некоторые вещи, такие как сообщения пользователю, должны пропускать как можно меньше информации. Кроме того, разумно ограничить последовательные неудачные попытки доступа к такому ресурсу, как login.
Однако мы должны использовать любые дополнительные меры только в том случае, если требования сочтут их необходимыми. Мы также должны рационально взвесить их с точки зрения сдерживания юзабилити.
Кроме того, важно понимать, что мы можем применять любую комбинацию этих мер для различных ресурсов, чтобы выборочно обеспечить их безопасность.
7. Заключение
В этом уроке мы обсудили атаки перечисления – в частности, атаки перечисления имен пользователей. Мы видели это через призму простого приложения Spring Boot с Spring Security.
Мы рассмотрели несколько способов постепенного решения проблем, связанных с атаками на перечисление имен пользователей.
Наконец, мы обсудили целесообразность этих мер в области безопасности приложений.
Как всегда, код для примеров доступен на GitHub .