Cookies Hacking
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Kolačići dolaze sa nekoliko atributa koji kontrolišu njihovo ponašanje u korisnikovom pretraživaču. Evo pregleda ovih atributa u pasivnijem tonu:
Datum isteka kolačića određuje atribut Expires
. Nasuprot tome, atribut Max-age
definiše vreme u sekundama do brisanja kolačića. Odaberite Max-age
jer odražava modernije prakse.
Domaćini koji primaju kolačić određeni su atributom Domain
. Po defaultu, ovo je postavljeno na domaćina koji je izdao kolačić, ne uključujući njegove poddomene. Međutim, kada je atribut Domain
eksplicitno postavljen, obuhvata i poddomene. Ovo čini specifikaciju atributa Domain
manje restriktivnom opcijom, korisnom za scenarije gde je deljenje kolačića preko poddomena neophodno. Na primer, postavljanje Domain=mozilla.org
čini kolačiće dostupnim na njegovim poddomenama kao što je developer.mozilla.org
.
Specifična URL putanja koja mora biti prisutna u traženom URL-u da bi se Cookie
zaglavlje poslalo označena je atributom Path
. Ovaj atribut smatra karakter /
kao separator direktorijuma, omogućavajući podudaranja u poddirektorijumima.
Kada dva kolačića imaju isto ime, onaj koji se bira za slanje zasniva se na:
Kolačiću koji se podudara sa najdužom putanjom u traženom URL-u.
Najnovije postavljenom kolačiću ako su putanje identične.
Atribut SameSite
određuje da li se kolačići šalju na zahteve koji potiču sa trećih strana. Nudi tri podešavanja:
Strict: Ograničava kolačić da se ne šalje na zahteve trećih strana.
Lax: Omogućava kolačiću da se šalje sa GET zahtevima koje pokreću veb sajtovi trećih strana.
None: Dozvoljava kolačiću da se šalje sa bilo kog domena treće strane.
Zapamtite, dok konfigurišete kolačiće, razumevanje ovih atributa može pomoći da se osigura da se ponašaju kako se očekuje u različitim scenarijima.
Request Type
Example Code
Cookies Sent When
Link
<a href="..."></a>
NotSet*, Lax, None
Prerender
<link rel="prerender" href=".."/>
NotSet*, Lax, None
Form GET
<form method="GET" action="...">
NotSet*, Lax, None
Form POST
<form method="POST" action="...">
NotSet*, None
iframe
<iframe src="..."></iframe>
NotSet*, None
AJAX
$.get("...")
NotSet*, None
Image
<img src="...">
NetSet*, None
Tabela iz Invicti i malo izmenjena. Kolačić sa SameSite atributom će ublažiti CSRF napade gde je potrebna prijavljena sesija.
*Napomena da od Chrome80 (feb/2019) podrazumevano ponašanje kolačića bez SameSite atributa će biti lax (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/). Napomena da privremeno, nakon primene ove promene, kolačići bez SameSite politike u Chrome-u će biti tretirani kao None tokom prvih 2 minuta, a zatim kao Lax za POST zahteve na vrhunskom nivou između sajtova.
Ovo sprečava klijenta da pristupi kolačiću (putem JavaScript-a, na primer: document.cookie
)
Ako stranica šalje kolačiće kao odgovor na zahteve (na primer na PHPinfo stranici), moguće je zloupotrebiti XSS da se pošalje zahtev ovoj stranici i ukrade kolačiće iz odgovora (proverite primer na https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/.
Ovo se može zaobići sa TRACE HTTP zahtevima jer će odgovor servera (ako je ova HTTP metoda dostupna) odražavati poslate kolačiće. Ova tehnika se naziva Cross-Site Tracking.
Ova tehnika se izbegava od strane modernih pretraživača ne dozvoljavajući slanje TRACE zahteva iz JS-a. Međutim, neka zaobilaženja su pronađena u specifičnom softveru kao što je slanje \r\nTRACE
umesto TRACE
u IE6.0 SP2.
Drugi način je iskorišćavanje zero/day ranjivosti pretraživača.
Moguće je prepisati HttpOnly kolačiće izvođenjem napada na prelivanje kolačića:
Moguće je koristiti Cookie Smuggling napad za eksfiltraciju ovih kolačića
Zahtev će samo poslati kolačić u HTTP zahtevu samo ako je zahtev prenet preko sigurnog kanala (tipično HTTPS).
Kolačići sa prefiksom __Secure-
moraju biti postavljeni zajedno sa secure
oznakom sa stranica koje su zaštićene HTTPS-om.
Za kolačiće sa prefiksom __Host-
, mora biti ispunjeno nekoliko uslova:
Moraju biti postavljeni sa secure
oznakom.
Moraju poticati sa stranice zaštićene HTTPS-om.
Zabranjeno im je da specificiraju domen, sprečavajući njihovo prenošenje na poddomene.
Putanja za ove kolačiće mora biti postavljena na /
.
Važno je napomenuti da kolačići sa prefiksom __Host-
ne smeju biti poslati superdomenima ili poddomenima. Ova restrikcija pomaže u izolaciji aplikacionih kolačića. Stoga, korišćenje __Host-
prefiksa za sve aplikacione kolačiće može se smatrati dobrom praksom za poboljšanje sigurnosti i izolacije.
Dakle, jedna od zaštita kolačića sa prefiksom __Host-
je sprečavanje njihovog prepisivanja sa poddomena. Sprečavanje, na primer, Cookie Tossing napada. U predavanju Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities (paper) je predstavljeno da je bilo moguće postaviti kolačiće sa prefiksom __HOST- iz poddomena, varajući parser, na primer, dodavanjem "=" na početak ili na kraj...:
Ili u PHP-u je bilo moguće dodati druge karaktere na početak imena kolačića koji će biti zamenjeni donjom crtom , omogućavajući prepisivanje __HOST-
kolačića:
Ako prilagođeni kolačić sadrži osetljive podatke, proverite ga (posebno ako učestvujete u CTF-u), jer može biti ranjiv.
Osjetljivi podaci ugrađeni u kolačiće uvek treba da budu pažljivo ispitani. Kolačići kodirani u Base64 ili sličnim formatima često se mogu dekodirati. Ova ranjivost omogućava napadačima da izmene sadržaj kolačića i pretvaraju se u druge korisnike kodiranjem svojih izmenjenih podataka nazad u kolačić.
Ovaj napad uključuje krađu kolačića korisnika kako bi se dobio neovlašćen pristup njihovom nalogu unutar aplikacije. Korišćenjem ukradenog kolačića, napadač može da se pretvara da je legitimni korisnik.
U ovom scenariju, napadač vara žrtvu da koristi određeni kolačić za prijavu. Ako aplikacija ne dodeljuje novi kolačić prilikom prijave, napadač, posedujući originalni kolačić, može da se pretvara da je žrtva. Ova tehnika se oslanja na to da žrtva prijavi sa kolačićem koji je obezbedio napadač.
Ako ste pronašli XSS u poddomeni ili kontrolišete poddomen, pročitajte:
Ovde, napadač ubeđuje žrtvu da koristi napadačev kolačić sesije. Žrtva, verujući da je prijavljena na svoj nalog, nenamerno će izvršiti radnje u kontekstu napadačevog naloga.
Ako ste pronašli XSS u poddomeni ili kontrolišete poddomen, pročitajte:
Kliknite na prethodni link da biste pristupili stranici koja objašnjava moguće slabosti u JWT.
JSON Web Tokens (JWT) korišćeni u kolačićima takođe mogu predstavljati ranjivosti. Za detaljne informacije o potencijalnim slabostima i kako ih iskoristiti, preporučuje se pristup povezanom dokumentu o hakovanju JWT.
Ovaj napad prisiljava prijavljenog korisnika da izvrši neželjene radnje na veb aplikaciji u kojoj je trenutno autentifikovan. Napadači mogu iskoristiti kolačiće koji se automatski šalju sa svakim zahtevom na ranjivi sajt.
(Proverite dalje detalje u originalnom istraživanju) Pregledači dozvoljavaju kreiranje kolačića bez imena, što se može demonstrirati putem JavaScript-a na sledeći način:
Rezultat u poslatom cookie header-u je a=v1; test value; b=v2;
. Zanimljivo je da ovo omogućava manipulaciju kolačićima ako je postavljen kolačić sa praznim imenom, potencijalno kontrolišući druge kolačiće postavljanjem praznog kolačića na specifičnu vrednost:
To dovodi do toga da pregledač šalje zaglavlje kolačića koje svaki veb server interpretira kao kolačić nazvan a
sa vrednošću b
.
U Chrome-u, ako je Unicode zamenska kodna tačka deo postavljenog kolačića, document.cookie
postaje oštećen, vraćajući prazan string kasnije:
Ovo rezultira time da document.cookie
ispisuje prazan string, što ukazuje na trajnu korupciju.
(Pogledajte dalje detalje uoriginalnom istraživanju) Nekoliko web servera, uključujući one iz Jave (Jetty, TomCat, Undertow) i Pythona (Zope, cherrypy, web.py, aiohttp, bottle, webob), pogrešno obrađuju stringove kolačića zbog zastarele podrške za RFC2965. Čitaju vrednost kolačića u dvostrukim navodnicima kao jednu vrednost čak i ako uključuje tačke-zareze, koje bi obično trebale da razdvajaju parove ključ-vrednost:
(Check further details in theoriginal research) Neispravno parsiranje kolačića od strane servera, posebno Undertow, Zope, i onih koji koriste Pythonov http.cookie.SimpleCookie
i http.cookie.BaseCookie
, stvara prilike za napade injekcijom kolačića. Ovi serveri ne uspevaju pravilno da odvoje početak novih kolačića, omogućavajući napadačima da lažiraju kolačiće:
Undertow očekuje novi kolačić odmah nakon citirane vrednosti bez tačke-zareza.
Zope traži zarez da započne parsiranje sledećeg kolačića.
Pythonove klase kolačića započinju parsiranje na razmak.
Ova ranjivost je posebno opasna u web aplikacijama koje se oslanjaju na CSRF zaštitu zasnovanu na kolačićima, jer omogućava napadačima da injektiraju lažirane CSRF-token kolačiće, potencijalno zaobilazeći bezbednosne mere. Problem se dodatno pogoršava načinom na koji Python obrađuje duple nazive kolačića, gde poslednja pojava prepisuje ranije. Takođe, postavlja zabrinutosti za __Secure-
i __Host-
kolačiće u nesigurnim kontekstima i može dovesti do zaobilaženja autorizacije kada se kolačići proslede back-end serverima koji su podložni lažiranju.
Prema ovom blogu, može biti moguće koristiti atribut kolačića $Version=1
da se backend koristi starom logikom za parsiranje kolačića zbog RFC2109. Štaviše, druge vrednosti kao što su $Domain
i $Path
mogu se koristiti za modifikaciju ponašanja backenda sa kolačićem.
Ovo parsiranje ukazuje na to da se neizbežene vrednosti unutar kolačića moraju osloboditi, tako da "\a" postaje "a". Ovo može biti korisno za zaobilaženje WAFS-a kao:
eval('test') => forbidden
"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed
U RFC2109 je naznačeno da se zarez može koristiti kao separator između vrednosti kolačića. Takođe, moguće je dodati razmake i tabove pre i posle znaka jednakosti. Stoga kolačić poput $Version=1; foo=bar, abc = qux
ne generiše kolačić "foo":"bar, admin = qux"
već kolačiće foo":"bar"
i "admin":"qux"
. Obratite pažnju na to kako se generišu 2 kolačića i kako je adminu uklonjen razmak pre i posle znaka jednakosti.
Na kraju, različiti backdoor-i bi se spojili u string različitih kolačića prosleđenih u različitim header-ima kolačića kao u:
Što bi moglo omogućiti zaobilaženje WAF-a kao u ovom primeru:
kolačić je isti svaki put kada se prijavite.
Odjavite se i pokušajte da koristite isti kolačić.
Pokušajte da se prijavite sa 2 uređaja (ili pregledača) na isti nalog koristeći isti kolačić.
Proverite da li kolačić sadrži bilo kakve informacije i pokušajte da ga izmenite.
Pokušajte da kreirate nekoliko naloga sa gotovo istim korisničkim imenom i proverite da li možete primetiti sličnosti.
Proverite opciju "zapamti me" ako postoji da vidite kako funkcioniše. Ako postoji i može biti ranjiva, uvek koristite kolačić zapamti me bez bilo kog drugog kolačića.
Proverite da li prethodni kolačić funkcioniše čak i nakon što promenite lozinku.
Ako kolačić ostaje isti (ili gotovo isti) kada se prijavite, to verovatno znači da je kolačić povezan sa nekim poljem vašeg naloga (verovatno korisničkim imenom). Tada možete:
Pokušajte da kreirate mnogo naloga sa korisničkim imenima vrlo sličnim i pokušajte da pogodite kako algoritam funkcioniše.
Pokušajte da bruteforce-ujete korisničko ime. Ako se kolačić čuva samo kao metoda autentifikacije za vaše korisničko ime, onda možete kreirati nalog sa korisničkim imenom "Bmin" i bruteforce-ovati svaki jedini bit vašeg kolačića jer će jedan od kolačića koje ćete pokušati biti onaj koji pripada "admin".
Pokušajte Padding Oracle (možete dekriptovati sadržaj kolačića). Koristite padbuster.
Padding Oracle - Padbuster primeri
Padbuster će napraviti nekoliko pokušaja i pitaće vas koja je uslov greške (onaj koji nije validan).
Zatim će početi da dekriptuje kolačić (može potrajati nekoliko minuta)
Ako je napad uspešno izveden, onda možete pokušati da enkriptujete string po vašem izboru. Na primer, ako želite da enkriptujete user=administrator
Ova izvršenja će vam dati kolačić ispravno enkriptovan i kodiran sa stringom user=administrator unutra.
CBC-MAC
Možda kolačić može imati neku vrednost i može biti potpisan koristeći CBC. Tada je integritet vrednosti potpis koji je kreiran korišćenjem CBC sa istom vrednošću. Kako se preporučuje korišćenje nultog vektora kao IV, ova vrsta provere integriteta može biti ranjiva.
Napad
Dobijte potpis korisničkog imena administ = t
Dobijte potpis korisničkog imena rator\x00\x00\x00 XOR t = t'
Postavite u kolačić vrednost administrator+t' (t' će biti validan potpis (rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00
ECB
Ako je kolačić enkriptovan koristeći ECB, može biti ranjiv. Kada se prijavite, kolačić koji dobijate mora uvek biti isti.
Kako otkriti i napasti:
Kreirajte 2 korisnika sa gotovo istim podacima (korisničko ime, lozinka, email, itd.) i pokušajte da otkrijete neki obrazac unutar datog kolačića.
Kreirajte korisnika pod imenom "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" i proverite da li postoji neki obrazac u kolačiću (pošto ECB enkriptuje svaki blok sa istim ključem, isti enkriptovani bajtovi mogu se pojaviti ako je korisničko ime enkriptovano).
Trebalo bi da postoji obrazac (sa veličinom korišćenog bloka). Tako, znajući kako je gomila "a" enkriptovana, možete kreirati korisničko ime: "a"*(veličina bloka)+"admin". Tada biste mogli da obrišete enkriptovani obrazac bloka "a" iz kolačića. I imaćete kolačić korisničkog imena "admin".
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)