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. Izaberite 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 poddomaene. 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 domena. 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 trećeg domena.
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 vrhunskim stranicama.
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 na ovu stranicu 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 eksploatacija zero/day ranjivosti pretraživača.
Moguće je prepisati HttpOnly kolačiće izvođenjem napada Cookie Jar overflow:
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 na 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- sa poddomena, prevarom parsera, 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 donjim crticama, 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 pažljivo pregledati. 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 korisničkog kolačića kako bi se dobio neovlašćen pristup njihovom nalogu unutar aplikacije. Korišćenjem ukradenog kolačića, napadač može imitirati legitimnog korisnika.
U ovom scenariju, napadač prevari ž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 imitirati žrtvu. 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 poddomenu, pročitajte:
Cookie TossingOvde, napadač uverava ž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 poddomenu, pročitajte:
Cookie TossingKliknite na prethodni link da biste pristupili stranici koja objašnjava moguće nedostatke u JWT.
JSON Web Tokens (JWT) korišćeni u kolačićima takođe mogu predstavljati ranjivosti. Za detaljne informacije o potencijalnim nedostacima 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 su trenutno autentifikovani. Napadači mogu iskoristiti kolačiće koji se automatski šalju sa svakim zahtevom na ranjivu stranicu.
(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:
To rezultira u document.cookie
koji 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. Oni č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 mogućnosti 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 razmaku.
Ova ranjivost je posebno opasna u web aplikacijama koje se oslanjaju na zaštitu od CSRF zasnovanu na kolačićima, jer omogućava napadačima da injektiraju lažirane CSRF-token kolačiće, potencijalno zaobilazeći sigurnosne 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 podložnim lažiranju.
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 examples
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 encrypt user=administrator
Ova izvršavanje ć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 jednog bloka "a" iz kolačića. I imaćete kolačić korisničkog imena "admin".
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)