Cookies Hacking

Reading time: 16 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Attributs des Cookies

Les cookies possÚdent plusieurs attributs qui contrÎlent leur comportement dans le navigateur de l'utilisateur. Voici un aperçu de ces attributs dans un style plus passif :

Expires et Max-Age

La date d'expiration d'un cookie est déterminée par l'attribut Expires. En revanche, l'attribut Max-age définit le temps en secondes avant qu'un cookie ne soit supprimé. Optez pour Max-age car il reflÚte des pratiques plus modernes.

Domaine

Les hĂŽtes qui reçoivent un cookie sont spĂ©cifiĂ©s par l'attribut Domain. Par dĂ©faut, cela est dĂ©fini sur l'hĂŽte qui a Ă©mis le cookie, sans inclure ses sous-domaines. Cependant, lorsque l'attribut Domain est explicitement dĂ©fini, il englobe Ă©galement les sous-domaines. Cela rend la spĂ©cification de l'attribut Domain une option moins restrictive, utile dans les scĂ©narios oĂč le partage de cookies entre sous-domaines est nĂ©cessaire. Par exemple, dĂ©finir Domain=mozilla.org rend les cookies accessibles sur ses sous-domaines comme developer.mozilla.org.

Chemin

Un chemin URL spĂ©cifique qui doit ĂȘtre prĂ©sent dans l'URL demandĂ©e pour que l'en-tĂȘte Cookie soit envoyĂ© est indiquĂ© par l'attribut Path. Cet attribut considĂšre le caractĂšre / comme un sĂ©parateur de rĂ©pertoire, permettant des correspondances dans les sous-rĂ©pertoires Ă©galement.

RĂšgles de Commande

Lorsque deux cookies portent le mĂȘme nom, celui choisi pour l'envoi est basĂ© sur :

  • Le cookie correspondant au chemin le plus long dans l'URL demandĂ©e.
  • Le cookie le plus rĂ©cemment dĂ©fini si les chemins sont identiques.

SameSite

  • L'attribut SameSite dicte si les cookies sont envoyĂ©s lors de requĂȘtes provenant de domaines tiers. Il offre trois paramĂštres :
  • Strict : Restreint l'envoi du cookie lors de requĂȘtes tierces.
  • Lax : Permet l'envoi du cookie avec des requĂȘtes GET initiĂ©es par des sites web tiers.
  • None : Permet l'envoi du cookie depuis n'importe quel domaine tiers.

N'oubliez pas, lors de la configuration des cookies, que comprendre ces attributs peut aider à garantir qu'ils se comportent comme prévu dans différents scénarios.

Type de RequĂȘteCode ExempleCookies EnvoyĂ©s Quand
Lien<a href="..."></a>NotSet*, Lax, None
Prerender<link rel="prerender" href=".."/>NotSet*, Lax, None
Formulaire GET<form method="GET" action="...">NotSet*, Lax, None
Formulaire POST<form method="POST" action="...">NotSet*, None
iframe<iframe src="..."></iframe>NotSet*, None
AJAX$.get("...")NotSet*, None
Image<img src="...">NetSet*, None

Tableau provenant de Invicti et légÚrement modifié.
Un cookie avec l'attribut SameSite attĂ©nuera les attaques CSRF oĂč une session connectĂ©e est nĂ©cessaire.

*Notez qu'à partir de Chrome80 (février 2019), le comportement par défaut d'un cookie sans attribut SameSite sera lax (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/).
Notez qu'aprĂšs avoir appliquĂ© ce changement, les cookies sans politique SameSite dans Chrome seront traitĂ©s comme None pendant les premiĂšres 2 minutes, puis comme Lax pour les requĂȘtes POST de niveau supĂ©rieur entre sites.

Drapeaux des Cookies

HttpOnly

Cela empĂȘche le client d'accĂ©der au cookie (via Javascript, par exemple : document.cookie)

Contournements

  • Si la page envoie les cookies en rĂ©ponse Ă  une requĂȘte (par exemple dans une page PHPinfo), il est possible d'abuser de l'XSS pour envoyer une requĂȘte Ă  cette page et voler les cookies de la rĂ©ponse (voir un exemple dans https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
  • Cela pourrait ĂȘtre contournĂ© avec des requĂȘtes TRACE HTTP car la rĂ©ponse du serveur (si cette mĂ©thode HTTP est disponible) reflĂ©tera les cookies envoyĂ©s. Cette technique est appelĂ©e Cross-Site Tracking.
  • Cette technique est Ă©vitĂ©e par les navigateurs modernes en ne permettant pas l'envoi d'une requĂȘte TRACE depuis JS. Cependant, certains contournements ont Ă©tĂ© trouvĂ©s dans des logiciels spĂ©cifiques comme l'envoi de \r\nTRACE au lieu de TRACE Ă  IE6.0 SP2.
  • Une autre mĂ©thode est l'exploitation de vulnĂ©rabilitĂ©s zero-day des navigateurs.
  • Il est possible de surcharger les cookies HttpOnly en effectuant une attaque de dĂ©bordement de Cookie Jar :

Cookie Jar Overflow

  • Il est possible d'utiliser l'attaque Cookie Smuggling pour exfiltrer ces cookies.

Secure

La requĂȘte n'enverra que le cookie dans une requĂȘte HTTP uniquement si la requĂȘte est transmise sur un canal sĂ©curisĂ© (typiquement HTTPS).

Préfixes des Cookies

Les cookies prĂ©fixĂ©s par __Secure- doivent ĂȘtre dĂ©finis avec le drapeau secure des pages sĂ©curisĂ©es par HTTPS.

Pour les cookies prĂ©fixĂ©s par __Host-, plusieurs conditions doivent ĂȘtre remplies :

  • Ils doivent ĂȘtre dĂ©finis avec le drapeau secure.
  • Ils doivent provenir d'une page sĂ©curisĂ©e par HTTPS.
  • Ils sont interdits de spĂ©cifier un domaine, empĂȘchant leur transmission aux sous-domaines.
  • Le chemin pour ces cookies doit ĂȘtre dĂ©fini sur /.

Il est important de noter que les cookies prĂ©fixĂ©s par __Host- ne sont pas autorisĂ©s Ă  ĂȘtre envoyĂ©s Ă  des superdomaines ou sous-domaines. Cette restriction aide Ă  isoler les cookies d'application. Ainsi, utiliser le prĂ©fixe __Host- pour tous les cookies d'application peut ĂȘtre considĂ©rĂ© comme une bonne pratique pour amĂ©liorer la sĂ©curitĂ© et l'isolement.

Surcharger les cookies

Ainsi, l'une des protections des cookies prĂ©fixĂ©s par __Host- est d'empĂȘcher leur Ă©crasement depuis des sous-domaines. PrĂ©venir par exemple les attaques de Cookie Tossing. Dans la prĂ©sentation Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities (document), il est prĂ©sentĂ© qu'il Ă©tait possible de dĂ©finir des cookies prĂ©fixĂ©s par __HOST- depuis un sous-domaine, en trompant le parseur, par exemple, en ajoutant "=" au dĂ©but ou Ă  la fin... :

Ou en PHP, il Ă©tait possible d'ajouter d'autres caractĂšres au dĂ©but du nom du cookie qui allaient ĂȘtre remplacĂ©s par des caractĂšres de soulignement, permettant d'Ă©craser les cookies __HOST- :

Attaques par Cookies

Si un cookie personnalisĂ© contient des donnĂ©es sensibles, vĂ©rifiez-le (surtout si vous participez Ă  un CTF), car il pourrait ĂȘtre vulnĂ©rable.

DĂ©codage et Manipulation des Cookies

Les donnĂ©es sensibles intĂ©grĂ©es dans les cookies doivent toujours ĂȘtre examinĂ©es. Les cookies encodĂ©s en Base64 ou dans des formats similaires peuvent souvent ĂȘtre dĂ©codĂ©s. Cette vulnĂ©rabilitĂ© permet aux attaquants de modifier le contenu du cookie et d'usurper l'identitĂ© d'autres utilisateurs en rĂ©encodant leurs donnĂ©es modifiĂ©es dans le cookie.

DĂ©tournement de Session

Cette attaque consiste à voler le cookie d'un utilisateur pour obtenir un accÚs non autorisé à son compte dans une application. En utilisant le cookie volé, un attaquant peut usurper l'identité de l'utilisateur légitime.

Fixation de Session

Dans ce scénario, un attaquant trompe une victime pour qu'elle utilise un cookie spécifique pour se connecter. Si l'application n'assigne pas un nouveau cookie lors de la connexion, l'attaquant, possédant le cookie original, peut usurper l'identité de la victime. Cette technique repose sur le fait que la victime se connecte avec un cookie fourni par l'attaquant.

Si vous avez trouvé un XSS dans un sous-domaine ou si vous contrÎlez un sous-domaine, lisez :

Cookie Tossing

Don de Session

Ici, l'attaquant convainc la victime d'utiliser le cookie de session de l'attaquant. La victime, croyant qu'elle est connectée à son propre compte, effectuera involontairement des actions dans le contexte du compte de l'attaquant.

Si vous avez trouvé un XSS dans un sous-domaine ou si vous contrÎlez un sous-domaine, lisez :

Cookie Tossing

Cookies JWT

Cliquez sur le lien précédent pour accéder à une page expliquant les défauts possibles dans JWT.

Les JSON Web Tokens (JWT) utilisés dans les cookies peuvent également présenter des vulnérabilités. Pour des informations approfondies sur les défauts potentiels et comment les exploiter, il est recommandé d'accéder au document lié sur le hacking JWT.

Cross-Site Request Forgery (CSRF)

Cette attaque force un utilisateur connectĂ© Ă  exĂ©cuter des actions non dĂ©sirĂ©es sur une application web dans laquelle il est actuellement authentifiĂ©. Les attaquants peuvent exploiter les cookies qui sont automatiquement envoyĂ©s avec chaque requĂȘte vers le site vulnĂ©rable.

Cookies Vides

(Voir plus de dĂ©tails dans la recherche originale) Les navigateurs permettent la crĂ©ation de cookies sans nom, ce qui peut ĂȘtre dĂ©montrĂ© par JavaScript comme suit :

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

Le rĂ©sultat dans l'en-tĂȘte de cookie envoyĂ© est a=v1; test value; b=v2;. Intriguement, cela permet la manipulation des cookies si un cookie avec un nom vide est dĂ©fini, contrĂŽlant potentiellement d'autres cookies en dĂ©finissant le cookie vide Ă  une valeur spĂ©cifique :

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

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

Cela conduit le navigateur Ă  envoyer un en-tĂȘte de cookie interprĂ©tĂ© par chaque serveur web comme un cookie nommĂ© a avec une valeur b.

Bug Chrome : ProblĂšme de Codepoint de Surrogate Unicode

Dans Chrome, si un codepoint de surrogate Unicode fait partie d'un cookie défini, document.cookie devient corrompu, renvoyant une chaßne vide par la suite :

js
document.cookie = "\ud800=meep"

Cela entraĂźne document.cookie renvoyant une chaĂźne vide, indiquant une corruption permanente.

(Voir plus de dĂ©tails dans larecherche originale) Plusieurs serveurs web, y compris ceux de Java (Jetty, TomCat, Undertow) et Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), gĂšrent mal les chaĂźnes de cookies en raison d'un support obsolĂšte de RFC2965. Ils lisent une valeur de cookie entre guillemets comme une seule valeur mĂȘme si elle inclut des points-virgules, qui devraient normalement sĂ©parer les paires clĂ©-valeur :

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

Vulnérabilités d'injection de cookies

(Voir plus de détails dans la recherche originale) Le parsing incorrect des cookies par les serveurs, notamment Undertow, Zope, et ceux utilisant http.cookie.SimpleCookie et http.cookie.BaseCookie de Python, crée des opportunités pour des attaques par injection de cookies. Ces serveurs ne parviennent pas à délimiter correctement le début de nouveaux cookies, permettant aux attaquants de falsifier des cookies :

  • Undertow s'attend Ă  un nouveau cookie immĂ©diatement aprĂšs une valeur entre guillemets sans point-virgule.
  • Zope recherche une virgule pour commencer Ă  parser le cookie suivant.
  • Les classes de cookies de Python commencent Ă  parser sur un caractĂšre d'espace.

Cette vulnĂ©rabilitĂ© est particuliĂšrement dangereuse dans les applications web s'appuyant sur une protection CSRF basĂ©e sur des cookies, car elle permet aux attaquants d'injecter des cookies de token CSRF falsifiĂ©s, contournant potentiellement les mesures de sĂ©curitĂ©. Le problĂšme est aggravĂ© par la gestion des noms de cookies en double par Python, oĂč la derniĂšre occurrence remplace les prĂ©cĂ©dentes. Cela soulĂšve Ă©galement des prĂ©occupations pour les cookies __Secure- et __Host- dans des contextes non sĂ©curisĂ©s et pourrait entraĂźner des contournements d'autorisation lorsque des cookies sont transmis Ă  des serveurs back-end susceptibles de falsification.

Cookies $version

Contournement de WAF

Selon cet article de blog, il pourrait ĂȘtre possible d'utiliser l'attribut de cookie $Version=1 pour amener le back-end Ă  utiliser une ancienne logique pour parser le cookie en raison de la RFC2109. De plus, d'autres valeurs comme $Domain et $Path peuvent ĂȘtre utilisĂ©es pour modifier le comportement du back-end avec le cookie.

Attaque de sandwich de cookies

Selon cet article de blog, il est possible d'utiliser la technique du sandwich de cookies pour voler des cookies HttpOnly. Voici les exigences et Ă©tapes :

  • Trouver un endroit oĂč un cookie apparemment inutile est reflĂ©tĂ© dans la rĂ©ponse
  • CrĂ©er un cookie appelĂ© $Version avec la valeur 1 (vous pouvez faire cela dans une attaque XSS depuis JS) avec un chemin plus spĂ©cifique afin qu'il obtienne la position initiale (certains frameworks comme Python n'ont pas besoin de cette Ă©tape)
  • CrĂ©er le cookie qui est reflĂ©tĂ© avec une valeur qui laisse des guillemets doubles ouverts et avec un chemin spĂ©cifique afin qu'il soit positionnĂ© dans la base de donnĂ©es des cookies aprĂšs le prĂ©cĂ©dent ($Version)
  • Ensuite, le cookie lĂ©gitime viendra ensuite dans l'ordre
  • CrĂ©er un cookie factice qui ferme les guillemets doubles Ă  l'intĂ©rieur de sa valeur

De cette maniÚre, le cookie de la victime est piégé à l'intérieur du nouveau cookie version 1 et sera reflété chaque fois qu'il est reflété.

javascript
document.cookie = `$Version=1;`;
document.cookie = `param1="start`;
// any cookies inside the sandwich will be placed into param1 value server-side
document.cookie = `param2=end";`;

Bypasses WAF

Cookies $version

Consultez la section précédente.

Analyse de contournement des valeurs avec l'encodage de chaĂźnes entre guillemets

Cette analyse indique de dĂ©sĂ©chapper les valeurs Ă©chappĂ©es Ă  l'intĂ©rieur des cookies, donc "\a" devient "a". Cela peut ĂȘtre utile pour contourner les WAFS car :

  • eval('test') => interdit
  • "\e\v\a\l\(\'\t\e\s\t\'\)" => autorisĂ©

Contournement des listes de blocage des noms de cookies

Dans le RFC2109, il est indiquĂ© qu'une virgule peut ĂȘtre utilisĂ©e comme sĂ©parateur entre les valeurs des cookies. Et il est Ă©galement possible d'ajouter des espaces et des tabulations avant et aprĂšs le signe Ă©gal. Par consĂ©quent, un cookie comme $Version=1; foo=bar, abc = qux ne gĂ©nĂšre pas le cookie "foo":"bar, admin = qux" mais les cookies foo":"bar" et "admin":"qux". Remarquez comment 2 cookies sont gĂ©nĂ©rĂ©s et comment l'espace avant et aprĂšs le signe Ă©gal a Ă©tĂ© supprimĂ© pour admin.

Contournement de l'analyse des valeurs avec le fractionnement des cookies

Enfin, diffĂ©rentes portes dĂ©robĂ©es pourraient se joindre dans une chaĂźne de diffĂ©rents cookies passĂ©s dans diffĂ©rents en-tĂȘtes de cookies comme dans :

GET / HTTP/1.1
Host: example.com
Cookie: param1=value1;
Cookie: param2=value2;

Ce qui pourrait permettre de contourner un WAF comme dans cet exemple :

Cookie: name=eval('test//
Cookie: comment')

Resulting cookie: name=eval('test//, comment') => allowed

Vérifications des cookies extra vulnérables

VĂ©rifications de base

  • Le cookie est le mĂȘme chaque fois que vous vous connectez.
  • DĂ©connectez-vous et essayez d'utiliser le mĂȘme cookie.
  • Essayez de vous connecter avec 2 appareils (ou navigateurs) au mĂȘme compte en utilisant le mĂȘme cookie.
  • VĂ©rifiez si le cookie contient des informations et essayez de le modifier.
  • Essayez de crĂ©er plusieurs comptes avec presque le mĂȘme nom d'utilisateur et vĂ©rifiez si vous pouvez voir des similitudes.
  • VĂ©rifiez l'option "se souvenir de moi" si elle existe pour voir comment elle fonctionne. Si elle existe et pourrait ĂȘtre vulnĂ©rable, utilisez toujours le cookie de se souvenir de moi sans aucun autre cookie.
  • VĂ©rifiez si le cookie prĂ©cĂ©dent fonctionne mĂȘme aprĂšs avoir changĂ© le mot de passe.

Attaques avancées sur les cookies

Si le cookie reste le mĂȘme (ou presque) lorsque vous vous connectez, cela signifie probablement que le cookie est liĂ© Ă  un champ de votre compte (probablement le nom d'utilisateur). Ensuite, vous pouvez :

  • Essayer de crĂ©er beaucoup de comptes avec des noms d'utilisateur trĂšs similaires et essayer de deviner comment l'algorithme fonctionne.
  • Essayer de bruteforcer le nom d'utilisateur. Si le cookie est uniquement enregistrĂ© comme mĂ©thode d'authentification pour votre nom d'utilisateur, alors vous pouvez crĂ©er un compte avec le nom d'utilisateur "Bmin" et bruteforcer chaque bit de votre cookie car l'un des cookies que vous allez essayer sera celui appartenant Ă  "admin".
  • Essayer Padding Oracle (vous pouvez dĂ©chiffrer le contenu du cookie). Utilisez padbuster.

Padding Oracle - Exemples de Padbuster

bash
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 fera plusieurs tentatives et vous demandera quelle condition est la condition d'erreur (celle qui n'est pas valide).

Ensuite, il commencera à déchiffrer le cookie (cela peut prendre plusieurs minutes).

Si l'attaque a été réalisée avec succÚs, vous pourriez essayer de chiffrer une chaßne de votre choix. Par exemple, si vous souhaitez encrypt user=administrator.

padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator

Cette exécution vous donnera le cookie correctement chiffré et encodé avec la chaßne user=administrator à l'intérieur.

CBC-MAC

Peut-ĂȘtre qu'un cookie pourrait avoir une certaine valeur et pourrait ĂȘtre signĂ© en utilisant CBC. Ensuite, l'intĂ©gritĂ© de la valeur est la signature crĂ©Ă©e en utilisant CBC avec la mĂȘme valeur. Comme il est recommandĂ© d'utiliser comme IV un vecteur nul, ce type de vĂ©rification d'intĂ©gritĂ© pourrait ĂȘtre vulnĂ©rable.

L'attaque

  1. Obtenez la signature du nom d'utilisateur administ = t
  2. Obtenez la signature du nom d'utilisateur rator\x00\x00\x00 XOR t = t'
  3. Mettez dans le cookie la valeur administrator+t' (t' sera une signature valide de (rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00

ECB

Si le cookie est chiffrĂ© en utilisant ECB, il pourrait ĂȘtre vulnĂ©rable.
Lorsque vous vous connectez, le cookie que vous recevez doit toujours ĂȘtre le mĂȘme.

Comment détecter et attaquer :

CrĂ©ez 2 utilisateurs avec presque les mĂȘmes donnĂ©es (nom d'utilisateur, mot de passe, email, etc.) et essayez de dĂ©couvrir un certain motif Ă  l'intĂ©rieur du cookie donnĂ©.

CrĂ©ez un utilisateur appelĂ© par exemple "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" et vĂ©rifiez s'il y a un motif dans le cookie (comme ECB chiffre avec la mĂȘme clĂ© chaque bloc, les mĂȘmes octets chiffrĂ©s pourraient apparaĂźtre si le nom d'utilisateur est chiffrĂ©).

Il devrait y avoir un motif (avec la taille d'un bloc utilisé). Donc, sachant comment un tas de "a" est chiffré, vous pouvez créer un nom d'utilisateur : "a"*(taille du bloc)+"admin". Ensuite, vous pourriez supprimer le motif chiffré d'un bloc de "a" du cookie. Et vous aurez le cookie du nom d'utilisateur "admin".

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks