Cache Poisoning and Cache Deception
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nutze Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden. Erhalte heute Zugang:
Was ist der Unterschied zwischen Web-Cache-Poisoning und Web-Cache-Deception?
Bei Web-Cache-Poisoning verursacht der Angreifer, dass die Anwendung schädliche Inhalte im Cache speichert, und diese Inhalte werden aus dem Cache an andere Anwendungsbenutzer ausgeliefert.
Bei Web-Cache-Deception verursacht der Angreifer, dass die Anwendung sensible Inhalte eines anderen Benutzers im Cache speichert, und der Angreifer ruft dann diese Inhalte aus dem Cache ab.
Cache-Poisoning zielt darauf ab, den Client-seitigen Cache zu manipulieren, um Clients dazu zu bringen, Ressourcen zu laden, die unerwartet, teilweise oder unter der Kontrolle eines Angreifers stehen. Das Ausmaß der Auswirkungen hängt von der Popularität der betroffenen Seite ab, da die kontaminierte Antwort ausschließlich an Benutzer ausgeliefert wird, die die Seite während der Cache-Kontamination besuchen.
Die Durchführung eines Cache-Poisoning-Angriffs umfasst mehrere Schritte:
Identifizierung von Unschlüsselbaren Eingaben: Dies sind Parameter, die, obwohl sie nicht erforderlich sind, damit eine Anfrage im Cache gespeichert wird, die Antwort des Servers ändern können. Die Identifizierung dieser Eingaben ist entscheidend, da sie ausgenutzt werden können, um den Cache zu manipulieren.
Ausnutzung der Unschlüsselbaren Eingaben: Nach der Identifizierung der unschlüsselbaren Eingaben besteht der nächste Schritt darin, herauszufinden, wie man diese Parameter missbrauchen kann, um die Antwort des Servers in einer Weise zu ändern, die dem Angreifer zugutekommt.
Sicherstellen, dass die vergiftete Antwort im Cache gespeichert wird: Der letzte Schritt besteht darin, sicherzustellen, dass die manipulierte Antwort im Cache gespeichert wird. Auf diese Weise erhält jeder Benutzer, der die betroffene Seite besucht, während der Cache vergiftet ist, die kontaminierte Antwort.
Normalerweise gibt es, wenn eine Antwort im Cache gespeichert wurde, einen Header, der dies anzeigt. Du kannst überprüfen, auf welche Header du in diesem Beitrag achten solltest: HTTP-Cache-Header.
Wenn du denkst, dass die Antwort im Cache gespeichert wird, könntest du versuchen, Anfragen mit einem fehlerhaften Header zu senden, auf die mit einem Statuscode 400 geantwortet werden sollte. Versuche dann, die Anfrage normal zuzugreifen, und wenn die Antwort ein 400-Statuscode ist, weißt du, dass es anfällig ist (und du könntest sogar einen DoS durchführen).
Du kannst weitere Optionen in finden:
Cache Poisoning to DoSBeachte jedoch, dass manchmal diese Arten von Statuscodes nicht im Cache gespeichert werden, sodass dieser Test möglicherweise nicht zuverlässig ist.
Du könntest Param Miner verwenden, um Parameter und Header zu bruteforcen, die möglicherweise die Antwort der Seite ändern. Zum Beispiel könnte eine Seite den Header X-Forwarded-For
verwenden, um dem Client anzuzeigen, dass das Skript von dort geladen werden soll:
Mit dem identifizierten Parameter/Header überprüfen, wie er bereinigt wird und wo er reflektiert wird oder die Antwort aus dem Header beeinflusst. Kannst du es irgendwie ausnutzen (eine XSS durchführen oder einen von dir kontrollierten JS-Code laden? einen DoS durchführen?...)
Sobald du die Seite identifiziert hast, die ausgenutzt werden kann, welchen Parameter/Header du verwenden und wie du ihn ausnutzen kannst, musst du die Seite im Cache speichern. Je nach Ressource, die du im Cache speichern möchtest, kann dies einige Zeit in Anspruch nehmen; du musst möglicherweise mehrere Sekunden lang versuchen.
Der Header X-Cache
in der Antwort könnte sehr nützlich sein, da er den Wert miss
haben kann, wenn die Anfrage nicht im Cache gespeichert wurde, und den Wert hit
, wenn sie im Cache gespeichert ist.
Der Header Cache-Control
ist ebenfalls interessant, um zu wissen, ob eine Ressource im Cache gespeichert wird und wann die Ressource das nächste Mal wieder im Cache gespeichert wird: Cache-Control: public, max-age=1800
Ein weiterer interessanter Header ist Vary
. Dieser Header wird häufig verwendet, um zusätzliche Header anzugeben, die als Teil des Cache-Schlüssels behandelt werden, auch wenn sie normalerweise nicht als Schlüssel verwendet werden. Daher kann der Benutzer, wenn er den User-Agent
des Opfers kennt, das er anvisiert, den Cache für die Benutzer mit diesem spezifischen User-Agent
vergiften.
Ein weiterer Header, der mit dem Cache zusammenhängt, ist Age
. Er definiert die Zeit in Sekunden, die das Objekt im Proxy-Cache war.
Beim Caching einer Anfrage sei vorsichtig mit den Headern, die du verwendest, da einige von ihnen unerwartet als schlüsselig verwendet werden könnten und das Opfer diesen gleichen Header verwenden muss. Immer testen einer Cache-Vergiftung mit verschiedenen Browsern, um zu überprüfen, ob es funktioniert.
Ein Header wie X-Forwarded-For
wird unsanitized in der Antwort reflektiert.
Du kannst eine grundlegende XSS-Payload senden und den Cache vergiften, sodass jeder, der auf die Seite zugreift, XSSed wird:
Note that this will poison a request to /en?region=uk
not to /en
Cookies könnten auch in der Antwort einer Seite reflektiert werden. Wenn Sie dies missbrauchen können, um beispielsweise ein XSS zu verursachen, könnten Sie in der Lage sein, XSS in mehreren Clients auszunutzen, die die bösartige Cache-Antwort laden.
Beachten Sie, dass, wenn das verwundbare Cookie von den Benutzern häufig verwendet wird, regelmäßige Anfragen den Cache bereinigen.
Überprüfen Sie:
Cache Poisoning via URL discrepanciesDieser Bericht erklärt, wie es möglich war, einen OpenAI API-Schlüssel mit einer URL wie https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123
zu stehlen, da alles, was mit /share/*
übereinstimmt, ohne dass Cloudflare die URL normalisiert, im Cache gespeichert wird, was geschah, als die Anfrage den Webserver erreichte.
Dies wird auch besser erklärt in:
Cache Poisoning via URL discrepanciesManchmal müssen Sie mehrere unverschlüsselte Eingaben ausnutzen, um einen Cache zu missbrauchen. Zum Beispiel können Sie einen Open Redirect finden, wenn Sie X-Forwarded-Host
auf eine von Ihnen kontrollierte Domain und X-Forwarded-Scheme
auf http
setzen. Wenn der Server alle HTTP-Anfragen an HTTPS weiterleitet und den Header X-Forwarded-Scheme
als Domainnamen für die Weiterleitung verwendet. Sie können steuern, wohin die Seite durch die Weiterleitung zeigt.
Vary
-HeadersWenn Sie festgestellt haben, dass der X-Host
-Header als Domainname zum Laden einer JS-Ressource verwendet wird, der Vary
-Header in der Antwort jedoch User-Agent
angibt, müssen Sie einen Weg finden, den User-Agent des Opfers zu exfiltrieren und den Cache mit diesem User-Agent zu vergiften:
Senden Sie eine GET-Anfrage mit der Anfrage in der URL und im Body. Wenn der Webserver den aus dem Body verwendet, der Cache-Server jedoch den aus der URL cached, wird jeder, der auf diese URL zugreift, tatsächlich den Parameter aus dem Body verwenden. Wie die Schwachstelle, die James Kettle auf der Github-Website gefunden hat:
There it a portswigger lab about this: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get
Zum Beispiel ist es möglich, Parameter in Ruby-Servern mit dem Zeichen ;
anstelle von &
zu trennen. Dies könnte verwendet werden, um unverschlüsselte Parameterwerte in verschlüsselten zu platzieren und sie auszunutzen.
Portswigger lab: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking
Erfahren Sie hier, wie man Cache Poisoning-Angriffe durch Ausnutzung von HTTP Request Smuggling durchführt.
Der Web Cache Vulnerability Scanner kann verwendet werden, um automatisch nach Web-Cache-Poisoning zu testen. Er unterstützt viele verschiedene Techniken und ist hochgradig anpassbar.
Beispielverwendung: wcvs -u example.com
ATS leitete den Fragmentteil innerhalb der URL weiter, ohne ihn zu entfernen, und generierte den Cache-Schlüssel nur unter Verwendung des Hosts, des Pfads und der Abfrage (das Fragment ignorierend). Daher wurde die Anfrage /#/../?r=javascript:alert(1)
an das Backend als /#/../?r=javascript:alert(1)
gesendet, und der Cache-Schlüssel hatte die Payload nicht darin, nur Host, Pfad und Abfrage.
Das Senden eines fehlerhaften Wertes im Content-Type-Header löste eine 405-Cache-Antwort aus. Der Cache-Schlüssel enthielt das Cookie, sodass es nur möglich war, nicht authentifizierte Benutzer anzugreifen.
GitLab verwendet GCP-Buckets zur Speicherung statischer Inhalte. GCP Buckets unterstützen den Header x-http-method-override
. Daher war es möglich, den Header x-http-method-override: HEAD
zu senden und den Cache so zu vergiften, dass er einen leeren Antwortkörper zurückgibt. Es könnte auch die Methode PURGE
unterstützen.
In Ruby on Rails-Anwendungen wird häufig Rack-Middleware verwendet. Der Zweck des Rack-Codes besteht darin, den Wert des x-forwarded-scheme
-Headers zu übernehmen und ihn als Schema der Anfrage festzulegen. Wenn der Header x-forwarded-scheme: http
gesendet wird, erfolgt eine 301-Weiterleitung an denselben Ort, was möglicherweise zu einer Denial of Service (DoS) für diese Ressource führt. Darüber hinaus könnte die Anwendung den X-forwarded-host
-Header anerkennen und Benutzer an den angegebenen Host umleiten. Dieses Verhalten kann dazu führen, dass JavaScript-Dateien von einem Server des Angreifers geladen werden, was ein Sicherheitsrisiko darstellt.
Cloudflare hat zuvor 403-Antworten zwischengespeichert. Der Versuch, auf S3 oder Azure Storage Blobs mit falschen Autorisierungsheadern zuzugreifen, führte zu einer 403-Antwort, die zwischengespeichert wurde. Obwohl Cloudflare das Zwischenspeichern von 403-Antworten eingestellt hat, könnte dieses Verhalten weiterhin in anderen Proxy-Diensten vorhanden sein.
Caches enthalten häufig spezifische GET-Parameter im Cache-Schlüssel. Zum Beispiel speicherte Fastlys Varnish den size
-Parameter in Anfragen. Wenn jedoch eine URL-kodierte Version des Parameters (z. B. siz%65
) auch mit einem fehlerhaften Wert gesendet wurde, wurde der Cache-Schlüssel unter Verwendung des korrekten size
-Parameters konstruiert. Das Backend würde jedoch den Wert im URL-kodierten Parameter verarbeiten. Die URL-Kodierung des zweiten size
-Parameters führte zu dessen Auslassung durch den Cache, aber zu seiner Verwendung durch das Backend. Das Zuweisen eines Wertes von 0 zu diesem Parameter führte zu einem zwischenspeicherbaren 400 Bad Request-Fehler.
Einige Entwickler blockieren Anfragen mit User-Agents, die mit denen von stark frequentierten Tools wie FFUF oder Nuclei übereinstimmen, um die Serverlast zu verwalten. Ironischerweise kann dieser Ansatz Schwachstellen wie Cache Poisoning und DoS einführen.
Die RFC7230 spezifiziert die akzeptablen Zeichen in Headernamen. Header, die Zeichen außerhalb des angegebenen tchar-Bereichs enthalten, sollten idealerweise eine 400 Bad Request-Antwort auslösen. In der Praxis halten sich Server jedoch nicht immer an diesen Standard. Ein bemerkenswertes Beispiel ist Akamai, das Header mit ungültigen Zeichen weiterleitet und jeden 400-Fehler zwischenspeichert, solange der cache-control
-Header nicht vorhanden ist. Ein ausnutzbares Muster wurde identifiziert, bei dem das Senden eines Headers mit einem illegalen Zeichen, wie \
, zu einem zwischenspeicherbaren 400 Bad Request-Fehler führte.
https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6
Das Ziel der Cache Deception ist es, dass Clients Ressourcen laden, die mit ihren sensiblen Informationen vom Cache gespeichert werden.
Zunächst ist zu beachten, dass Erweiterungen wie .css
, .js
, .png
usw. normalerweise konfiguriert sind, um im Cache gespeichert zu werden. Daher wird der Cache wahrscheinlich die Antwort speichern, wenn Sie auf www.example.com/profile.php/nonexistent.js
zugreifen, da er die .js
Erweiterung sieht. Wenn die Anwendung jedoch mit den sensiblen Benutzerinhalten, die in www.example.com/profile.php gespeichert sind, wiedergibt, können Sie diese Inhalte von anderen Benutzern stehlen.
Weitere Dinge, die getestet werden sollten:
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
Verwenden Sie weniger bekannte Erweiterungen wie .avif
Ein weiteres sehr klares Beispiel finden Sie in diesem Bericht: https://hackerone.com/reports/593712. In dem Beispiel wird erklärt, dass, wenn Sie eine nicht vorhandene Seite wie http://www.example.com/home.php/non-existent.css laden, der Inhalt von http://www.example.com/home.php (mit den sensiblen Informationen des Benutzers) zurückgegeben wird und der Cache-Server das Ergebnis speichern wird. Dann kann der Angreifer http://www.example.com/home.php/non-existent.css in seinem eigenen Browser aufrufen und die vertraulichen Informationen der Benutzer beobachten, die zuvor darauf zugegriffen haben.
Beachten Sie, dass der Cache-Proxy so konfiguriert sein sollte, dass er Dateien basierend auf der Erweiterung der Datei (_ .css_) und nicht basierend auf dem Content-Type zwischenspeichert. Im Beispiel http://www.example.com/home.php/non-existent.css wird ein text/html
-Content-Type anstelle eines text/css
-Mime-Typs (der für eine .css-Datei erwartet wird) haben.
Erfahren Sie hier, wie man Cache Deceptions-Angriffe durch Ausnutzung von HTTP Request Smuggling durchführt.
toxicache: Golang-Scanner, um Web-Cache-Poisoning-Schwachstellen in einer Liste von URLs zu finden und mehrere Injektionstechniken zu testen.
Verwenden Sie Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden. Zugriff heute erhalten:
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)