Пользователь
0,0
рейтинг
3 июля 2014 в 22:36

Разработка → Легальный Clickjacking ВКонтакте

Поговорим о виджете для авторизации.

Нам говорят, что:
С помощью виджета для авторизации Вы можете максимально просто предоставить пользователям возможность авторизовываться на Вашем ресурсе.

Также, нам говорят, что:
В результате авторизации виджет возвращает следующие поля: uid, first_name, last_name, photo, photo_rec, hash.


Рецепт:

1. Создаем приложение.
2. Добавляем виджет на наш сайт.
3. С помощью js заставляем его следовать за курсором.
4. С помощью css делаем его прозрачным.
5. Пользователь делает клик на странице.
6. ????????
7. PROFIT!

Для работы демо, вы должны быть авторизованы Вконтакте.

Демо

Я оставил полупрозрачность для лучшего понимания механики процесса. В реальной жизни значение opacity будет равно нулю.

Мне подумалось, что нехорошо данные о пользователях раздавать и я написал в службу поддержки.
Ответил мне некто Агент поддержки #920:

Это не уязвимость. Да и что в этом страшного?

Такая вот недокументированная возможность…
Вы считаете, что это

Проголосовало 3123 человека. Воздержалось 625 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

@truezemez
карма
93,5
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (51)

  • +6
    злоумышленник может использовать это для социального взлома.
    ну или для недобросовестной рекламы.
    «Ваш друг Василий Петрович уже купил нашу кофеварку, а Мария Петровна очень хочет получить такую в подарок.»
    • 0
      Это уже делается, к примеру посмотрите что за собой тащит код PLUSO (минимум 3 системы статистики)
    • +1
      Теоретически, у реклаы с направленностью на конкретного человека может быть вообще весьма неплохая эффективность. Я ещё несколько лет назад размышлял на эту тему, и, в частности, думал вот о каком примере. Допустим, человек пользуется сайтом, куда загрузил несколько своих фотографий. На этом веб-сервисе рекламируется какой-то сайт или услуга. И на рекламной картинке (баннере) оказывается одна из фотографий пользователя. Она может быть отображена там как угодно: стоящая в рамке, лежащая на столе в куче других фоток, прикрепленная магнитом на whiteboard — в общем, простор для фантазии. Рекламировать так можно, наверно, что угодно: ноут/монитор/телефон/КПК/фоторамка — фотка на экране, книга — фотка вставлена в качестве закладки. И так далее. А пользователь заинтересуется, почему вдруг его фотка попала на баннер — и пройдёт по ссылке.

      Ну, а тут, фактически, то же самое, только ещё проще: поскольку пропускаем шаг с регистрацией и загрузкой каких-либо фотографий (впрочем, загрузка фотографий и без таких уязвимостей не столь уж обязательна для такой рекламы: фотографии часто можно автоматически получить из других источников в Интернете по указанным при регистрации данным).
      • 0
        Или ещё лучше: в рекламе отображается картинка с монитора пользователя realtime
  • +3
    Помнится была похожая тема с двумя кубиками (красный и синий/зелёный?), под видом проверки на робота, делался лайк и «рассказать друзьям».
  • +17
    По нормальному тут должен быть запрос на разрешение доступ к своим данным приложению, так что это никак не фича, а, скорее всего, уязвимость.
    • –1
      Он так и работает. Пользователь щелкает на кнопку (прозрачную или непрозрачную). Открывается отдельный большой красивый iframe, в котором пользователь должен подтвердить, что хочет предоставить свои данные сайту.
      Так что с помощью этой «уязвимости» можно заставить пользователя сделать щелчок по кнопке, но нельзя получить его данные, не поставив его в известность. В отличие от виджета «мне нравится», который никакого доступа не спрашивает.

      UPD: если пользователь уже нажимал кнопку «предоставить данные этому сайту», второй раз его об этом спрашивать не будут. Видимо из-за этого автор подумал, что авторизация прозрачная и посчитал это уязвимостью.
      • +7
        А вы по ссылке Демо (http://jsfiddle.net/Ej25j/) проходили? Я проходил, поменял apid, проверил на всякий случай, что в приложениях ВК нет jsfiddle и все равно сработало.
      • +10
        Проверил еще раз, действительно данные передаются сайту без запроса доступа. Раньше такого не было. На самом деле уязвимость, и довольно неприятная.
        • +1
          Я вот тоже зашел в настройки приложения, удалил (подумал, мало ли чего), но сработало опять, и в приложении прописалось что я дал доступ к публичной информации (чего я, естественно, не делал).
      • +1
        Я бы не писал, если бы получил такой iframe (вы сами-то пробовали?).
        vk.com/app4213269
        Вот это приложение использует автор поста, я не помню чтобы когда-то давал ему доступ, но пример сработал без iframe.
        • 0
          точно точно и ещё один баг — приложение не появляется в списке «Мои приложения» vk.com/apps?act=apps т.е. пользователь вообще никогда не узнает о этой проблеме. Сие однозначно уязвимость.
          • 0
            Оно там в «настройках» vk.com/apps?act=settings
            Уязвимость уже исправили, раньше не проверял, но сейчас её у меня нет:
            Зашел на jsfiddle.net/Ej25j кликнул, появилось окошко разрешения доступа к ВК, жму разрешить, появляется алерт с моим именем, а в vk.com/apps?act=settings приложение test, удаляю его и на jsfiddle.net при клике опять разрешение надо давать — все нормально.
            • 0
              Действительно, теперь вылазит попап. Правда у меня он выводит:

              {"error":"invalid_request","error_description":"Security Error"}
              

              А после его закрытия, алерт с моим именем все так же появляется.
              • 0
                а у меня попап вылезает и закрывается. дальше все срабатывает
                что надо почистить для чистого теста?
  • –7
    Итак, мы получили id юзера ВК, имя, фамилию, фото и md5 от всего этого (с секретным ключом нашего приложения). И что дальше? Это открытые данные, не дающие доступ ни к чему. Разве что легкий налет деанонимайза.
    • +12
      Получить список его друзей, добавить связи, и при посещении сайта сделайть фейковые отзывы с фотками его друзей. Подло, но мы же говорим о последствиях…
      • 0
        Разве приложение не должно запрашивать доступ к связям на отдельной страничке?
        • +5
          friends.get, users.get, photos.get — Это открытые методы, не требующие access_token.
        • +2
    • +4
      Это публичная инфа, но она ни к кому не привязана. А вот когда пользователь заходит на твой сайт, а ты без его ведома получаешь его аккаунты из ВК, ОК, яндекса и мейла, включая всю открытую информацию — то это уже совершенно другое дело. Сразу же открываются новые векторы, как для атак, так и для привлечения пользователя к сайту.
  • +9
    Зашел на демо с Ghostery со всем активными блокировками, долго думал, почему демо не работает…
    • +31
      NoScript реагирует ну очень адекватно.
      • 0
        А есть для фф способ защиты от clickjacking'а, но без установки noscript? (не хочу блокировать скрипты)
        • +3
          Не блокируйте. Его можно настроить так, чтобы использовать только определённые виды защиты.
    • +3
      У меня уже привычка — если что-то не работает, проверить HTTPS Everywhere, Ghostery и ABP. Так что виновник был найден быстро. :)
  • –4
    Мышка из стрелочки превращается в «руку» (потому что под ней всегда кнопка, пусть даже и прозрачная).

    Продвинутого пользователя это должно наводить на «мысли».
    • +6
      ну вот это вообще не проблема поправить.
      • 0
        Хмм, так это же `iframe` на другом домене — никакие стили внутрь не пробросить, из основной страницы также нельзя присвоить. Какой же способ есть?
        • +2
          Курсор действительно не заменить, но можно же подставлять этот виджет только под ссылки или кнопки (если мышка над ссылкой, передвинуть туда виджет).
          • 0
            «Так то оно так», но здесь явно просматривается каскад проблем. А про каскад проблем при проектировании можно писать большие статьи. Но в любом случае, как я могу видеть данная проблема решается лишь на самом верхнем уровне: уровне концепта, то это явно очень большая проблема. Конечно, это возможно не в этой ситуации, но при реальном проекте — это было бы, можно сказать, катастрофическая трудность. Я просто уже много раз слышал фразу «это вообще не проблема поправить», а потом оказывается что, утрирую, нужно пол проекта перелопатить.
        • 0
          Можно, например, попробовать еще один прозрачный элемент сверху с pointer-events:none; cursor:default;
          • 0
            Ничего не получится — насколько могу помнить, у элементов с `pointer-events:none` игнорируется значение `cursor`.
  • 0
    так всегда и было как мне кажется

    в виджете видны твои друзья в топе

    и вся публичная инфа о тебе известна без предупреждения

    image
    • +2
      Их из виджета не выцепить, если я не ошибаюсь. И сайту, соответственно, неизвестно, кто ты и кто твои друзья. В отличие от входа на сайт «через вк».
      • +23
        Вытаскивать инфу может и не потребоваться. Достаточно, например, создать видимость, что твой знакомый положительно отозвался о товаре. А это можно сделать, например, наложив интерфейс поверх виджета:
  • +16
    [irony]Какой интересный метод собрать информацию о хабражителях[/irony]
  • +1
    При Павле Дурове такого не было!

    P.S. Получается, можно узнать какие персоны посещали твой сайт о_О
    • +7
      Ну все, теперь на сайте онлайн заявки ТКС банка после любого клика на странице начнут писать ВКонтакте следующее «Здравствуйте, вы начали заполнять заявку на кредитную карту, но не завершили и т. д.»

      Кто не в теме — когда тыкал ради интереса их форму, вбил пару полей и закрыл вкладку — мне начали присылать email-ы и даже звонили. Оказалось, они ajax-ом отправляли все что введено в поля.
  • +5
    Оказывается, это используется уже давно. Пара цитат с сайта одного сервиса:

    Сервис является первым полностью автоматизированным поставщиком потенциальных клиентов из социальной сети ВКонтакте. Он не только раскрывает личность посетителей сайтов и собирает общедоступную информацию о них в Интернете, но и предоставляет инструменты для взаимодействия с аудиторией в социальных сетях. Все это позволяет использовать новые подходы к продажам в сети, обеспечивать высокий персональный уровень сервиса для клиентов.

    Сервис был основан в конце 2012 года для личных целей группы специалистов в интернет-рекламе и маркетинге.
    • 0
      Ссылку на сервис? Можно в личку.
      • 0
        Он гуглится по первому предложению.
  • +1
    Гугл реклама, да и всё что угодно во фрейме так накручивается уже очень много лет.
  • +1
    Можно я скажу что хабр иногда торт, а вы меня не будете минусить?)
    • +1
      Если вам понравился пост, достаточно просто поставить плюсик.
  • 0
    Изгалялся как мог, но пример в обязательном порядке выкидывал окно от ВК с предупреждением о том, что приложение test хочет получить доступ…
    Все таки закрыли этот путь?
    • 0
      У меня даже если дать доступ, дальше ничего «полезного» не происходит.
      • 0
        Скорее всего, за год успели внести изменения со стороны ВК.
    • 0
      Сейчас вроде делают через кнопку лайка, после чего смотрится список пользователей, кто лайкнул запись/фото/и т.п. Или это тоже учитывали?
  • 0
    Если что, то тут уже Яндекс отреагировал yandex.ru/blog/webmaster/21745 (Как кликджекинг влияет на ранжирование)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.