# XS-Search/XS-Leaks {{#include ../banners/hacktricks-training.md}} ## Osnovne Informacije XS-Search je metoda koja se koristi za **izvlačenje informacija sa različitih domena** koristeći **bočne kanale ranjivosti**. Ključne komponente uključene u ovaj napad su: - **Ranjivi Web**: Ciljna veb stranica sa koje se informacije žele izvući. - **Napadačev Web**: Zloćudna veb stranica koju je kreirao napadač, koju žrtva posećuje, a koja sadrži eksploataciju. - **Metod Uključivanja**: Tehnika koja se koristi za uključivanje Ranjivog Web-a u Napadačev Web (npr., window.open, iframe, fetch, HTML tag sa href, itd.). - **Tehnika Curjenja**: Tehnike koje se koriste za uočavanje razlika u stanju Ranjivog Web-a na osnovu informacija prikupljenih putem metode uključivanja. - **Stanja**: Dva potencijalna stanja Ranjivog Web-a koja napadač želi da razlikuje. - **Uočljive Razlike**: Opservabilne varijacije na koje se napadač oslanja da bi zaključio stanje Ranjivog Web-a. ### Uočljive Razlike Nekoliko aspekata može se analizirati kako bi se razlikovala stanja Ranjivog Web-a: - **Status Kod**: Razlikovanje između **različitih HTTP status kodova odgovora** sa različitih domena, kao što su greške servera, greške klijenta ili greške autentifikacije. - **Korišćenje API-ja**: Identifikacija **korišćenja Web API-ja** na stranicama, otkrivajući da li stranica sa različitih domena koristi određeni JavaScript Web API. - **Preusmeravanja**: Otkrivanje navigacija ka različitim stranicama, ne samo HTTP preusmeravanjima, već i onima koje pokreće JavaScript ili HTML. - **Sadržaj Stranice**: Posmatranje **varijacija u telu HTTP odgovora** ili u pod-resursima stranice, kao što su **broj ugnježdenih okvira** ili razlike u veličini slika. - **HTTP Header**: Zapažanje prisutnosti ili moguće vrednosti **određenog HTTP odgovora header-a**, uključujući header-e kao što su X-Frame-Options, Content-Disposition i Cross-Origin-Resource-Policy. - **Vreme**: Uočavanje doslednih vremenskih razlika između dva stanja. ### Metodi Uključivanja - **HTML Elementi**: HTML nudi različite elemente za **uključivanje resursa sa različitih domena**, kao što su stilovi, slike ili skripte, primoravajući pregledač da zatraži ne-HTML resurs. Kompilacija potencijalnih HTML elemenata za ovu svrhu može se naći na [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). - **Okviri**: Elementi kao što su **iframe**, **object** i **embed** mogu direktno ugraditi HTML resurse u napadačevu stranicu. Ako stranica **nema zaštitu od uokvirivanja**, JavaScript može pristupiti objektu prozora u okviru putem svojstva contentWindow. - **Iskočne prozore**: Metod **`window.open`** otvara resurs u novoj kartici ili prozoru, pružajući **handle prozora** za JavaScript da komunicira sa metodama i svojstvima prema SOP-u. Iskočni prozori, često korišćeni u jedinstvenom prijavljivanju, zaobilaze ograničenja uokvirivanja i kolačića ciljanog resursa. Međutim, moderni pregledači ograničavaju kreiranje iskočnih prozora na određene korisničke akcije. - **JavaScript Zahtevi**: JavaScript omogućava direktne zahteve ka ciljnim resursima koristeći **XMLHttpRequests** ili **Fetch API**. Ove metode nude preciznu kontrolu nad zahtevom, kao što je opcija da se prati HTTP preusmeravanje. ### Tehnike Curjenja - **Handler Događaja**: Klasična tehnika curenja u XS-Leaks, gde handler-i događaja kao što su **onload** i **onerror** pružaju uvide o uspehu ili neuspehu učitavanja resursa. - **Poruke o Greškama**: JavaScript izuzeci ili posebne stranice o greškama mogu pružiti informacije o curenju ili direktno iz poruke o grešci ili razlikovanjem između njene prisutnosti i odsutnosti. - **Globalna Ograničenja**: Fizička ograničenja pregledača, kao što su kapacitet memorije ili druga nametnuta ograničenja pregledača, mogu signalizirati kada je dostignut prag, služeći kao tehnika curenja. - **Globalno Stanje**: Uočljive interakcije sa **globalnim stanjima** pregledača (npr., interfejs Istorije) mogu se iskoristiti. Na primer, **broj unosa** u istoriji pregledača može pružiti tragove o stranicama sa različitih domena. - **Performanse API**: Ovaj API pruža **detalje o performansama trenutne stranice**, uključujući mrežno vreme za dokument i učitane resurse, omogućavajući zaključke o traženim resursima. - **Čitljiva Svojstva**: Neka HTML svojstva su **čitljiva sa različitih domena** i mogu se koristiti kao tehnika curenja. Na primer, svojstvo `window.frame.length` omogućava JavaScript-u da prebroji okvire uključene u veb stranicu sa različitih domena. ## XSinator Alat i Rad XSinator je automatski alat za **proveru pregledača protiv nekoliko poznatih XS-Leaks** objašnjenih u njegovom radu: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) Možete **pristupiti alatu na** [**https://xsinator.com/**](https://xsinator.com/) > [!WARNING] > **Isključeni XS-Leaks**: Morali smo isključiti XS-Leaks koji se oslanjaju na **servisne radnike** jer bi ometali druge curenja u XSinator-u. Pored toga, odlučili smo da **isključimo XS-Leaks koji se oslanjaju na pogrešne konfiguracije i greške u specifičnoj veb aplikaciji**. Na primer, pogrešne konfiguracije CrossOrigin Resource Sharing (CORS), curenje postMessage ili Cross-Site Scripting. Takođe, isključili smo vremenski zasnovane XS-Leaks jer često pate od sporosti, buke i netačnosti. ## **Tehnike zasnovane na vremenu** Neke od sledećih tehnika će koristiti vreme kao deo procesa za otkrivanje razlika u mogućim stanjima veb stranica. Postoje različiti načini za merenje vremena u veb pregledaču. **Sati**: [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API omogućava programerima da dobiju merenja vremena visoke rezolucije.\ Postoji značajan broj API-ja koje napadači mogu zloupotrebiti za kreiranje implicitnih satova: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS animacije i drugi.\ Za više informacija: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/). ## Tehnike Handler-a Događaja ### Onload/Onerror - **Metodi Uključivanja**: Okviri, HTML Elementi - **Uočljiva Razlika**: Status Kod - **Više informacija**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **Sažetak**: Ako pokušavate da učitate resurs, onerror/onload događaji se aktiviraju kada je resurs učitan uspešno/neuspešno, moguće je utvrditi status kod. - **Primer koda**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} xs-search/cookie-bomb-+-onerror-xs-leak.md {{#endref}} Primer koda pokušava da **učita skripte iz JS**, ali **drugi tagovi** kao što su objekti, stilovi, slike, audio takođe mogu biti korišćeni. Štaviše, takođe je moguće direktno injektovati **tag** i deklarisati `onload` i `onerror` događaje unutar taga (umesto da ih injektujete iz JS). Postoji takođe verzija ovog napada bez skripti: ```html ``` U ovom slučaju, ako `example.com/404` nije pronađen, učitaće se `attacker.com/?error`. ### Onload Timing - **Metode uključivanja**: HTML elementi - **Uočljiva razlika**: Vreme (generalno zbog sadržaja stranice, status koda) - **Više informacija**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) - **Sažetak:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** može se koristiti za merenje koliko vremena je potrebno za izvršavanje zahteva. Međutim, mogu se koristiti i drugi satovi, kao što je [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) koji može identifikovati zadatke koji traju duže od 50ms. - **Primer koda**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) još jedan primer u: {{#ref}} xs-search/performance.now-example.md {{#endref}} #### Onload Timing + 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. {{#ref}} xs-search/performance.now-+-force-heavy-task.md {{#endref}} ### unload/beforeunload Timing - **Metode uključivanja**: Okviri - **Uočljiva razlika**: Vreme (generalno zbog sadržaja stranice, status koda) - **Više informacija**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Sažetak:** [SharedArrayBuffer sat](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) može se koristiti za merenje koliko vremena je potrebno za izvršavanje zahteva. Mogu se koristiti i drugi satovi. - **Primer koda**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) Vreme potrebno za preuzimanje resursa može se meriti korišćenjem [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) i [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) događaja. **`beforeunload`** događaj se aktivira kada se pregledač sprema da pređe na novu stranicu, dok se **`unload`** događaj dešava kada se navigacija zapravo odvija. Vremenska razlika između ova dva događaja može se izračunati kako bi se odredila **dužina vremena koje je pregledač potrošio na preuzimanje resursa**. ### Sandboxed Frame Timing + onload - **Metode uključivanja**: Okviri - **Uočljiva razlika**: Vreme (generalno zbog sadržaja stranice, status koda) - **Više informacija**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) - **Sažetak:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API može se koristiti za merenje koliko vremena je potrebno za izvršavanje zahteva. Mogu se koristiti i drugi satovi. - **Primer koda**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) Primećeno je da u odsustvu [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/), vreme potrebno za učitavanje stranice i njenih podresursa preko mreže može meriti napadač. Ova merenja su obično moguća jer se `onload` handler iframe-a aktivira tek nakon završetka učitavanja resursa i izvršavanja JavaScript-a. Da bi se zaobišla varijabilnost koju uvodi izvršavanje skripti, napadač može koristiti [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) atribut unutar ` ``` ### #ID + error + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary**: Ako možete izazvati grešku na stranici kada se pristupi ispravnom sadržaju i učiniti da se učita ispravno kada se pristupi bilo kojem sadržaju, onda možete napraviti petlju da izvučete sve informacije bez merenja vremena. - **Code Example**: 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** (na primer, eksploatacijom CSRF-a). Unutar Iframe-a znate da će se _**onload događaj**_ **izvršiti uvek barem jednom**. Tada možete **promeniti** **URL** **iframe-a** menjajući samo **sadržaj** **hash-a** unutar URL-a. Na primer: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 Ako je prvi URL **uspešno učitan**, tada, kada **promenite** deo **hash-a** URL-a, **onload** događaj **neće biti ponovo aktiviran**. Ali **ako** je stranica imala neku vrstu **greške** prilikom **učitavanja**, tada će se **onload** događaj **ponovo aktivirati**. Tada možete **razlikovati** između **ispravno** učitane stranice ili stranice koja ima **grešku** kada se pristupi. ### Javascript Execution - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary:** 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**, **učitavajući** svaki pokušaj unutar **`