CSS Injection
Try Hard Security Group
CSS Injection
Selektor atributa
CSS selektori su oblikovani da se podudaraju sa vrednostima name
i value
atributa input
elementa. Ako vrednost atributa value
input elementa počinje sa određenim karakterom, učitava se unapred definisani spoljni resurs:
Međutim, ovaj pristup ima ograničenje prilikom rukovanja skrivenim input elementima (type="hidden"
) jer skriveni elementi ne učitavaju pozadine.
Bypass za Skrivene Elemente
Da biste zaobišli ovo ograničenje, možete ciljati naredni susedni element koristeći ~
kombinator za opšte susede. Zatim se CSS pravilo primenjuje na sve susede koji slede nakon skrivenog input elementa, što uzrokuje učitavanje pozadinske slike:
Preduslovi za CSS ubacivanje
Da bi tehnika CSS ubacivanja bila efikasna, moraju biti ispunjeni određeni uslovi:
Dužina Payload-a: Vektor CSS ubacivanja mora podržavati dovoljno dugačke payload-e da bi mogao da smesti oblikovane selektore.
Ponovna evaluacija CSS-a: Trebalo bi da imate mogućnost da okvirno postavite stranicu, što je neophodno da bi se pokrenula ponovna evaluacija CSS-a sa novim generisanim payload-ima.
Spoljni Resursi: Tehnika pretpostavlja mogućnost korišćenja slika hostovanih spolja. Ovo može biti ograničeno politikom bezbednosti sadržaja (CSP) sajta.
Slepi selektor atributa
Kao što je objašnjeno u ovom postu, moguće je kombinovati selektore :has
i :not
kako bi se identifikovao sadržaj čak i iz slepih elemenata. Ovo je veoma korisno kada nemate pojma šta se nalazi unutar web stranice koja učitava CSS ubacivanje.
Takođe je moguće koristiti ove selektore kako bi se izvukle informacije iz nekoliko blokova istog tipa kao u:
Kombinovanjem ove tehnike sa sledećom @import tehnikom, moguće je eksfiltrirati mnogo informacija korišćenjem CSS ubacivanja sa slepih stranica pomoću blind-css-exfiltration.
@import
Prethodna tehnika ima neke nedostatke, proverite preduslove. Morate ili biti u mogućnosti da pošaljete više linkova žrtvi, ili morate biti u mogućnosti da ubacite iframe na stranicu ranjivu na CSS ubacivanje.
Međutim, postoji još jedna pametna tehnika koja koristi CSS @import
da bi poboljšala kvalitet tehnike.
Ovo je prvi put pokazao Pepe Vila i radi na sledeći način:
Umesto učitavanja iste stranice iznova i iznova sa desetinama različitih payloada svaki put (kao u prethodnoj tehnici), mi ćemo učitati stranicu samo jednom i samo sa importom ka serveru napadača (ovo je payload koji treba poslati žrtvi):
Uvoz će primiti neki CSS skript od napadača i pregledač će ga učitati.
Prvi deo CSS skripta koji će napadač poslati je još jedan
@import
ka serveru napadača.Server napadača još neće odgovoriti na ovaj zahtev, jer želimo da procuri neke karaktere, a zatim odgovoriti na ovaj uvoz sa payloadom kako bi procurili sledeće.
Drugi i veći deo payloada će biti payload za curenje atributa selektora
Ovo će poslati serveru napadača prvi karakter tajne i poslednji
Kada server napadača primi prvi i poslednji karakter tajne, odgovoriće na uvoz koji je zatražen u koraku 2.
Odgovor će biti tačno isti kao koraci 2, 3 i 4, ali ovog puta će pokušati pronaći drugi karakter tajne, a zatim predposlednji.
Napadač će pratiti taj ciklus dok ne uspe potpuno da procuri tajnu.
Originalni Pepe Vila kod za iskorišćavanje ovoga možete pronaći ovde ili možete pronaći skoro isti kod ali komentiran ovde.
Skripta će pokušati otkriti 2 karaktera svaki put (od početka i od kraja) jer atributni selektor omogućava stvari poput:
Ovo omogućava skriptu da brže otkrije tajnu.
Ponekad skript ne detektuje tačno da je pronađeni prefiks + sufiks već kompletan flag i nastaviće dalje (u prefiksu) i unazad (u sufiksu) i u nekom trenutku će se zablokirati. Nema brige, samo proverite izlaz jer možete videti flag tamo.
Ostali selektori
Drugi načini pristupa delovima DOM-a pomoću CSS selektora:
.class-to-search:nth-child(2)
: Ovo će pronaći drugu stavku sa klasom "class-to-search" u DOM-u.:empty
selektor: Korišćen na primer u ovom writeup-u:
XS-Search zasnovan na greškama
Reference: CSS bazirani napad: Zloupotreba unicode-range of @font-face , XS-Search PoC zasnovan na greškama od strane @terjanq
Opšti cilj je koristiti prilagođeni font sa kontrolisane tačke i osigurati da se tekst (u ovom slučaju, 'A') prikaže samo ovim fontom ako određeni resurs (favicon.ico
) ne može da se učita.
Korišćenje prilagođenog fonta:
Prilagođeni font se definiše korišćenjem pravila
@font-face
unutar<style>
oznake u delu<head>
.Font je nazvan
poc
i preuzima se sa spoljnog endpointa (http://attacker.com/?leak
).Svojstvo
unicode-range
je postavljeno naU+0041
, ciljajući specifičan Unicode karakter 'A'.
Element objekta sa rezervnim tekstom:
Element
<object>
said="poc0"
je kreiran u delu<body>
. Ovaj element pokušava da učita resurs sa adresehttp://192.168.0.1/favicon.ico
.font-family
za ovaj element je postavljen na'poc'
, kako je definisano u delu<style>
.Ako resurs (
favicon.ico
) ne uspe da se učita, rezervisani sadržaj (slovo 'A') unutar<object>
oznake će biti prikazan.Rezervisani sadržaj ('A') će biti prikazan korišćenjem prilagođenog fonta
poc
ako spoljni resurs ne može da se učita.
Stilizovanje fragmenta teksta za skrolovanje
:target
pseudo-klasa se koristi za odabir elementa ciljanog putem URL fragmenta, kako je navedeno u specifikaciji CSS selektora nivoa 4. Važno je razumeti da ::target-text
ne odgovara nijednom elementu osim ako tekst nije eksplicitno ciljan fragmentom.
Bezbednosna zabrinutost se javlja kada napadači iskorišćavaju mogućnost Skrolovanja do teksta fragmenta, omogućavajući im da potvrde prisustvo određenog teksta na veb stranici učitavanjem resursa sa svojeg servera putem HTML ubacivanja. Metoda uključuje ubacivanje CSS pravila poput:
U takvim scenarijima, ako je tekst "Administrator" prisutan na stranici, resurs target.png
se zahteva sa servera, što ukazuje na prisustvo teksta. Primer ovog napada može se izvršiti putem posebno oblikovanog URL-a koji ugrađuje ubačeni CSS zajedno sa fragmentom za skrolovanje do teksta:
Napad manipuliše HTML ubacivanjem kako bi preneo CSS kod, ciljajući specifičan tekst "Administrator" kroz Scroll-to-text fragment (#:~:text=Administrator
). Ako se tekst pronađe, naznačeni resurs se učitava, nenamerno signalizirajući svoje prisustvo napadaču.
Za ublažavanje, treba imati na umu sledeće tačke:
Ograničeno podudaranje STTF-a: Scroll-to-text Fragment (STTF) je dizajniran da se podudara samo sa rečima ili rečenicama, čime se ograničava njegova sposobnost otkrivanja proizvoljnih tajni ili tokena.
Ograničenje na kontekste pregledanja najvišeg nivoa: STTF funkcioniše isključivo u kontekstima pregledanja najvišeg nivoa i ne funkcioniše unutar iframes-a, čime se svaki pokušaj eksploatacije čini primetnijim korisniku.
Potreba za aktivacijom korisnika: STTF zahteva gest aktivacije korisnika da bi funkcionisao, što znači da su eksploatacije izvodljive samo putem navigacija koje je inicirao korisnik. Ovaj zahtev značajno umanjuje rizik od automatizovanih napada bez interakcije korisnika. Ipak, autor blog posta ukazuje na specifične uslove i zaobilaze (npr. socijalno inženjerstvo, interakcija sa rasprostranjenim ekstenzijama pregledača) koji mogu olakšati automatizaciju napada.
Svest o ovim mehanizmima i potencijalnim ranjivostima ključna je za održavanje bezbednosti veba i zaštite od takvih eksploatativnih taktika.
Za više informacija pogledajte originalni izveštaj: https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/
Možete proveriti eksploit koji koristi ovu tehniku za CTF ovde.
@font-face / unicode-range
Možete specificirati spoljne fontove za specifične unicode vrednosti koje će biti prikupljene samo ako su te unicode vrednosti prisutne na stranici. Na primer:
Kada pristupite ovoj stranici, Chrome i Firefox dohvaćaju "?A" i "?B" jer tekstni čvor sensitive-information sadrži znakove "A" i "B". Međutim, Chrome i Firefox ne dohvaćaju "?C" jer ne sadrži "C". To znači da smo uspeli pročitati "A" i "B".
Izvlačenje teksta iz čvora (I): ligature
Reference: Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację
Opisana tehnika uključuje izvlačenje teksta iz čvora iskorišćavanjem font ligatura i praćenjem promena u širini. Proces uključuje nekoliko koraka:
Kreiranje prilagođenih fontova:
SVG fontovi se oblikuju sa glifovima koji imaju atribut
horiz-adv-x
, koji postavlja veliku širinu za glif koji predstavlja sekvencu od dva znaka.Primer SVG glifa:
<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>
, gde "XY" označava sekvencu od dva znaka.Ovi fontovi se zatim konvertuju u woff format koristeći fontforge.
Detekcija promena u širini:
CSS se koristi kako bi se osiguralo da tekst ne prelazi u novi red (
white-space: nowrap
) i kako bi se prilagodio stil trake za pomeranje.Pojava horizontalne trake za pomeranje, stilizovane na poseban način, deluje kao indikator (orakul) da je određena ligatura, a time i određena sekvencija znakova, prisutna u tekstu.
Uključeni CSS:
Proces eksploatacije:
Korak 1: Fontovi se kreiraju za parove znakova sa značajnom širinom.
Korak 2: Koristi se trik sa trakom za pomeranje kako bi se detektovalo kada je veliki glif širine (ligatura za par znakova) prikazan, što ukazuje na prisustvo sekvence znakova.
Korak 3: Nakon detekcije ligature, generišu se novi glifovi koji predstavljaju sekvence od tri znaka, uključujući detektovani par i dodajući prethodni ili sledeći znak.
Korak 4: Sprovodi se detekcija troznakovne ligature.
Korak 5: Proces se ponavlja, postepeno otkrivajući ceo tekst.
Optimizacija:
Trenutna metoda inicijalizacije korišćenjem
<meta refresh=...
nije optimalna.Efikasniji pristup mogao bi uključivati trik sa CSS
@import
, poboljšavajući performanse eksploatacije.
Izvlačenje teksta iz čvora (II): otkrivanje karakterskog skupa sa podrazumevanim fontom (bez potrebe za spoljnim sredstvima)
Reference: PoC korišćenjem Comic Sans od strane @Cgvwzq & @Terjanq
Ovaj trik je objavljen u ovom Slackers thread. Karakterski skup korišćen u tekstnom čvoru može biti otkriven korišćenjem podrazumevanih fontova instaliranih u pregledaču: nisu potrebni spoljni -ili prilagođeni- fontovi.
Koncept se vrti oko korišćenja animacije kako bi se postepeno proširila širina div
-a, omogućavajući da se po jedan znak prebaci iz 'sufiksa' dela teksta u 'prefiks' deo. Ovaj proces efikasno deli tekst na dva dela:
Prefiks: Početna linija.
Sufiks: Naredne linije.
Faze tranzicije karaktera bi izgledale ovako:
C ADB
CA DB
CAD B
CADB
Tokom ove tranzicije, unicode-range trik se koristi kako bi se identifikovao svaki novi znak dok se pridružuje prefiksu. To se postiže prebacivanjem fonta na Comic Sans, koji je primetno viši od podrazumevanog fonta, što posledično pokreće vertikalnu traku za pomeranje. Pojava ove trake za pomeranje indirektno otkriva prisustvo novog znaka u prefiksu.
Iako ovaj metod omogućava detekciju jedinstvenih znakova kako se pojavljuju, ne precizira koji se znak ponavlja, samo da se ponavljanje desilo.
U osnovi, unicode-range se koristi za otkrivanje znaka, ali kako ne želimo da učitavamo spoljni font, moramo pronaći drugi način. Kada se znak pronađe, dodeljuje mu se prethodno instaliran Comic Sans font, koji uvećava znak i pokreće traku za pomeranje koja će otkriti pronađeni znak.
Proverite kod izdvojen iz PoC-a:
Curenje teksta čvora (III): otkrivanje skupa znakova pomoću podrazumevanog fonta sakrivanjem elemenata (bez potrebe za spoljnim sredstvima)
Reference: Ovo je pomenuto kao neuspešno rešenje u ovom tekstu
Ovaj slučaj je vrlo sličan prethodnom, međutim, u ovom slučaju cilj pravljenja određenih znakova većih od drugih je da se nešto sakrije kao što je dugme koje bot ne bi pritisnuo ili slika koja se ne bi učitala. Tako bismo mogli da merimo radnju (ili nedostatak radnje) i saznamo da li je određeni znak prisutan unutar teksta.
Curenje teksta čvora (III): otkrivanje skupa znakova pomoću vremena keširanja (bez potrebe za spoljnim sredstvima)
Reference: Ovo je pomenuto kao neuspešno rešenje u ovom tekstu
U ovom slučaju, možemo pokušati da otkrijemo da li se znak nalazi u tekstu učitavanjem lažnog fonta sa istog porekla:
Ako postoji podudaranje, font će biti učitan sa /static/bootstrap.min.css?q=1
. Iako se neće uspešno učitati, pregledač bi trebalo da ga kešira, i čak ako nema keša, postoji mehanizam 304 not modified, tako da bi odgovor trebao biti brži od drugih stvari.
Međutim, ako vremenska razlika između keširanog odgovora i nekeširanog nije dovoljno velika, ovo neće biti korisno. Na primer, autor je pomenuo: Međutim, nakon testiranja, otkrio sam da je prvi problem to što brzina nije mnogo drugačija, a drugi problem je što bot koristi zastavicu disk-cache-size=1
, što je zaista promišljeno.
Exfiltracija teksta putem čvorova (III): otkrivanje karaktera merenjem vremena učitavanja stotina lokalnih "fontova" (ne zahteva spoljne resurse)
Reference: Ovo je pomenuto kao neuspešno rešenje u ovom izveštaju
U ovom slučaju možete naznačiti CSS da učita stotine lažnih fontova sa istog porekla kada se dogodi podudaranje. Na ovaj način možete meriti vreme koje je potrebno i saznati da li se karakter pojavljuje ili ne sa nečim poput:
I kod bota izgleda ovako:
Dakle, ako se font ne podudara, očekuje se da će vreme odgovora prilikom posete bota biti otprilike 30 sekundi. Međutim, ako postoji podudaranje fonta, biće poslato više zahteva za preuzimanje fonta, što će uzrokovati kontinuiranu aktivnost mreže. Kao rezultat toga, potrebno će više vremena da se ispuni uslov zaustavljanja i primi odgovor. Stoga, vreme odgovora može se koristiti kao indikator za određivanje da li postoji podudaranje fonta.
Reference
Try Hard Security Group
Last updated