hacktricks/pentesting-web/hacking-with-cookies
2024-05-08 16:29:09 +00:00
..
cookie-bomb.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:11:01 +00:00
cookie-jar-overflow.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:11:01 +00:00
cookie-tossing.md Translated ['pentesting-web/hacking-with-cookies/cookie-tossing.md'] to 2024-04-04 08:57:34 +00:00
README.md Translated ['README.md', 'binary-exploitation/rop-return-oriented-progra 2024-05-08 16:29:09 +00:00

Piratage des Cookies

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Groupe de sécurité Try Hard

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


Attributs des Cookies

Les cookies sont accompagnés de plusieurs attributs qui contrôlent leur comportement dans le navigateur de l'utilisateur. Voici un aperçu de ces attributs dans une voix plus passive :

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 recevant 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 pour les scénarios où le partage de cookies entre les sous-domaines est nécessaire. Par exemple, en définissant Domain=mozilla.org, les cookies sont accessibles sur ses sous-domaines comme developer.mozilla.org.

Chemin

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.

Règles de classement

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 des requêtes tierces.
  • Lax : Autorise l'envoi du cookie avec des requêtes GET initiées par des sites tiers.
  • None : Autorise l'envoi du cookie à partir de n'importe quel domaine tiers.

N'oubliez pas que lors de la configuration des cookies, la compréhension de 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 Lorsque
Lien <a href="..."></a> NotSet*, Lax, None
Pré-chargement <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 de Invicti et légèrement modifié.
Un cookie avec l'attribut SameSite aidera à atténuer les attaques CSRF où une session connectée est nécessaire.

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

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'exploiter la XSS pour envoyer une requête à cette page et voler les cookies de la réponse (consultez un exemple dans https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/.
  • Cela peut être contourné avec des requêtes HTTP TRACE car la réponse du serveur (si cette méthode HTTP est disponible) reflétera les cookies envoyés. Cette technique est appelée Suivi intersites.
  • 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 remplacer 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 %}

Secure

La requête enverra le cookie uniquement dans une requête HTTP 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 sur les 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 de 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 aux superdomaines ou aux sous-domaines. Cette restriction aide à isoler les cookies d'application. Ainsi, l'utilisation du préfixe __Host- pour tous les cookies d'application peut être considérée comme une bonne pratique pour renforcer la sécurité et l'isolation.

Écrasement de cookies

Ainsi, l'une des protections des cookies préfixés par __Host- est de les empêcher d'être écrasés par des sous-domaines. Empêchant par exemple les attaques de Cookie Tossing. Dans la présentation Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities (article) il a été présenté qu'il était possible de définir des cookies préfixés par __HOST- depuis un sous-domaine, en trompant l'analyseur, par exemple, en ajoutant "=" au début ou au début et à 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 de 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 de Cookies

Les données sensibles intégrées dans les cookies doivent toujours être examinées attentivement. Les cookies encodés en Base64 ou des formats similaires peuvent souvent être décodés. Cette vulnérabilité permet aux attaquants de modifier le contenu du cookie et de se faire passer pour d'autres utilisateurs en encodant leurs données modifiées dans le cookie.

Détournement de Session

Cette attaque consiste à voler le cookie d'un utilisateur pour accéder de manière non autorisée à son compte au sein d'une application. En utilisant le cookie volé, un attaquant peut se faire passer pour 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 ne génère pas un nouveau cookie lors de la connexion, l'attaquant, possédant le cookie d'origine, peut se faire passer pour la victime. Cette technique repose sur le fait que la victime se connecte avec un cookie fourni par l'attaquant.

Si vous trouvez un XSS dans un sous-domaine ou que vous contrôlez un sous-domaine, lisez :

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

Donation de Session

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

Si vous trouvez un XSS dans un sous-domaine ou que vous contrôlez un sous-domaine, lisez :

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

Cookies JWT

Cliquez sur le lien précédent pour accéder à une page expliquant les failles possibles dans les 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 failles potentielles et comment les exploiter, l'accès au document lié sur le piratage des JWT est recommandé.

Forgery de Requête Cross-Site (CSRF)

Cette attaque force un utilisateur connecté à exécuter des actions non désirées sur une application web à 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

(Vérifiez les détails supplémentaires dans la recherche originale) Les navigateurs permettent la création de cookies sans nom, ce qui peut être démontré en JavaScript de la manière suivante :

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 cookie envoyé est a=v1; test value; b=v2;. De manière intrigante, 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 sur une valeur spécifique:

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

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

Problème de Chrome : Problème de point de code de substitution Unicode

Dans Chrome, si un point de code de substitution Unicode fait partie d'un cookie défini, document.cookie devient corrompu, renvoyant ensuite une chaîne vide :

document.cookie = "\ud800=meep";

Cela se traduit par document.cookie produisant une chaîne vide, indiquant une corruption permanente.

Contrebande de cookies en raison de problèmes d'analyse

(Vérifiez 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 doubles 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

(Vérifiez les détails supplémentaires dans la recherche originale) L'analyse incorrecte 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 d'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 attend un nouveau cookie immédiatement après une valeur entre guillemets sans point-virgule.
  • Zope recherche une virgule pour commencer l'analyse du cookie suivant.
  • Les classes de cookies de Python commencent l'analyse sur un caractère d'espace.

Cette vulnérabilité est particulièrement dangereuse dans les applications web reposant sur une protection CSRF basée sur les cookies, car elle permet aux attaquants d'injecter des cookies de jeton CSRF falsifiés, contournant potentiellement les mesures de sécurité. Le problème est exacerbé par la gestion des noms de cookies en double par Python, où la dernière occurrence remplace les précédentes. Il 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 les 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) sur le 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 de cookies avancées

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 :

  • Essayez de créer beaucoup de comptes avec des noms d'utilisateur très similaires et essayez de deviner comment fonctionne l'algorithme.
  • Essayez de forcer le nom d'utilisateur. Si le cookie ne sauvegarde que comme méthode d'authentification pour votre nom d'utilisateur, vous pouvez créer un compte avec le nom d'utilisateur "Bmin" et forcer chaque bit de votre cookie car l'un des cookies que vous essayerez appartiendra à "admin".
  • Essayez Padding Oracle (vous pouvez décrypter 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écrypter le cookie (cela peut prendre plusieurs minutes).

Si l'attaque a été réalisée avec succès, vous pourriez essayer de crypter une chaîne de votre choix. Par exemple, si vous vouliez crypter user=administrator

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

Cet exécution vous donnera le cookie correctement chiffré et encodé avec la chaîne user=administrateur à l'intérieur.

CBC-MAC

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

L'attaque

  1. Obtenir la signature du nom d'utilisateur administ = t
  2. Obtenir la signature du nom d'utilisateur rator\x00\x00\x00 XOR t = t'
  3. Définir dans le cookie la valeur administrateur+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 être toujours 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é). Ainsi, en 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

Groupe de sécurité Try Hard

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

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks: