Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da lako izgradite i **automatizujete radne tokove** pokretane najnaprednijim alatima zajednice na svetu.\
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
* **Ranjiva Veb Stranica**: Ciljna veb stranica sa koje se namerava izvući informacija.
* **Veb Napadača**: Zlonamerna veb stranica kreirana od strane napadača, koju žrtva posećuje, na kojoj se nalazi eksploatacija.
* **Metod Uključivanja**: Tehnika koja se koristi za uključivanje Ranjive Veb Stranice u Veb Napadača (npr. window.open, iframe, fetch, HTML oznaka sa href, itd.).
* **Tehnika Procurenja**: Tehnike korišćene za razlikovanje razlika u stanju Ranjive Veb Stranice na osnovu informacija prikupljenih putem metoda uključivanja.
* **Stanja**: Dva potencijalna stanja Ranjive Veb Stranice, koja napadač pokušava razlikovati.
* **Detektovive Razlike**: Opservabilne varijacije na koje se napadač oslanja da bi zaključio stanje Ranjive Veb Stranice.
* **Statusni Kod**: Razlikovanje između **različitih HTTP odgovora statusnih kodova** preko granica porekla, kao što su serverske greške, klijentske greške ili autentikacione greške.
* **Korišćenje API-ja**: Identifikacija **korišćenja Web API-ja** preko stranica, otkrivanje da li preko granica porekla stranica koristi određeni JavaScript Web API.
* **Preusmeravanja**: Detektovanje navigacija ka različitim stranicama, ne samo HTTP preusmeravanja već i onih pokrenutih JavaScript-om ili HTML-om.
* **Sadržaj Stranice**: Opservacija **varijacija u telu HTTP odgovora** ili u pod-resursima stranice, kao što su **broj ugrađenih okvira** ili veličinske razlike u slikama.
* **HTTP Zaglavlje**: Primećivanje prisustva ili možda vrednosti **specifičnog HTTP odgovora zaglavlja**, uključujući zaglavlja poput X-Frame-Options, Content-Disposition, i Cross-Origin-Resource-Policy.
* **Vreme**: Primećivanje konzistentnih vremenskih razlika između dva stanja.
* **HTML Elementi**: HTML nudi različite elemente za **uključivanje resursa preko granica porekla**, kao što su stilovi, slike, ili skripte, prisiljavajući pretraživač 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 poput **iframe**, **object**, i **embed** mogu direktno ugraditi HTML resurse u stranicu napadača. Ako stranica **nema zaštitu okvira**, JavaScript može pristupiti window objektu ugrađenog resursa putem contentWindow svojstva.
* **Iskačući Prozori**: Metoda **`window.open`** otvara resurs u novom tabu ili prozoru, pružajući **ručku prozora** za JavaScript da interaguje sa metodama i svojstvima prateći SOP. Iskačući prozori, često korišćeni u jednokratnoj prijavi, zaobilaze ograničenja okvira i kolačića ciljnog resursa. Međutim, moderni pretraživači ograničavaju kreiranje iskačućih prozora na određene korisničke akcije.
* **JavaScript Zahtevi**: JavaScript dozvoljava direktno zahteve ka ciljnim resursima korišćenjem **XMLHttpRequests** ili **Fetch API-ja**. Ove metode nude preciznu kontrolu nad zahtevom, kao što je opcija da se prate HTTP preusmeravanja.
* **Rukovalac Događajima**: Klasika tehnika procurenja u XS-Procurama, gde rukovaoci događajima poput **onload** i **onerror** pružaju uvide o uspehu ili neuspehu učitavanja resursa.
* **Poruke o Greškama**: JavaScript izuzeci ili posebne stranice grešaka mogu pružiti informacije o procurivanju ili razlikovanju između prisustva i odsustva greške.
* **Globalna Ograničenja**: Fizička ograničenja pretraživača, poput kapaciteta memorije ili drugih nametnutih ograničenja pretraživača, mogu signalizirati kada je dostignut prag, služeći kao tehnika procurivanja.
* **Globalno Stanje**: Detektovive interakcije sa **globalnim stanjima pretraživača** (npr. History interfejs) mogu biti iskorišćene. Na primer, **broj unosa** u istoriju pretraživača može pružiti tragove o stranicama preko granica porekla.
* **Performance 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.
* **Čitljivi Atributi**: Neki HTML atributi su **čitljivi preko granica porekla** i mogu se koristiti kao tehnika procurivanja. Na primer, svojstvo `window.frame.length` omogućava JavaScript-u da prebroji okvire uključene na veb stranici preko granica porekla.
XSinator je automatski alat za **proveru pretraživača protiv nekoliko poznatih XS-Procura** objašnjenih u njegovom radu: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf)
**Isključeni XS-Procuri**: Morali smo isključiti XS-Procuri koji se oslanjaju na **servisne radnike** jer bi ometali druge procure u XSinatoru. Takođe, odlučili smo da **isključimo XS-Procuri koji se oslanjaju na loše konfiguracije i greške u određenoj veb aplikaciji**. Na primer, loše konfiguracije Cross-Origin Resource Sharing (CORS), procurivanje putem postMessage-a ili Cross-Site Scripting. Dodatno, isključili smo XS-Procuri zasnovane na vremenu jer često imaju problema sa sporim, bučnim i netačnim karakteristikama.
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da lako izgradite i **automatizujete radne tokove** pokretane najnaprednijim alatima zajednice na svetu.\
Neke od sledećih tehnika koristiće vreme kao deo procesa za otkrivanje razlika u mogućim stanjima web stranica. Postoje različiti načini merenja vremena u web pregledaču.
**Satovi**: API [performance.now()](https://developer.mozilla.org/en-US/docs/Web/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 kreirali implicitne satove: [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.\
* **Rezime**: Ako se pokuša učitavanje resursa i događaji onerror/onload se pokrenu kada se resurs uspešno/neuspešno učita, moguće je saznati statusni kod.
Primer koda pokušava da **učita objekte skriptova iz JS-a**, ali se mogu koristiti i **drugi tagovi** poput objekata, stilova, slika, zvukova. Takođe, moguće je direktno ubaciti **tag** i deklarisati događaje `onload` i `onerror` unutar taga (umesto da se ubacuje iz JS-a).
* **Rezime:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** se može koristiti za merenje vremena potrebnog za izvršavanje zahteva. Međutim, mogu se koristiti i drugi časovnici, poput [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) koji može identifikovati zadatke koji se izvršavaju 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:
Ova tehnika je slična prethodnoj, ali će **napadač** takođe **prisiliti** neku akciju da traje **relevantno dugo vreme** kada je **odgovor pozitivan ili negativan** i meriti to vreme.
* **Rezime:** [SharedArrayBuffer časovnik](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) se može koristiti za merenje vremena potrebnog za izvršavanje zahteva. Mogu se koristiti i drugi časovnici.
Vreme potrebno za preuzimanje resursa može se meriti korišćenjem događaja [`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đaj **`beforeunload`** se pokreće kada se pregledač sprema da pređe na novu stranicu, dok se događaj **`unload`** dešava kada se navigacija zapravo odvija. Razlika u vremenu između ova dva događaja može se izračunati kako bi se odredilo **koliko je vremena pregledač proveo preuzimajući resurs**.
* **Rezime:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API se može koristiti za merenje vremena potrebnog za izvršavanje zahteva. Mogu se koristiti i drugi časovnici.
Primećeno je da u odsustvu [Zaštitnih okvira](https://xsleaks.dev/docs/defenses/opt-in/xfo/), 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 iframe-a pokreće tek nakon završetka učitavanja resursa i izvršavanja JavaScript-a. Da bi zaobišli varijabilnost uvedenu izvršavanjem skripti, napadač može koristiti atribut [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) unutar `<iframe>`. Uključivanje ovog atributa ograničava brojne funkcionalnosti, posebno izvršavanje JavaScript-a, čime se olakšava merenje koje je pretežno uticano performansama mreže.
* **Sažetak**: Ako možete da izazovete grešku na stranici kada se pristupi ispravnom sadržaju i da je pravilno učitate kada se pristupi bilo kom sadržaju, tada možete napraviti petlju za izvlačenje svih informacija bez merenja vremena.
Možete **naterati žrtvu da traži** datoteku koja sadrži "_**flag**_" koristeći **Iframe** (na primer, iskorišćavanjem CSRF-a). Unutar Iframe-a znate da će se _**onload događaj**_ uvek **izvršiti barem jednom**. Zatim možete **promeniti****URL** Iframe-a, ali menjajući samo **sadržaj****hash-a** unutar URL-a.
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**.
* **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 **učitati** svaki pokušaj unutar **`<script>`** oznaka, tako da se u **negativnim** slučajevima izvršava **kod** napadača, a u **afirmativnim** slučajevima **ništa** neće biti izvršeno.
* **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štitili 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** (ukazujući na uspeh ili grešku) i `Content-Type` (označavajući da li je zaštićen **CORB**-om), što može dovesti do potencijalnog otkrivanja informacija.
Moguće je **učitati stranicu** unutar **iframe-a** i koristiti **`#id_vrednost`** da bi se stranica **usredsredila na element** iframe-a sa naznačenim id-om, zatim ako je **`onblur`** signal pokrenut, ID element postoji.\
Možete izvesti isti napad sa **`portal`** oznakama.
* **Sažetak**: Prikupljanje osetljivih informacija putem postMessage ili korišćenje prisustva postMessages kao orakla da bi se znalo stanje korisnika na stranici
* **Primer koda**: `Bilo koji kod koji sluša sve postMessages.`
Aplikacije često koriste [`postMessage` emitovanja](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) za komunikaciju između različitih izvora. Međutim, ovaj metod može nenamerno otkriti **osetljive informacije** ako parametar `targetOrigin` nije pravilno naveden, omogućavajući bilo kojem prozoru da primi poruke. Osim toga, samo primanje poruke može delovati kao **orakl**; 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**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da lako kreirate i **automatizujete radne tokove** pomoću najnaprednijih alata zajednice na svetu.\
Moguće je identifikovati da li, i koliko, **WebSocket veza ciljna stranica 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 veze, bez obzira na njihovo stanje veze, kreiranje **novih objekata rezultiraće JavaScript izuzecima**. Da bi izveo ovaj napad, napadačka veb lokacija otvara ciljnu veb lokaciju u iskačućem prozoru ili iframe-u, a zatim, nakon što je ciljna veb stranica učitana, pokušava da kreira maksimalan broj mogućih WebSocket veza. **Broj bačenih izuzetaka** je **broj WebSocket veza koje koristi ciljna veb lokacija** prozora.
Pošto **može biti aktivan samo jedan zahtev za plaćanje** u isto vreme, ako ciljana veb lokacija koristi Payment Request API, svaki **dalji pokušaj korišćenja ovog API-ja će propasti**, i izazvati **JavaScript izuzetak**. Napadač može iskoristiti ovo tako što će **periodično pokušavati da prikaže Payment API UI**. Ako jedan pokušaj izazove izuzetak, ciljana veb lokacija trenutno ga koristi. Napadač može sakriti ove periodične pokušaje tako što će odmah zatvoriti UI nakon kreiranja.
JavaScript funkcioniše na [jednonitnom modelu konkurentnosti petlje događaja](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop), što znači da **može izvršavati samo jedan zadatak u isto vreme**. Ova karakteristika može biti iskorišćena da se utvrdi **koliko vremena kod sa različitog porekla zahteva za izvršavanje**. Napadač može meriti vreme izvršavanja svog koda u petlji događaja kontinuiranim slanjem događaja sa fiksnim svojstvima. Ti 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 potrebno za izvršavanje tih spoljnih događaja posmatrajući kašnjenja u izvršavanju svojih 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.
Prilikom merenja vremena izvršavanja moguće je **eliminisati****mrežne faktore** kako bi se dobile **preciznije merenja**. Na primer, učitavanjem resursa korišćenih od strane stranice pre njenog učitavanja.
* **Rezime**: Jedan metod za merenje 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 (kao što je dugotrajno računanje ili sinhroni API poziv) u petlju događaja, i praćenjem vremena potrebnog za početak izvršavanja sledećeg koda, može se zaključiti trajanje zadataka koji su se izvršavali u petlji događaja tokom blokiranog perioda. Ova tehnika koristi jednonitnu prirodu JavaScript-ove petlje događaja, gde se zadaci izvršavaju sekvencijalno, i može pružiti uvid u performanse ili ponašanje drugih operacija koje dele istu nit.
Značajna prednost tehnike merenja vremena izvršavanja zaključavanjem petlje događaja je njena sposobnost da zaobiđe **Izolaciju sajta**. **Izolacija sajta** je bezbednosna funkcija koja razdvaja različite veb lokacije u odvojene procese, sa ciljem da spreči zlonamerne sajtove da direktno pristupe osetljivim podacima drugih sajtova. Međutim, uticajem na vreme izvršavanja druge lokacije kroz deljenu petlju događaja, napadač može indirektno izvući informacije o aktivnostima te lokacije. Ova metoda ne oslanja se na direktni pristup podacima druge lokacije, već posmatra uticaj aktivnosti te lokacije na deljenu petlju događaja, čime izbegava zaštitne barijere uspostavljene od strane **Izolacije sajta**.
Prilikom merenja vremena izvršavanja moguće je **eliminisati****mrežne faktore** kako bi se dobile **preciznije merenja**. Na primer, učitavanjem resursa korišćenih od strane stranice pre njenog učitavanja.
* **Rezime**: Napadač može blokirati sve priključke osim jednog, učitati ciljnu veb stranicu i istovremeno učitati drugu stranicu, vreme dok se poslednja stranica počne učitavati je vreme koje je ciljna stranica uzela za učitavanje.
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 (kako je navedeno u koracima 2 i 3), ovaj zahtev će biti stavljen u red čekanja dok priključak ne postane dostupan. Kašnjenje pre nego što ovaj zahtev nastavi pruža napadaču informacije o vremenskim aktivnostima na mreži povezanim sa 256. priključkom (priključkom ciljne stranice). Ova zaključivanja su moguća jer su 255 priključaka iz koraka 2 i dalje angažovani, što implicira da svaki novi dostupan priključak mora biti onaj oslobođen iz koraka 3. Vreme potrebno da 256. priključak postane dostupan direktno je povezano sa vremenom potrebnim za završetak zahteva ka ciljnoj stranici.
Za više informacija: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) pruža uvide u metrike performansi veb aplikacija, dodatno obogaćene [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource\_Timing\_API). Resource Timing API omogućava praćenje detaljnih vremena mrežnih zahteva, poput trajanja zahteva. Važno je napomenuti da kada serveri uključe zaglavlje `Timing-Allow-Origin: *` u svojim odgovorima, dodatni podaci poput veličine prenosa i vremena pretrage domena postaju dostupni.
Ova obilje podataka može se dobiti putem metoda poput [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ili [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), pružajući sveobuhvatan pregled informacija vezanih za performanse. Dodatno, API olakšava merenje vremena izvršavanja računanjem razlike između vremenskih oznaka dobijenih iz [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Međutim, važno je 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.
Osim merenja vremena, Performance API se može iskoristiti za uvide vezane za bezbednost. Na primer, prisustvo ili odsustvo stranica u objektu `performance` u Chrome-u može ukazivati na primenu `X-Frame-Options`. Konkretno, ako je stranica blokirana za prikazivanje u okviru zbog `X-Frame-Options`, neće biti zabeležena u objektu `performance`, pružajući suptilan trag o politikama uokvirivanja stranice.
U prethodnoj tehnici takođe su identifikovana dva slučaja gde greške u pregledaču u GC dovode do **ponovnog učitavanja resursa kada ne uspeju da se učitaju**. To će rezultirati višestrukim unosima u Performance API-ju i može se detektovati.
Tehnika je pronađena u tabeli u pomenutom radu, ali nije pronađen opis tehnike. Međutim, možete pronaći izvorni kod koji proverava to na [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
Napadač može da otkrije da li je zahtev rezultirao praznim telom HTTP odgovora jer **prazne stranice ne stvaraju unos performansi u nekim pregledačima**.
* **Sažetak:** Korišćenjem XSS Auditor-a u Sigurnosnim Tvrdnjama, napadači mogu otkriti specifične elemente veb stranice posmatrajući promene u odgovorima kada izrađeni payload-ovi pokrenu mehanizam filtriranja auditora.
U Sigurnosnim Tvrdnjama (SA), XSS Auditor, prvobitno namenjen sprečavanju napada Cross-Site Scripting (XSS), paradoksalno može biti iskorišćen za curenje osetljivih informacija. Iako je ova ugrađena funkcija uklonjena iz Google Chrome-a (GC), još uvek je prisutna u SA. 2013. godine, Braun i Heiderich su demonstrirali da XSS Auditor može nenamerno blokirati legitimne skripte, dovodeći do lažnih pozitiva. Na osnovu toga, istraživači su razvili tehnike za izvlačenje informacija i otkrivanje specifičnog sadržaja na stranicama preko granica porekla, koncept poznat kao XS-Curenja, inicijalno prijavljeno od strane Terada i razrađeno od strane Heyes-a 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 Auditor-a ne generišu unose u Performance API-ju, otkrivajući metod putem kojeg osetljive informacije i dalje mogu biti curenje.
Ako stranica **nije dozvoljena** da se **prikazuje** u **iframe-u**, neće kreirati unos performansi. Kao rezultat, napadač može otkriti zaglavlje odgovora **`X-Frame-Options`**.\
Slično kao kod opisanog XS-Curenja, **resurs koji se preuzima** zbog zaglavlja ContentDisposition, takođe ne **stvara unos performansi**. Ova tehnika funkcioniše u svim glavnim pregledačima.
Otkrili smo jedan primer XS-Leak instance koji zloupotrebljava ponašanje nekih pregledača koji beleže previše informacija za zahteve sa različitih izvora. Standard definiše podskup atributa koji bi trebalo postaviti na nulu za resurse sa različitih 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**.
U GC-u, **trajanje** za zahteve koji rezultiraju **preusmeravanjem** je **negativno** i može se stoga **razlikovati** od zahteva koji ne rezultiraju preusmeravanjem.
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**. Imajte na umu da SA neće kreirati unos performansi uopšte za resurse omogućene sa CORP-om.
Servisni radnici su skriptni konteksti vođeni događajima koji se izvršavaju na izvoru. Oni se izvršavaju u pozadini web stranice i mogu presresti, izmeniti i **keširati resurse** kako bi kreirali offline web aplikaciju.\
Ako je **resurs keširan** od strane **servisnog radnika** i pristupljen putem **iframe-a**, resurs će biti **učitan iz keša servisnog radnika**.\
Da biste otkrili 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 sa napadom na vreme (proverite rad za više informacija).
Ova tehnika omogućava napadaču da **izvuče odredište preusmerenja sajta preko različitog porekla** iskorišćavajući način na koji Webkit bazirani pregledači obrađuju CORS zahteve. Konkretno, kada se **CORS omogućeni zahtev** pošalje ka ciljnom sajtu koji izdaje preusmerenje na osnovu korisničkog stanja i pregledač naknadno odbije zahtev, **puni URL cilja preusmerenja** se otkriva unutar poruke o grešci. Ova ranjivost ne samo da otkriva činjenicu preusmerenja već takođe otkriva i krajnju tačku preusmerenja i bilo koje **osetljive upitne parametre** koje može sadržati.
Napadač može iskoristiti **opsežne poruke o grešci** da zaključi veličinu odgovora sa različitog porekla. Ovo je moguće zbog mehanizma Integriteta Podresursa (SRI), koji koristi atribut integriteta da validira da resursi preuzeti, često sa CDN-ova, nisu izmenjeni. Da bi SRI radio na resursima sa različitog porekla, oni moraju biti **CORS omogućeni**; inače, nisu podložni proveri integriteta. U sigurnosnim tvrdnjama (SA), slično kao i kod CORS greške XS-Leak, poruka o grešci može biti uhvaćena nakon što fetch zahtev sa atributom integriteta ne uspe. Napadači mogu namerno **izazvati ovu grešku** dodeljivanjem **lažne vrednosti heša** atributu integriteta bilo kog zahteva. U SA, rezultirajuća poruka o grešci nenamerno otkriva dužinu sadržaja traženog resursa. Ovo curenje informacija omogućava napadaču da razlikuje varijacije u veličini odgovora, otvarajući put za sofisticirane XS-Leak napade.
* **Sažetak:** Dozvoljavanje samo sajta žrtve u CSP-u, ako pokušamo da pristupimo i preusmerimo ga na drugi domen, CSP će izazvati detektibilnu grešku.
XS-Leak može koristiti CSP da detektuje da li je sajt sa različitog porekla preusmeren na drugo poreklo. Ovo curenje može detektovati preusmerenje, ali dodatno, domen cilja preusmerenja curenje. Osnovna ideja ovog napada je **dozvoliti ciljni domen na sajtu napadača**. Kada se izda zahtev ka ciljnom domenu, on se **preusmerava** na domen sa različitog porekla. **CSP blokira** pristup tome i kreira **izveštaj o kršenju korišćen kao tehnika curenja**. Zavisno od pregledača, **ovaj izveštaj može otkriti ciljnu lokaciju preusmerenja**.\
Moderni pregledači neće pokazati URL na koji je preusmeren, ali možete i dalje detektovati da je preusmerenje sa različitog porekla pokrenuto.
Pregledači mogu koristiti jedan zajednički keš za sve sajtove. Bez obzira na njihovo poreklo, moguće je zaključiti da li je ciljna stranica **zahtevala određeni fajl**.
Ako stranica učitava sliku samo ako je korisnik prijavljen, možete **povući****resurs** (tako da više nije keširan ako jeste, pogledajte više informacija linkove), **izvršiti zahtev** koji bi mogao učitati taj resurs i pokušati učitati resurs **sa lošim zahtevom** (npr. koristeći predug referer zaglavlje). Ako učitavanje resursa **nije izazvalo nikakvu grešku**, to je zato što je bio **keširan**.
Nova funkcija u Google Chrome-u (GC) omogućava web stranicama da **predlože Content Security Policy (CSP)** postavljanjem atributa na element iframe, sa direktivama politike prenesenim zajedno sa HTTP zahtevom. Obično, ugrađeni sadržaj mora **autorizovati ovo putem HTTP zaglavlja**, ili će se prikazati **stranica sa greškom**. Međutim, ako je iframe već pod kontrolom CSP-a i nova predložena politika nije restriktivnija, stranica će se normalno učitati. Ovaj mehanizam otvara put napadaču da **detektuje specifične CSP direktive** sa stranice sa različitog porekla identifikujući stranicu sa greškom. Iako je ova ranjivost označena kao popravljena, naša istraživanja otkrivaju **novu tehniku curenja** sposobnu da detektuje stranicu sa greškom, sugerišući da osnovni problem nikada nije u potpunosti rešen.
CORP zaglavlje je relativno nova bezbednosna funkcija web platforme koja kada je postavljena **blokira no-cors cross-origin zahteve ka datom resursu**. Prisustvo zaglavlja može biti detektovano, jer će resurs zaštićen sa CORP **izbaciti grešku kada se preuzme**.
### CORS greška na konfiguraciji refleksije porekla <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
U slučaju kada se **zaglavlje Origin** reflektuje u zaglavlju `Access-Control-Allow-Origin`, napadač može iskoristiti ovu osobinu da pokuša **dobavljanje** resursa u **CORS** režimu. Ako **greška** nije izazvana, to znači da je resurs **ispravno preuzet sa veba**, a ako se pojavi 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 reflektuje već se koristi zamenski znak (`Access-Control-Allow-Origin: *`), ovo neće raditi.
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.
Napadač je sposoban da zaključi prisustvo zaglavlja Cross-Origin Opener Policy (COOP) u HTTP odgovoru preko granice. COOP se koristi od strane veb aplikacija da spreči spoljne sajtove da dobiju proizvoljne reference prozora. Vidljivost ovog zaglavlja može se uočiti pokušajem pristupa **referenci contentWindow**. U scenarijima gde se COOP primenjuje uslovno, **svojstvo opener** postaje pokazatelj: ono je **nedefinisano** kada je COOP aktivan, i **definisano** kada je odsutan.
* **Sažetak:** Otkrijte razlike u odgovorima zbog dužine odgovora preusmeravanja koja može biti prevelika da server odgovori sa greškom i generiše upozorenje.
Ako server-side preusmeravanje koristi **korisnički unos unutar preusmeravanja** i **dodatne podatke**, moguće je otkriti ovu osobinu jer obično **serveri** imaju **ograničenje dužine zahteva**. Ako je **korisnički podatak** te **dužine - 1**, jer se **preusmeravanje koristi tim podacima** i **dodaje** nešto **dodatno**, to će izazvati **grešku koja se može detektovati putem događaja greške**.
Ako na neki način možete postaviti kolačiće korisniku, možete takođe izvesti ovaj napad tako što ćete **postaviti dovoljno kolačića** ([**cookie bomba**](hacking-with-cookies/cookie-bomb.md)) tako da sa **povećanom veličinom odgovora****ispravnog odgovora** bude izazvana **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že se pronaći u planiranom rešenju ovog teksta: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
Prema [Chromium dokumentaciji](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url\_display\_guidelines/url\_display\_guidelines.md#URL-Length), maksimalna dužina URL-a u Chrome-u je 2MB.
> Uopšteno, _veb platforma_ nema ograničenja dužine URL-ova (mada je 2^31 često ograničenje). _Chrome_ ograničava URL-ove na maksimalnu dužinu od **2MB** iz praktičnih razloga i da bi izbegao probleme sa odbijanjem usluge u komunikaciji između procesa.
Stoga, ako je **URL preusmeravanja veći u jednom od slučajeva**, moguće je napraviti preusmeravanje sa **URL-om većim od 2MB** da bi se pogodilo **ograničenje dužine**. Kada se to desi, Chrome prikazuje stranicu **`about:blank#blocked`**.
**Zapažena razlika** je da ako je **preusmeravanje** bilo **završeno**, `window.origin` baca **grešku** jer preko granice porekla ne može pristupiti tim informacijama. Međutim, ako je **ograničenje** bilo **dostignuto** i učitana stranica je bila **`about:blank#blocked`**, `origin` prozora ostaje onaj od **roditelja**, što je **pristupačna informacija**.
Svi dodatni podaci potrebni za dostizanje **2MB** mogu se dodati putem **heša** u početnom URL-u tako da će biti **korišćeni u preusmeravanju**.
Ako je **maksimalni** broj **redirecta** koje pregledač može pratiti **20**, napadač može pokušati da učita svoju stranicu sa **19 redirecta** i na kraju **pošalje žrtvu** na testiranu stranicu. Ako se desi **greška**, to znači da je stranica pokušavala da **preusmeri žrtvu**.
**History API** omogućava JavaScript kodu da manipuliše istorijom pregledača, koja **čuva stranice koje je posetio korisnik**. Napadač može koristiti svojstvo dužine kao metodu uključivanja: da detektuje JavaScript i HTML navigaciju.\
Provera `history.length`, nateranje korisnika da **navigira** do stranice, **vrati** je na isti izvor i **provera** nove vrednosti **`history.length`**.
Napadač bi mogao koristiti JavaScript kod da **manipuliše lokacijom frejma/iskačućeg prozora na pretpostavljeni URL** i **odmah** je **promeniti u `about:blank`**. Ako se dužina istorije povećala, 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 pošto smo **odmah nakon toga** učitali **`about:blank`**, dužina istorije se **nikada nije povećala** prilikom učitavanja pretpostavljenog URL-a.
Brojanje **broja okvira na vebu** otvorenih putem `iframe` ili `window.open` može pomoći u identifikaciji **statusa korisnika na toj stranici**.\
Osim toga, ako stranica uvek ima isti broj okvira, provera **kontinuirano** broja okvira 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 okvira** jer se interna upotreba koristi `embed`. Postoje [Parametri otvorenog URL-a](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) koji omogućavaju određenu kontrolu nad sadržajem kao što su `zoom`, `view`, `page`, `toolbar`, gde bi ova tehnika mogla biti interesantna.
Procurenje informacija putem HTML elemenata predstavlja zabrinutost 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, menjajući veličinu medija. To može biti iskorišćeno od strane napadača da razlikuje moguća stanja analizirajući informacije izložene određenim HTML elementima.
* **HTMLMediaElement**: Ovaj element otkriva `duration` i `buffered` vreme medija, koje se mogu pristupiti putem njegovog API-ja. [Pročitajte više o HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
* **HTMLVideoElement**: Otkriva `videoHeight` i `videoWidth`. U nekim pregledačima, dodatna svojstva poput `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` i `webkitDecodedFrameCount` su dostupna, pružajući detaljnije informacije o sadržaju medija. [Pročitajte više o HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
* **getVideoPlaybackQuality()**: Ova funkcija pruža detalje o kvalitetu reprodukcije videa, uključujući `totalVideoFrames`, što može ukazivati na količinu obrađenih video podataka. [Pročitajte više o getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
* **HTMLImageElement**: Ovaj element otkriva `height` i `width` slike. Međutim, ako je slika nevažeća, ova svojstva će vratiti 0, a funkcija `image.decode()` će biti odbijena, ukazujući na neuspeh učitavanja slike na odgovarajući način. [Pročitajte više o HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
Veb aplikacije mogu promeniti **stilizovanje veb sajta u zavisnosti od statusa korisnika**. CSS fajlovi sa različitih izvora mogu biti ugrađeni na stranici napadača pomoću **HTML link elementa**, i **pravila** će biti **primenjena** na stranicu napadača. Ako stranica dinamički menja ova pravila, napadač može **detektovati** ove **razlike** u zavisnosti od korisničkog stanja.\
Kao tehniku procure, napadač može koristiti metod `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 `:visited` selektor se koristi za stilizovanje URL-ova na drugačiji način ako su ih korisnici prethodno posetili. Ranije je metoda `getComputedStyle()` mogla biti korišćena za identifikaciju ovih stilskih razlika. Međutim, moderni pregledači su implementirali sigurnosne mere kako bi sprečili da ova metoda otkrije stanje linka. Ove mere uključuju uvek vraćanje izračunatog stila kao da je link posećen i ograničavanje stilova koji se mogu primeniti sa selektorom `:visited`.
I pored ovih ograničenja, moguće je neizravno uočiti posećeno stanje linka. Jedna tehnika uključuje prevaru korisnika da interaguju 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, potencijalno otkrivajući posećeno stanje na osnovu korisničke interakcije.
Osim toga, detekcija može biti postignuta bez interakcije korisnika iskorišćavanjem vremena renderovanja linkova. Pošto pregledači mogu renderovati posećene i neposećene linkove na različite načine, ovo može uvesti merljivu razliku u vremenu renderovanja. Dokaz koncepta (PoC) je pomenut u izveštaju o bagu u Chromium-u, demonstrirajući ovu tehniku korišćenjem više linkova da pojača razliku u vremenu, čime se posećeno stanje može otkriti analizom vremena.
* **Sažetak:** U Google Chrome-u, posvećena greška se prikazuje kada je stranica blokirana za ugradnju na sajt preko različitog porekla zbog restrikcija X-Frame-Options.
U Chrome-u, ako je stranica sa zaglavljem `X-Frame-Options` postavljena na "deny" ili "same-origin" ugrađena kao objekat, pojavljuje se stranica greške. Chrome jedinstveno vraća prazan dokument objekat (umesto `null`) za svojstvo `contentDocument` ovog objekta, za razliku od iframova ili drugih pregledača. Napadači bi mogli iskoristiti ovo otkrivanjem praznog dokumenta, potencijalno otkrivajući informacije o stanju korisnika, posebno ako programeri nekonzistentno postavljaju zaglavlje X-Frame-Options, često previdjevajući stranice grešaka. Svest i dosledna primena sigurnosnih zaglavlja su ključne za sprečavanje takvih curenja.
Zaglavlje `Content-Disposition`, posebno `Content-Disposition: attachment`, instruiše pregledač da preuzme sadržaj umesto prikazivanja u liniji. 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 nekoliko tehnika za otkrivanje ovog ponašanja preuzimanja:
* Kada se datoteka preuzme u pregledačima zasnovanim na Chromium-u, traka preuzimanja se pojavljuje na dnu prozora pregledača.
* Praćenjem promena u visini prozora, napadači mogu zaključiti pojavu trake preuzimanja, sugerišući da je preuzimanje pokrenuto.
2.**Navigacija Preuzimanja sa Iframovima**:
* Kada stranica pokrene preuzimanje datoteke koristeći zaglavlje `Content-Disposition: attachment`, to ne izaziva događaj navigacije.
* Učitavanjem sadržaja u iframu i praćenjem događaja navigacije, moguće je proveriti da li uzrok dispozicije sadržaja izaziva preuzimanje datoteke (bez navigacije) ili ne.
3.**Navigacija Preuzimanja bez Iframova**:
* Slično kao tehnika sa iframe-om, ovaj metod uključuje korišćenje `window.open` umesto iframa.
* Praćenjem događaja navigacije u novootvorenom prozoru može se otkriti da li je pokrenuto preuzimanje datoteke (bez navigacije) ili je sadržaj prikazan u liniji (navigacija se dešava).
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.
Zato je ova tehnika interesantna: Chrome sada ima **particionisanje keša**, a ključ keša novootvorene stranice 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 različit**, tako da keš ne može biti deljen. Više detalja možete pronaći ovde: [Poboljšanje sigurnosti i privatnosti particionisanjem keša](https://developer.chrome.com/blog/http-cache-partitioning/)\
Ako sajt `primer.com` uključuje resurs sa `*.primer.com/resource` tada će taj resurs imati **isti ključ keša** kao da je resurs direktno **zahtevan kroz navigaciju na vrh nivoa**. To je zato što ključ keša čine _eTLD+1_ na vrhu i okvir _eTLD+1_.
Zbog toga što je pristup kešu brži od učitavanja resursa, moguće je pokušati promeniti lokaciju stranice i otkazati je 20ms (na primer) nakon toga. Ako je poreklo promenjeno nakon zaustavljanja, to znači da je resurs keširan.\
Ili jednostavno **poslati neki fetch ka potencijalno keširanoj stranici i meriti vreme koje je potrebno**.
* **Sažetak:** Moguće je pokušati učitati resurs i prekinuti učitavanje pre nego što se završi. Zavisno o tome da li je izazvana greška, resurs je ili nije keširan.
Koristite _**fetch**_ i _**setTimeout**_ sa **AbortController**-om kako biste detektovali da li je **resurs keširan** i kako biste uklonili određeni resurs iz keša pregledača. Osim toga, proces se odvija bez keširanja novog sadržaja.
### Skriptna zagađenost
* **Metode uključivanja**: HTML elementi (skripta)
* **Sažetak:** Moguće je **prepisati ugrađene funkcije** i pročitati njihove argumente čak i iz **skripte sa različitog porekla** (koja se ne može direktno pročitati), što može **procuriti vredne informacije**.
U datom scenariju, napadač preuzima inicijativu da registruje **servisnog radnika** unutar jednog od svojih domena, specifično "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 referencu dobijenu u prethodnom koraku ka stranici koju upravlja **servisni radnik**.
Po dolasku zahteva pokrenutog u prethodnom koraku, **servisni radnik** odgovara sa statusnim kodom **204 (Nema sadržaja)**, efikasno završavajući proces navigacije. U ovom trenutku, **servisni radnik** beleži merenje sa tajmera pokrenutog ranije u koraku dva. Ovo merenje je uticano trajanjem JavaScript-a koji uzrokuje kašnjenja u procesu navigacije.
U merenju izvršavanja je moguće **eliminisati****mrežne faktore** kako bi se dobile **preciznije merenja**. Na primer, učitavanjem resursa korišćenih od strane stranice pre njenog učitavanja.
* **Sažetak:** Koristite [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) da izmerite vreme potrebno za izvršavanje zahteva. Mogu se koristiti i drugi časovnici.
* **Sažetak:** Koristite [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) da izmerite vreme potrebno za izvršavanje zahteva korišćenjem `window.open`. Mogu se koristiti i drugi časovnici.
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da lako kreirate i **automatizujete radne tokove** pokretane najnaprednijim alatima zajednice na svetu.\
Ovde možete pronaći tehnike za eksfiltraciju informacija iz HTML-a sa različitog porekla **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**.
Ako trebate **eksfiltrirati sadržaj** i možete **dodati HTML pre tajnog sadržaja** trebali biste proveriti **uobičajene tehnike visećeg markupa**.\
Međutim, ako iz bilo kog razloga **MORATE** to uraditi **po karakter po karakter** (možda je komunikacija putem pogotka keša) možete koristiti ovu prevaru.
**Slike** u HTML-u imaju atribut "**loading**" čija vrednost može biti "**lenjo**". U tom slučaju, slika će se učitati kada bude prikazana, a ne dok se stranica učitava:
Dakle, ono što možete uraditi jeste da **dodate puno beskorisnih znakova** (Na primer **hiljade "W" znakova**) da **popunite web stranicu pre tajnog sadržaja ili dodate nešto poput**`<br><canvas height="1850px"></canvas><br>.`\
Zatim, ako na primer naš **injekcija se pojavi pre zastave**, **slika** će biti **učitana**, ali ako se pojavi **nakon****zastave**, zastava + beskorisni znakovi će **sprečiti učitavanje** (morate igrati se sa količinom beskorisnih znakova koje treba postaviti). To se desilo u [**ovom writeup-u**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Ovaj tekst će naterati bota da pristupi bilo kom tekstu na stranici koji sadrži tekst `SECR`. Budući da je taj tekst tajna informacija i nalazi se **ispod slike**, slika će se **učitati samo ako je pretpostavljena tajna tačna**. Tako da imate svoj orakl za **eksfiltraciju tajne karakter po karakter**.
Primer koda za iskorišćavanje ovoga: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
Ako nije **moguće učitati spoljnu sliku** što bi moglo ukazati napadaču da je slika učitana, druga opcija bila bi **pokušati pogoditi karakter nekoliko puta i meriti to**. Ako je slika učitana, svi zahtevi će trajati duže nego ako slika nije učitana. To je ono što je korišćeno u [**rešenju ovog teksta**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **sumirano ovde:**
Ako se koristi `jQuery(location.hash)`, moguće je otkriti putem vremena da li **postoji određeni HTML sadržaj**, jer ako se selektor `main[id='site-main']` ne podudara, nije potrebno proveravati ostale **selektore**:
Preporučene su mere zaštite u [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) kao i u svakom delu wiki [https://xsleaks.dev/](https://xsleaks.dev/). Pogledajte tamo više informacija o tome kako se zaštititi od ovih tehnika.
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da biste lako kreirali i **automatizovali radne tokove** uz pomoć najnaprednijih alata zajednice na svetu.\