â˜ŁïžWeb Cache Poisoning / Deception

Méthodologie

  1. Identifier et évaluer les entrées sans clé

    1. En-tĂȘte / Cookie

    2. ParamĂštre

    3. ChaĂźne de caractĂšre

  2. Ajouter un cache buster Ă  la requĂȘte (exp: cb=1)

  3. Essayer de faire reflĂ©ter un "canary" dans la requĂȘte avec une entrĂ©e sans clĂ©.

  4. Envoyer la requĂȘte jusqu'Ă  ce qu'elle soit mise en cache.

  5. Supprimer le cache buster puis renvoyer la requĂȘte.

  6. Obtenir la réponse mise en cache

La mise en cache ou non d'une rĂ©ponse peut dĂ©pendre de toutes sortes de facteurs, tels que l'extension de fichier (exp: .js), le type de contenu, la route, le code d'Ă©tat (exp: 200 OK) et les en-tĂȘtes de rĂ©ponse (exp: X-Forwarded-Host).

Poisoning vs. Deception:

Poisoning vise mettre en cache une réponse contenant du code malveillant pour impacter les autres utilisateurs, Deception vise à mettre en cache une page contenant des informations sensibles d'un autre utilisateur pour pouvoir les récupérer.

CPDoS (Cache Poisoning Denial of Services)

HTTP Header Oversize (HHO)

La plupart des serveurs Web et des proxys fournissent une limite de taille d'en-tĂȘte de requĂȘte d'environ 8,192 bytes. Cependant, il existe certaines exceptions telles que les CDN CloudFront par exemple qui autorisent jusqu'Ă  20,480 bytes.

Les attaques CPDoS HHO fonctionnent dans des scĂ©narios oĂč une application Web utilise un cache qui accepte une limite de taille d'en-tĂȘte supĂ©rieure Ă  celle du serveur d'origine. Pour attaquer une telle application Web, un client malveillant envoie une requĂȘte HTTP GET comprenant un en-tĂȘte supĂ©rieur Ă  la taille prise en charge par le serveur d'origine mais infĂ©rieur Ă  la taille prise en charge par le cache. Pour ce faire, un attaquant a deux options. Soit il utilise plusieurs en-tĂȘtes volumineux dans une mĂȘme requĂȘte, soit il ne crĂ©er qu'une seule en-tĂȘte mais avec un contenu suffisamment volumineux pour gĂ©nĂ©rer l'erreur.

Exemple:

X-Oversized-Header-1: 000000000000000000000000000000000000...
X-Oversized-Header-2: 000000000000000000000000000000000000...
...

HTTP Meta Character (HMC)

Le principe cette fois est de gĂ©nĂ©rer une erreur en envoyant des en-tĂȘtes contenant des mĂ©ta-caractĂšres tels que \n, \r, \a...

Exemple:

X-Metachar-Header: \n
X-Metachar-Header: \r
...

HTTP Method Overwrite (HMO)

De nombreux systĂšmes intermĂ©diaires tels que les proxys, les Ă©quilibreurs de charge, les caches et les pare-feu ne prennent en charge que les mĂ©thodes GET et POST. Cela signifie que les requĂȘtes HTTP utilisant DELETE , PUT etc sont simplement bloquĂ©es. Pour contourner cette restriction, de nombreuses API REST et frameworks fournissent des en-tĂȘtes tels que X-HTTP-Method-Override, X-HTTP-Method ou X-Method-Override pour les mĂ©thodes HTTP bloquĂ©es par tunnel. Une fois que la requĂȘte atteint le serveur, l'en-tĂȘte demande Ă  l'application Web de remplacer la mĂ©thode HTTP dans la ligne de requĂȘte par celle de la valeur d'en-tĂȘte correspondante.

Le principe de cette variante est donc de tenter de gĂ©nĂ©rer une erreur 404 Not Found depuis une requĂȘte lĂ©gitime (exp: GET /index.html) en remplaçant la mĂ©thode HTTP via une de ces en-tĂȘtes.

De ce fait, si GET /index.html est mise en cache, il sera possible de mettre en cache la réponse comme si il s'agissait d'un POST /index.html par exemple.

Exemple:

GET /index.html                                    404 Not Found
X-Method-Override: POST                            X-Cache: HIT

Host Header Case Normalization (HHCN)

Selon la RFC 4343, les noms de domaine complets (FQDN) doivent toujours ĂȘtre insensibles Ă  la casse. Cependant, pour une raison quelconque, cette rĂšgle n'est pas toujours respectĂ©e par les frameworks. Il est intĂ©ressant de noter que, comme la valeur de l'hĂŽte doit ĂȘtre insensible Ă  la casse, certains dĂ©veloppeurs supposent qu'il est prudent de mettre en minuscules la valeur de l'en-tĂȘte de l'hĂŽte lors de son introduction dans la clĂ© de cache, sans modifier la requĂȘte rĂ©elle envoyĂ©e au serveur principal.

De ce fait, il est parfois possible de gĂ©nĂ©rer des erreurs 404 mises en cache en ajoutant une majuscule dans l'en-tĂȘte Host de la requĂȘte.

Exemple:

Host: Cdn.target.xyz au lieu de Host: cdn.target.xyz

Hop By Hop (HBH)

Un en-tĂȘte hop-by-hop est un en-tĂȘte conçu pour ĂȘtre traitĂ© et consommĂ© par le proxy qui gĂšre la requĂȘte, par opposition Ă  un en-tĂȘte end-to-end, qui est conçu pour ĂȘtre prĂ©sent dans la requĂȘte jusqu'Ă  la fin de la requĂȘte. Selon la RFC 2612, la spĂ©cification HTTP/1.1 traite les en-tĂȘtes suivants comme hop-by-hop par dĂ©faut : Keep-Alive, Transfer-Encoding, TE, Connection, Trailer, Upgrade, Proxy-Authorization et Proxy-Authenticate. Lorsqu'il rencontre ces en-tĂȘtes dans une requĂȘte, un proxy conforme doit traiter ou agir sur ce que ces en-tĂȘtes indiquent, et ne pas les transmettre au saut suivant.

Outre ces valeurs par dĂ©faut, une requĂȘte peut Ă©galement dĂ©finir un ensemble personnalisĂ© d'en-tĂȘtes Ă  traiter comme un en-tĂȘte hop-by-hop en les ajoutant Ă  l'en-tĂȘte de connexion, comme ceci :

Connection : close, X-Foo, X-Bar

Dans cet exemple, nous demandons au proxy de traiter X-Foo et X-Bar comme une en-tĂȘte hop-by-hop, ce qui signifie que nous voulons qu'un proxy les supprime de la requĂȘte avant de la transmettre. C'est ce fonctionnement qui permet l'exploitation de cette variante de CPDoS.

Spécificités

Certains frameworks et serveurs web utilisent des délimiteurs qui peuvent permettre de tromper les serveurs de cache.

Wordlist utile:

Spring

Par exemple, Spring permet d'utiliser des semicolon comme paramĂštres:

  • /user;params/home sera traitĂ© comme /user/home

  • MyAccount;a.js sera traitĂ© comme /MyAccount

Or, si le serveur met en cache les ressources en .js, le contenu sensible de MyAccount sera mis en cache.

Rails

De la mĂȘme maniĂšre, Rails utilise le . (point) pour afficher les vues, mais toutes les extensions ne sont pas prises en charge par le framework.

Par exemple:

  • /MyAccount affichera la vue myaccount.html.erb

  • /MyAccount.css affichera la vue myaccount.css.erb

Cependant,

  • /MyAccount.aaa ne sera pas reconnu et affichera la vue par dĂ©faut qui est myaccount.html.erb

Cela signifie que si le serveur de cache est configuré pour mettre en cache des extensions n'étant pas reconnues par le framework, il est possible de mettre en cache le contenu de /MyAccount.

Exemple: MyAccount.ico pourrait ĂȘtre mis en cache et afficher la vue myaccount.html.erb

Nginx

mĂȘme chose avec %0A:

  • /MyAccount%0A.js => /MyAccount

Ressources

Outils

Extension Burp Param Miner

Param Miner est une extension de Burp Suite permettant d'automatiser la recherche d'entrées sans clé.

Utilisation: clic droit sur la requĂȘte > "Extensions" > "Param Miner" > ...

Résultats visible dans l'onglet "Extender" > "Extensions" > "Param Miner" > "Output"

HExHTTP

Header Exploitation HTTP est un outil permettant de tester les vulnĂ©rabilitĂ©s liĂ©es aux en-tĂȘtes HTTP qui comprend notamment des tests liĂ©s au cache.

Exemple d'utilisation:

$ python3 hexhttp.py -u https://target.com/

ressource: https://github.com/c0dejump/HExHTTP

wcDetect

wcDetect est un outil spécialement conçu pour détecter les vulnérabilités de cache deception.

Exemple d'utilisation:

$ python3 wcdetect.py -u https://target.com/

ressource: https://github.com/c0dejump/wcDetect

DerniĂšre mise Ă  jour

Cet article vous a-t-il été utile ?