Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Одна из распространенных уязвимостей в OAuth возникает, когда разработчик неправильно настраивает или сравнивает допустимые параметры redirect_uri
, позволяя злоумышленникам похитить OAuth-токены. Прахар Прасад информировал компанию Slack о том, что он может обойти ограничения, указанные в разрешенном адресе redirect_uri
, за счет добавления к нему любых значений. Иными словами, сайт Slack проверял лишь начало параметра redirect_uri
. Если разработчик регистрировал в Slack новое приложение и добавлял в белый список https://
, злоумышленник мог расширить этот URL-адрес и выполнить перенаправление в непредвиденное место. Например, измененный адрес вида redirect_uri=https://<
отклонялся, но позволял передать redirect_uri=https://
.
Чтобы этим воспользоваться, злоумышленнику было достаточно создать подходящий поддомен на своем вредоносном сайте. Если жертва открывала зараженный URL-адрес, сервер Slack передавал OAuth-токен сайту злоумышленника. Хакер мог инициировать запрос от имени жертвы, встроив во вредоносную веб-страницу тег <
вроде такого:
<img src=https://slack.com/oauth/authonze?responseJype=token&dientJd=APP_ID&redirect_un=https://www.example.com.attacker.com>
Это позволило бы автоматически сделать HTTP-запрос типа GET при отображении страницы.
Уязвимости, связанные с недостаточно строгой проверкой redirect_uri
, являются распространенным примером неправильной конфигурации OAuth. Иногда это вызвано тем, что в качестве допустимого значения redirect_uri
регистрируется домен вида *.<
. Иногда причина в том, что сервер ресурса не проводит строгую проверку параметра redirect_uri
от начала и до конца. При поиске уязвимостей в OAuth проверяйте любые параметры, которые могут участвовать в перенаправлении.
Поиск уязвимостей в любой реализации OAuth подразумевает исследование всей процедуры аутентификации, от начала и до конца. Для этого в том числе необходимо распознать HTTP-запросы, которые не являются частью стандартного процесса; их наличие часто сигнализирует о том, что разработчик изменил механизм аутентификации и, возможно, сделал его уязвимым. Джек Кейбл столкнулся с подобной ситуацией в работе с программой Bug Bounty от Yahoo, в которую входил аналитический сайт Flurry.com.
Чтобы начать тестирование, Кейбл зарегистрировал учетную запись на сайте Flurry, используя свой адрес электронной почты @yahoo.
и реализацию OAuth от Yahoo. После того как Flurry и Yahoo согласовали OAuth-токен, заключительный POST-запрос к сайту Flurry выглядел так:
POST /auth/v1/account HTTP/1.1
Host: auth.flurry.com
Connection: close
Content-Length: 205
Content-Type: application/vnd.api+json
DNT: 1
Referer: https://login.flurry.com/signup
Accept-Language: en-US, en;q=0.8,la;q=0.6
{"data":{"type":"account","id":"...","attributes":{"email":"...@yahoo.com","companyName":"1234","firstname":"]ack","lastname":"cable","password":"not-provided"}}}
Внимание Кейбла привлек фрагмент запроса "password":
. Выйдя из своей учетной записи, он открыл страницу https://login.flurry.com/ и аутентифицировался не через OAuth, а с помощью почтового адреса и пароля not-provided
. Это сработало, и Кейбл смог войти в свою учетную запись.
Когда пользователь регистрировался на сайте Flurry с помощью своей учетной записи Yahoo и процедуры OAuth, система создавала для него отдельную клиентскую учетную запись с паролем по умолчанию not-provided
. Кейбл сообщил об уязвимости, и проблема была устранена через пять часов.
Нестандартные этапы OAuth часто плохо сконфигурированы и подвержены уязвимостям, поэтому заслуживают проверки.
На сайте Microsoft не реализована стандартная процедура OAuth, но там используется очень похожий процесс, который подходит для тестирования OAuth-приложений. Тестируя OAuth или аналогичные механизмы аутентификации, тщательно проанализируйте то, как проверяются параметры перенаправления. Для этого приложению можно передавать разные виды URL-адресов. Этот подход помог Джеку Уиттону найти в процедуре входа на сайт Microsoft способ похитить аутентификационные токены.
Компания Microsoft владеет множеством проектов, поэтому запросы для аутентификации пользователей на разных сервисах направляются разным доменам: login.
, login.
или login.
. Эти запросы возвращают пользователям сессии. Например, в случае с outlook.
процедура выглядит так:
https://login.microsoftonline.com/login.srf?wa=wsignin1.0&rpsnv=4&wreply=https%3a%2f%2fbutlook.office.com%2fowa%2f&id=260563
.wreply
выполняется POST-запрос с параметром t
, который содержит токен для пользователя.При попытке поменять wreply
на любой другой домен возникала ошибка. Уиттон попробовал передавать символы с двойным кодированием, добавляя в конец URL-адреса %252f
, чтобы получить https%3a%2f%2foutlook.
. В этом URL-адресе специальные символы :
и /
кодируются как %3a
и, соответственно, %2f
. Кроме того, в исходном адресе следует закодировать знак процента (%
), чтобы при двойном кодировании он превратился в косую черту %252f
(кодирование специальных символов обсуждалось в разделе «Разделение HTTP-ответа в Twitter» на с. 77). Когда Уиттон подставил вместо wreply
полученный URL-адрес, приложение вернуло ошибку, сообщающую, что адрес https://
не корректен.
Вслед за этим Уиттон добавил к домену @example.
и вместо ошибки получил https://
. Дело в том, что URL-адрес имеет следующую структуру: [//[
. Имя пользователя и пароль участвуют в базовой HTTP-аутентификации сайта. Поэтому после добавления @example.
домен для перенаправления больше не выглядел как outlook.
. Вместо этого пользователя можно было перенаправить к любому домену, который контролировался злоумышленником.
По словам Уиттона, причиной этой уязвимости было то, что сайт Microsoft выполнял декодирование и проверку URL-адреса в два этапа. На первом этапе сайт проверял, является ли доменное имя корректным и соответствует ли оно структуре URL-адреса. Адрес https://
успешно проходил проверку, поскольку строка outlook.
воспринималась как корректное имя пользователя.
На втором этапе сайт рекурсивно декодировал URL-адрес. Строкаhttps%3a%2f%2foutlook.
превращалась в https://
, то есть фрагмент @example.
после косой черты интерпретировался как часть пути, а доменное имя выглядело как outlook.
.
Сайт Microsoft проверял структуру URL-адреса, декодировал его и подтверждал его присутствие в белом списке. Но в качестве ответа возвращался адрес, декодированный один раз. То есть при посещении такого URL токен жертвы отправлялся сайту example.com.
https://login.microsoftonline.com/login.srf?wa=wsignin1.0&rpsnv=4&wreply=https%3a%2f%2foutlook.office.com%252f@example.com&id=260563
Хакер, владевший этим сайтом, мог войти в сервис Microsoft, к которому относился полученный токен, и читать учетные записи других пользователей.
В ходе исследования параметров перенаправления в процедуре OAuth добавьте к конечному URI-адресу @example.
и посмотрите, как поведет себя приложение. Это особенно актуально, если в процессе аутентификации используются закодированные символы, которые должны быть декодированы перед проверкой вхождения URL-адреса в белый список. Во время тестирования обращайте внимание на незначительные изменения в поведении сайта.
При поиске уязвимостей обращайте внимание на ресурсы интересующего вас приложения, о которых разработчики могли забыть. Филиппе Хэйрвуд поставил перед собой цель: похитить токен пользователя Facebook и получить доступ к его конфиденциальной информации. Однако ему не удалось найти никаких ошибок в реализации OAuth на сайте Facebook. Не отчаявшись, он поменял свой план и начал искать приложение Facebook, которое можно захватить как поддомен.
Он знал, что Facebook владеет приложениями, которые автоматически авторизуются с помощью OAuth, используя учетные записи этой платформы. С их списком можно было ознакомиться на странице https://www.facebook.com/search/me/apps-used/.
В списке Хэйрвуд нашел один проект, который по-прежнему был авторизован, хотя компания Facebook им больше не владела и не использовала его домен. Это означало, что Хэйрвуд мог зарегистрировать одобренное доменное имя в качестве параметра redirect_uri
и получить токен любого пользователя Facebook, который посещал конечную точку авторизации OAuth:
https://facebook.com/v2.5/dialog/oauth?response_type=token&display=popup&clientJd=APP_ID&redirect_uri=REDIRECT_URI/
В этом URL-адресе идентификатор уязвимого приложения обозначен в виде параметра APP_ID
, который предоставлял доступ ко всем областям видимости OAuth. Домен, входивший в белый список, обозначен как REDIRECT_URI
(Хэйрвуд не уточнил, какое именно приложение было неправильно сконфигурировано). Поскольку приложение уже было авторизовано для каждой учетной записи Facebook, при щелчке по этой ссылке пользователю не нужно было подтверждать запрашиваемые области видимости. Кроме того, вся процедура OAuth выполнялась посредством фоновых HTTP-запросов. Открыв этот URL-адрес для аутентификации на сайте Facebook, пользователь перенаправлялся к странице с подобным адресом http://
.
Поскольку Хэйрвуд зарегистрировал домен REDIRECT_URI
, он мог записывать токены любых пользователей, открывавших этот URL-адрес, что давало ему доступ к их учетным записям на сайте Facebook. Кроме того, все официальные токены Facebook имели доступ к другим приложениям этой компании, таким как Instagram. В итоге Хэйрвуд мог аутентифицироваться на этих сайтах от имени жертвы.
При поиске уязвимостей обращайте внимание на ресурсы, о которых могли забыть владельцы сайта. Иногда это могут быть записи CNAME для поддоменов и зависимости приложений, такие как Ruby Gems, библиотеки jаvascript и т. д. Перед началом тестирования ставьте перед собой четкую цель. В ходе исследования крупного приложения это позволит не отвлекаться на проверку его бесчисленных аспектов.
Несмотря на то что процедура аутентификации OAuth является стандартизированной, разработчики могут допустить ошибку в ее конфигурации. Неочевидные уязвимости позволяют злоумышленнику похитить токены авторизации и получить доступ к конфиденциальным данным жертвы. Исследуя приложения с поддержкой OAuth, тщательно исследуйте параметр redirect_uri
, чтобы понять, несколько корректно приложение его проверяет при отправке токенов. Ищите нестандартные механизмы аутентификации на основе процедуры OAuth, которые подвержены уязвимостям. Если вам не удается найти ничего подозрительного, не забудьте проверить одобренные ресурсы. Возможно, разработчики забыли о каком-то приложении, которому клиент доверяет по умолчанию.
|
|