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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
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ĂȘte | Code Exemple | Cookies 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 deTRACE
à 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 :
- 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... :
 (1) (1) (1) (1).png)
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-
:
 (1) (1) (1) (1).png)
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 :
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 :
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 :
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 :
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 :
document.cookie = "\ud800=meep"
Cela entraĂźne document.cookie
renvoyant une chaĂźne vide, indiquant une corruption permanente.
Cookie Smuggling en raison de problĂšmes de parsing
(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 valeur1
(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é.
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
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
- Obtenez la signature du nom d'utilisateur administ = t
- Obtenez la signature du nom d'utilisateur rator\x00\x00\x00 XOR t = t'
- 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
- https://blog.ankursundara.com/cookie-bugs/
- https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd
- https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie
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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.