.. | ||
cookie-bomb.md | ||
cookie-jar-overflow.md | ||
cookie-tossing.md | ||
README.md |
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
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Cookie Attributes
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 jusqu'à ce qu'un cookie soit supprimé. Optez pour Max-age
car il reflète des pratiques plus modernes.
Domain
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
.
Path
Un chemin d'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.
Ordering Rules
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 sur des requêtes provenant de domaines tiers. Il offre trois paramètres : - Strict : Restreint l'envoi du cookie sur les requêtes tierces.
- Lax : Permet l'envoi du cookie avec les 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.
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 |
Table from Invicti and slightly modified.
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 2 premières minutes, puis comme Lax pour les requêtes POST inter-domaines de niveau supérieur.
Cookies Flags
HttpOnly
Cela empêche le client d'accéder au cookie (via Javascript, par exemple : document.cookie
)
Bypasses
- Si la page envoie les cookies en réponse à des requêtes (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 :
{% content-ref url="cookie-jar-overflow.md" %} cookie-jar-overflow.md {% endcontent-ref %}
- Il est possible d'utiliser l'attaque Cookie Smuggling pour exfiltrer ces cookies.
Secure
La requête n'enverra le cookie que dans une requête HTTP si la requête est transmise sur un canal sécurisé (typiquement HTTPS).
Cookies Prefixes
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.
Overwriting 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 (papier), 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-
:
Cookies Attacks
Si un cookie personnalisé contient des données sensibles, vérifiez-le (surtout si vous participez à un CTF), car il pourrait être vulnérable.
Decoding and Manipulating 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.
Session Hijacking
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.
Session Fixation
Dans ce scénario, un attaquant trompe une victime pour qu'elle utilise un cookie spécifique pour se connecter. Si l'application n'attribue 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 :
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
Session Donation
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 :
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
JWT Cookies
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.
Empty Cookies
(Vérifiez 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 que document.cookie
renvoie une chaîne vide, indiquant une corruption permanente.
Cookie Smuggling en raison de problèmes de parsing
(Voir plus de détails dans la recherche 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.
Vérifications supplémentaires des cookies 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 des noms d'utilisateur presque identiques 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 enregistré uniquement 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, e-mail, 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
{% 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
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.