hacktricks/pentesting-web/hacking-with-cookies/README.md

19 KiB

Cookies Hacking

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


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:

Expires and Max-Age

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.

Domain

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.

Path

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.

Ordering Rules

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.

SameSite

  • 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 treće veb stranice.
  • 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 će privremeno, nakon primene ove promene, kolačići bez SameSite politike u Chrome-u biti tretirani kao None tokom prvih 2 minuta, a zatim kao Lax za POST zahteve na vrhunskim stranicama.

Cookies Flags

HttpOnly

Ovo sprečava klijenta da pristupi kolačiću (putem JavaScript-a, na primer: document.cookie)

Zaobilaženja

  • 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 koji ne dozvoljavaju 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 Cookie Jar overflow:

{% content-ref url="cookie-jar-overflow.md" %} cookie-jar-overflow.md {% endcontent-ref %}

Secure

Zahtev će samo poslati kolačić u HTTP zahtevu samo ako je zahtev prenet preko sigurnog kanala (tipično HTTPS).

Cookies Prefixes

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.

Overwriting cookies

Dakle, jedna od zaštita kolačića sa prefiksom __Host- je sprečavanje da budu prepisani 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, 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:

Cookies Attacks

Ako prilagođeni kolačić sadrži osetljive podatke, proverite ga (posebno ako učestvujete u CTF-u), jer može biti ranjiv.

Decoding and Manipulating Cookies

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

Session Hijacking

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 da se pretvara da je legitimni korisnik.

Session Fixation

U ovom scenariju, napadač prevari žrtvu da koristi određeni kolačić za prijavu. Ako aplikacija ne dodeli novi kolačić prilikom prijave, napadač, posedujući originalni kolačić, može se pretvarati 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 poddomenu, pročitajte:

{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}

Session Donation

Ovde, 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:

{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}

JWT Cookies

Kliknite na prethodni link da biste pristupili stranici koja objašnjava moguće greške u JWT.

JSON Web Tokens (JWT) korišćeni u kolačićima takođe mogu predstavljati ranjivosti. Za detaljne informacije o potencijalnim greškama i kako ih iskoristiti, preporučuje se pristup povezanom dokumentu o hakovanju JWT.

Cross-Site Request Forgery (CSRF)

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

Empty Cookies

(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:

document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"

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:

function setCookie(name, value) {
document.cookie = `${name}=${value}`;
}

setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value

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.

Chrome greška: Problem sa Unicode zamenskim kodnim tačkama

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:

document.cookie = "\ud800=meep";

Ovo rezultira time da document.cookie ispisuje prazan string, što ukazuje na trajnu korupciju.

Prevara sa kolačićima zbog problema sa parsiranjem

(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:

RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";

(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 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 podložnim lažiranju.

Extra Vulnerable Cookies Checks

Basic checks

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

Advanced cookies attacks

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 <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# When cookies and regular Base64
padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies auth=u7bvLewln6PJPSAbMb5pFfnCHSEd6olf

# If Base64 urlsafe or hex-lowercase or hex-uppercase --encoding parameter is needed, for example:
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2

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

padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext 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

  1. Dobijte potpis korisničkog imena administ = t
  2. Dobijte potpis korisničkog imena rator\x00\x00\x00 XOR t = t'
  3. 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 su enkriptovani nizovi "a", 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".

Reference

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}

{% hint style="success" %} 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)

Podržite HackTricks
{% endhint %}