<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 [**SUBSCRIPTION PLANS**](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 **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
CSS selektori se prave da bi se poklapali sa vrednostima atributa `name` i `value` elementa `input`. Ako vrednost atributa `value` elementa `input` počinje određenim karakterom, učitava se unapred definisani spoljni resurs:
Da biste zaobišli ovo ograničenje, možete ciljati sledeći susedni element koristeći `~` kombinator za opšte susede. CSS pravilo se primenjuje na sve susede koji slede nakon skrivenog input elementa, što dovodi do učitavanja pozadinske slike:
Praktičan primer iskorišćavanja ove tehnike detaljno je opisan u priloženom kodu. Možete ga pogledati [ovde](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e).
1.**Dužina Payload-a**: Vektor CSS ubacivanja mora podržavati dovoljno dugačke payload-e kako bi se mogli smestiti izrađeni selektori.
2.**Ponovno vrednovanje CSS-a**: Trebali biste imati mogućnost okvira stranice, što je neophodno da bi se pokrenulo ponovno vrednovanje CSS-a sa novo generisanim payload-ima.
3.**Spoljni resursi**: Tehnika pretpostavlja mogućnost korišćenja slika sa spoljnih servera. Ovo može biti ograničeno politikom bezbednosti sadržaja (CSP) sajta.
Kao što je [**objašnjeno u ovom postu**](https://portswigger.net/research/blind-css-exfiltration), 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 veb 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 što je:
Kombinujući ovo sa sledećom tehnikom **@import**, moguće je eksfiltrirati mnogo **informacija koristeći CSS ubacivanje sa slepim stranicama pomoću** [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**.**
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 CSS na ranjivu stranicu putem iframe-a**.
Umesto da učitavamo istu stranicu 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 na server napadača** (ovo je payload koji se šalje žrtvi):
1. Uvoz će **primiti neki CSS skript** od napadača i **pregledač će ga učitati**.
2. Prvi deo CSS skripta koji će napadač poslati je **još jedan `@import` ka serveru napadača**.
1. Server napadača neće odmah odgovoriti na ovaj zahtev, jer želimo da procurimo neke karaktere, a zatim odgovorimo na ovaj uvoz sa payloadom kako bismo procurili sledeće.
3. Drugi i veći deo payloada će biti **payload za curenje selektora atributa**.
1. Ovo će poslati serveru napadača **prvi karakter tajne i poslednji karakter**.
4. Kada server napadača primi **prvi i poslednji karakter tajne**, odgovoriće na uvoz koji je zatražen u koraku 2.
1. Odgovor će biti tačno isti kao **koraci 2, 3 i 4**, ali ovaj put će pokušati **pronaći drugi karakter tajne, a zatim predposlednji**.
Originalni kod [**Pepe Vile za iskorišćavanje ovoga možete pronaći ovde**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) ili možete pronaći skoro [**isti kod, ali komentiran ovde**](./#css-injection).
Ponekad skripta **neće tačno prepoznati da je pronađeni prefiks + sufiks već kompletan flag** i nastaviće napred (u prefiksu) i nazad (u sufiksu) i u nekom trenutku će se zaglaviti.\
Nema brige, samo proverite **izlaz** jer **tamo možete videti flag**.
**Reference:** [CSS based Attack: Abusing unicode-range of @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [Error-Based XS-Search PoC by @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
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 sa ovim fontom ako određeni resurs (`favicon.ico`) ne može da se učita**.
**`:target`** pseudo-klasa se koristi za selektovanje elementa koji je cilj nekog **URL fragmenta**, kako je navedeno u [CSS Selectors Level 4 specifikaciji](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Važno je razumeti da `::target-text` ne odgovara nijednom elementu osim ako tekst nije eksplicitno cilj fragmenta.
Postoji bezbednosna zabrinutost kada napadači iskorišćavaju mogućnost skrolovanja do teksta fragmenta, što im omogućava da potvrde prisustvo određenog teksta na veb stranici učitavanjem resursa sa svojeg servera putem HTML injekcije. Metoda uključuje ubacivanje CSS pravila kao što je ovo:
U takvim scenarijima, ako se tekst "Administrator" nalazi na stranici, sa servera se zahteva resurs `target.png`, što ukazuje na prisustvo teksta. Primer ovog napada može se izvršiti putem posebno kreiranog URL-a koji ugrađuje ubačeni CSS zajedno sa fragmentom Scroll-to-text:
Evo, napad manipuliše HTML ubacivanjem kako bi preneo CSS kod, ciljajući određeni tekst "Administrator" putem Scroll-to-text fragmenta (`#:~:text=Administrator`). Ako se tekst pronađe, učitava se naznačeni resurs, nenamerno signalizirajući njegovo prisustvo napadaču.
1.**Ograničeno podudaranje STTF**: Scroll-to-text Fragment (STTF) je dizajniran da se podudara samo sa rečima ili rečenicama, čime se ograničava njegova sposobnost da otkrije proizvoljne tajne ili tokene.
2.**Ograničenje na vrhunske pregledačke kontekste**: STTF funkcioniše samo u vrhunskim pregledačkim kontekstima i ne funkcioniše unutar iframe-ova, što čini svaki pokušaj iskorišćavanja primetnijim korisniku.
3.**Potreba za aktivacijom korisnika**: STTF zahteva gest aktivacije korisnika da bi radio, što znači da su iskorišćavanja izvodljiva samo putem navigacija koje korisnik pokreće. Ovaj zahtev značajno umanjuje rizik od automatizovanih napada bez interakcije korisnika. Ipak, autor blog posta ukazuje na određene uslove i zaobilaznice (npr. socijalno inženjerstvo, interakcija sa popularnim ekstenzijama pregledača) koje mogu olakšati automatizaciju napada.
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/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
Možete specificirati **spoljne fontove za određene 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 osjetljivih informacija sadrži znakove "A" i "B". Ali Chrome i Firefox ne dohvaćaju "?C" jer ne sadrži "C". To znači da smo uspjeli pročitati "A" i "B".
**Reference:** [Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/)
- CSS se koristi kako bi se osiguralo da se tekst ne prelomi (`white-space: nowrap`) i kako bi se prilagodio stil trake za pomicanje.
- Pojava vodoravne trake za pomicanje, stilizirane na poseban način, djeluje kao indikator (orakl) da je određena ligatura, a time i određeni niz znakova, prisutan u tekstu.
- **Korak 1**: Stvaraju se fontovi za parove znakova s velikom širinom.
- **Korak 2**: Koristi se trik s trakom za pomicanje kako bi se otkrilo kada je prikazan glif velike širine (ligatura za par znakova), što ukazuje na prisutnost niza znakova.
- **Korak 3**: Nakon otkrivanja ligature, generiraju se novi glifovi koji predstavljaju nizove od tri znaka, uključujući otkriveni par i dodavanje prethodnog ili sljedećeg znaka.
- **Korak 4**: Provodi se otkrivanje ligature od tri znaka.
- **Korak 5**: Postupak se ponavlja, postupno otkrivajući cijeli tekst.
### Izvlačenje teksta iz čvora (II): procurivanje skupa znakova s zadanim fontom (bez potrebe za vanjskim resursima) <a href="#izvlačenje-teksta-iz-čvora-ii-procurivanje-skupa-znakova-s-zadanim-fontom" id="izvlačenje-teksta-iz-čvora-ii-procurivanje-skupa-znakova-s-zadanim-fontom"></a>
Ovaj trik je objavljen u ovoj [**Slackers thread**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what\_can\_we\_do\_with\_single\_css\_injection/). Skup znakova koji se koristi u čvoru teksta može procuriti **korištenjem zadanih fontova** instaliranih u pregledniku: nisu potrebni vanjski - ili prilagođeni - fontovi.
Koncept se temelji na korištenju animacije za postupno povećanje širine `div`-a, omogućavajući da se jedan znak u svakom trenutku prelazi iz "sufiksa" dijela teksta u "prefiks" dio. Ovaj postupak efektivno dijeli tekst na dva dijela:
Tijekom ovog prijelaza koristi se trik s **unicode-range** kako bi se identificirao svaki novi znak dok se pridružuje prefiksu. To se postiže prebacivanjem fonta na Comic Sans, koji je primjetno viši od zadanih fontova, što posljedično pokreće okomitu traku za pomicanje. Pojava ove trake za pomicanje neizravno otkriva prisutnost novog znaka u prefiksu.
U osnovi, **unicode-range se koristi za otkrivanje znaka**, ali budući da ne želimo učitavati vanjski font, moramo pronaći drugi način.\
Kada se **znak pronađe**, dodjeljuje mu se prethodno instalirani **Comic Sans font**, što čini znak **većim** i **pokreće traku za pomicanje** koja će **procijediti pronađeni znak**.
### Eksfiltracija teksta čvora (III): otkrivanje skupa znakova pomoću podrazumevanog fonta sakrivanjem elemenata (ne zahteva spoljne resurse) <a href="#eksfiltracija-teksta-čvora-ii-otkrivanje-skupa-znakova-pomoću-podrazumevanog-fonta" id="eksfiltracija-teksta-čvora-ii-otkrivanje-skupa-znakova-pomoću-podrazumevanog-fonta"></a>
Ovaj slučaj je veoma sličan prethodnom, međutim, u ovom slučaju cilj je da se određeni **znakovi učine većim od drugih kako bi se nešto sakrilo**, poput dugmeta koje bot ne sme da pritisne ili slike koja se neće učitati. Na taj način možemo izmeriti akciju (ili nedostatak akcije) i saznati da li se određeni znak nalazi unutar teksta.
### Eksfiltracija teksta čvora (III): otkrivanje skupa znakova putem vremena keširanja (ne zahteva spoljne resurse) <a href="#eksfiltracija-teksta-čvora-ii-otkrivanje-skupa-znakova-pomoću-podrazumevanog-fonta" id="eksfiltracija-teksta-čvora-ii-otkrivanje-skupa-znakova-pomoću-podrazumevanog-fonta"></a>
Ako postoji podudaranje, **font će se učitati sa `/static/bootstrap.min.css?q=1`**. Iako se neće uspešno učitati, **pregledač bi ga trebao keširati**, i čak i ako nema keša, postoji mehanizam **304 not modified**, tako da bi **odgovor trebao biti brži** od ostalih stvari.
Međutim, ako vremenska razlika između keširanog odgovora i neke koji nije keširan nije dovoljno velika, ovo neće biti korisno. Na primer, autor je pomenuo: Međutim, nakon testiranja, primetio 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 pažljivo.
### Eksfiltracija teksta čvora (III): otkrivanje skupa znakova merenjem vremena učitavanja stotina lokalnih "fontova" (bez potrebe za spoljnim resursima) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
U ovom slučaju možete navesti **CSS da učita stotine lažnih fontova** sa istog izvora kada se desi podudaranje. Na taj način možete **meriti vreme** koje je potrebno i saznati da li se pojavljuje određeni znak ili nešto slično:
Dakle, ako font ne odgovara, očekuje se da će vreme odgovora prilikom posete botu biti otprilike 30 sekundi. Međutim, ako postoji podudaranje fonta, biće poslato više zahteva za dobijanje fonta, što će izazvati kontinuiranu aktivnost na mreži. Kao rezultat toga, trebaće više vremena da se zadovolji uslov zaustavljanja i primi odgovor. Stoga, vreme odgovora može se koristiti kao indikator za određivanje da li postoji podudaranje fonta.
<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 oglašenu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**SUBSCRIPTION PLANS**](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 **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje trikove hakovanja slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.