Cache Poisoning and Cache Deception
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Jaka jest różnica między złośliwym przechowywaniem pamięci podręcznej a oszustwem pamięci podręcznej?
W złośliwym przechowywaniu pamięci podręcznej atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej złośliwą zawartość, a ta zawartość jest serwowana z pamięci podręcznej innym użytkownikom aplikacji.
W oszustwie pamięci podręcznej atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej wrażliwą zawartość należącą do innego użytkownika, a następnie atakujący odzyskuje tę zawartość z pamięci podręcznej.
Złośliwe przechowywanie pamięci podręcznej ma na celu manipulację pamięcią podręczną po stronie klienta, aby zmusić klientów do ładowania zasobów, które są nieoczekiwane, częściowe lub pod kontrolą atakującego. Zakres wpływu zależy od popularności dotkniętej strony, ponieważ skażona odpowiedź jest serwowana wyłącznie użytkownikom odwiedzającym stronę w okresie zanieczyszczenia pamięci podręcznej.
Wykonanie ataku złośliwego przechowywania pamięci podręcznej obejmuje kilka kroków:
Identyfikacja niekluczowych wejść: Są to parametry, które, chociaż nie są wymagane do przechowywania żądania w pamięci podręcznej, mogą zmieniać odpowiedź zwracaną przez serwer. Identyfikacja tych wejść jest kluczowa, ponieważ mogą być wykorzystywane do manipulacji pamięcią podręczną.
Wykorzystanie niekluczowych wejść: Po zidentyfikowaniu niekluczowych wejść, kolejnym krokiem jest ustalenie, jak niewłaściwie wykorzystać te parametry, aby zmodyfikować odpowiedź serwera w sposób korzystny dla atakującego.
Zapewnienie, że skażona odpowiedź jest przechowywana w pamięci podręcznej: Ostatnim krokiem jest upewnienie się, że zmanipulowana odpowiedź jest przechowywana w pamięci podręcznej. W ten sposób każdy użytkownik uzyskujący dostęp do dotkniętej strony podczas zanieczyszczenia pamięci podręcznej otrzyma skażoną odpowiedź.
Zazwyczaj, gdy odpowiedź została przechowywana w pamięci podręcznej, będzie nagłówek to wskazujący, możesz sprawdzić, na które nagłówki powinieneś zwrócić uwagę w tym poście: Nagłówki pamięci podręcznej HTTP.
Jeśli myślisz, że odpowiedź jest przechowywana w pamięci podręcznej, możesz spróbować wysłać żądania z błędnym nagłówkiem, na które powinno być odpowiedziane kodem statusu 400. Następnie spróbuj uzyskać dostęp do żądania normalnie, a jeśli odpowiedź to kod statusu 400, wiesz, że jest podatne (a nawet możesz przeprowadzić DoS).
Możesz znaleźć więcej opcji w:
Cache Poisoning to DoSJednak zauważ, że czasami te rodzaje kodów statusu nie są przechowywane w pamięci podręcznej, więc ten test może nie być wiarygodny.
Możesz użyć Param Miner do brute-force'owania parametrów i nagłówków, które mogą zmieniać odpowiedź strony. Na przykład, strona może używać nagłówka X-Forwarded-For
, aby wskazać klientowi załadowanie skryptu stamtąd:
Po zidentyfikowaniu parametru/nagłówka sprawdź, jak jest on sanitizowany i gdzie jest odzwierciedlany lub wpływa na odpowiedź z nagłówka. Czy możesz to w jakiś sposób wykorzystać (wykonać XSS lub załadować kontrolowany przez siebie kod JS? wykonać DoS?...)
Gdy już zidentyfikujesz stronę, którą można wykorzystać, który parametr/nagłówek użyć i jak go wykorzystać, musisz uzyskać stronę w pamięci podręcznej. W zależności od zasobu, który próbujesz umieścić w pamięci podręcznej, może to zająć trochę czasu, możesz musieć próbować przez kilka sekund.
Nagłówek X-Cache
w odpowiedzi może być bardzo przydatny, ponieważ może mieć wartość miss
, gdy żądanie nie zostało zapisane w pamięci podręcznej, oraz wartość hit
, gdy jest w pamięci podręcznej.
Nagłówek Cache-Control
jest również interesujący, aby wiedzieć, czy zasób jest buforowany i kiedy będzie następny raz buforowany: Cache-Control: public, max-age=1800
Innym interesującym nagłówkiem jest Vary
. Ten nagłówek jest często używany do wskazywania dodatkowych nagłówków, które są traktowane jako część klucza pamięci podręcznej, nawet jeśli normalnie nie są kluczowane. Dlatego, jeśli użytkownik zna User-Agent
ofiary, którą celuje, może zanieczyścić pamięć podręczną dla użytkowników korzystających z tego konkretnego User-Agent
.
Jeszcze jednym nagłówkiem związanym z pamięcią podręczną jest Age
. Określa czas w sekundach, przez jaki obiekt był w pamięci podręcznej proxy.
Podczas buforowania żądania, bądź ostrożny z nagłówkami, których używasz, ponieważ niektóre z nich mogą być używane w sposób nieoczekiwany jako kluczowane, a ofiara będzie musiała użyć tego samego nagłówka. Zawsze testuj zanieczyszczenie pamięci podręcznej przy użyciu różnych przeglądarek, aby sprawdzić, czy działa.
Nagłówek taki jak X-Forwarded-For
jest odzwierciedlany w odpowiedzi bez sanitizacji.
Możesz wysłać podstawowy ładunek XSS i zanieczyścić pamięć podręczną, aby każdy, kto uzyska dostęp do strony, został zaatakowany XSS:
Note that this will poison a request to /en?region=uk
not to /en
Ciasteczka mogą być również odzwierciedlane w odpowiedzi strony. Jeśli możesz to wykorzystać do spowodowania XSS, na przykład, możesz być w stanie wykorzystać XSS w kilku klientach, które ładują złośliwą odpowiedź z pamięci podręcznej.
Zauważ, że jeśli podatny cookie jest często używany przez użytkowników, regularne żądania będą czyścić pamięć podręczną.
Sprawdź:
Cache Poisoning via URL discrepanciesTen artykuł wyjaśnia jak możliwe było skradzenie klucza API OpenAI za pomocą URL-a takiego jak https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123
, ponieważ wszystko, co pasuje do /share/*
, będzie buforowane bez normalizacji URL przez Cloudflare, co miało miejsce, gdy żądanie dotarło do serwera webowego.
Jest to również lepiej wyjaśnione w:
Cache Poisoning via URL discrepanciesCzasami będziesz musiał wykorzystać kilka niekluczowanych wejść, aby móc nadużyć pamięci podręcznej. Na przykład, możesz znaleźć otwarty przekierowanie, jeśli ustawisz X-Forwarded-Host
na domenę kontrolowaną przez Ciebie i X-Forwarded-Scheme
na http
. Jeśli serwer przekazuje wszystkie żądania HTTP do HTTPS i używa nagłówka X-Forwarded-Scheme
jako nazwy domeny dla przekierowania. Możesz kontrolować, gdzie strona jest skierowana przez przekierowanie.
Vary
Jeśli odkryłeś, że nagłówek X-Host
jest używany jako nazwa domeny do ładowania zasobu JS, ale nagłówek Vary
w odpowiedzi wskazuje na User-Agent
. W takim razie musisz znaleźć sposób na wyekstrahowanie User-Agent ofiary i zanieczyszczenie pamięci podręcznej przy użyciu tego user agenta:
Wyślij żądanie GET z żądaniem w URL i w ciele. Jeśli serwer WWW używa tego z ciała, ale serwer cache'ujący przechowuje to z URL, każdy, kto uzyskuje dostęp do tego URL, faktycznie użyje parametru z ciała. Jak w przypadku luki, którą znalazł James Kettle na stronie Github:
There it a portswigger lab about this: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get
Na przykład, możliwe jest oddzielenie parametrów na serwerach ruby przy użyciu znaku ;
zamiast &
. Może to być użyte do umieszczania wartości parametrów bez kluczy wewnątrz tych z kluczami i ich nadużywania.
Portswigger lab: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking
Dowiedz się tutaj, jak przeprowadzać ataki Cache Poisoning, nadużywając HTTP Request Smuggling.
Web Cache Vulnerability Scanner może być używany do automatycznego testowania pod kątem web cache poisoning. Obsługuje wiele różnych technik i jest wysoce konfigurowalny.
Przykład użycia: wcvs -u example.com
ATS przesłał fragment w URL bez jego usuwania i wygenerował klucz cache tylko przy użyciu hosta, ścieżki i zapytania (ignorując fragment). Tak więc żądanie /#/../?r=javascript:alert(1)
zostało wysłane do backendu jako /#/../?r=javascript:alert(1)
i klucz cache nie zawierał ładunku, tylko host, ścieżkę i zapytanie.
Wysłanie złej wartości w nagłówku content-type spowodowało wyzwolenie odpowiedzi 405 w cache. Klucz cache zawierał ciasteczko, więc możliwe było zaatakowanie tylko użytkowników nieautoryzowanych.
GitLab używa koszy GCP do przechowywania treści statycznych. GCP Buckets obsługują nagłówek x-http-method-override
. Tak więc możliwe było wysłanie nagłówka x-http-method-override: HEAD
i zanieczyszczenie cache, aby zwrócił pustą treść odpowiedzi. Mogło to również wspierać metodę PURGE
.
W aplikacjach Ruby on Rails często wykorzystywane jest middleware Rack. Celem kodu Rack jest pobranie wartości nagłówka x-forwarded-scheme
i ustawienie go jako schematu żądania. Gdy nagłówek x-forwarded-scheme: http
jest wysyłany, następuje przekierowanie 301 do tej samej lokalizacji, co potencjalnie może spowodować Denial of Service (DoS) dla tego zasobu. Dodatkowo, aplikacja może uznawać nagłówek X-forwarded-host
i przekierowywać użytkowników do określonego hosta. To zachowanie może prowadzić do ładowania plików JavaScript z serwera atakującego, co stanowi zagrożenie dla bezpieczeństwa.
Cloudflare wcześniej cache'ował odpowiedzi 403. Próba dostępu do S3 lub Azure Storage Blobs z nieprawidłowymi nagłówkami autoryzacji skutkowała odpowiedzią 403, która była cache'owana. Chociaż Cloudflare przestał cache'ować odpowiedzi 403, to zachowanie może nadal występować w innych usługach proxy.
Cache często zawiera konkretne parametry GET w kluczu cache. Na przykład, Varnish Fastly cache'ował parametr size
w żądaniach. Jednak jeśli wysłano również URL-encoded wersję parametru (np. siz%65
) z błędną wartością, klucz cache byłby konstruowany przy użyciu poprawnego parametru size
. Jednak backend przetwarzałby wartość w URL-encoded parametrze. URL-encoding drugiego parametru size
prowadził do jego pominięcia przez cache, ale jego wykorzystania przez backend. Przypisanie wartości 0 do tego parametru skutkowało błędem 400 Bad Request, który można było cache'ować.
Niektórzy deweloperzy blokują żądania z user-agentami odpowiadającymi narzędziom o dużym ruchu, takim jak FFUF czy Nuclei, aby zarządzać obciążeniem serwera. Ironią jest to, że podejście to może wprowadzać luki, takie jak cache poisoning i DoS.
RFC7230 określa akceptowalne znaki w nazwach nagłówków. Nagłówki zawierające znaki spoza określonego zakresu tchar powinny idealnie wyzwalać odpowiedź 400 Bad Request. W praktyce serwery nie zawsze przestrzegają tego standardu. Znaczącym przykładem jest Akamai, które przesyła nagłówki z nieprawidłowymi znakami i cache'uje każdy błąd 400, o ile nagłówek cache-control
nie jest obecny. Zidentyfikowano wzorzec, w którym wysłanie nagłówka z nielegalnym znakiem, takim jak \
, skutkowało cache'owalnym błędem 400 Bad Request.
https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6
Celem Cache Deception jest sprawienie, aby klienci ładowali zasoby, które będą zapisywane przez cache z ich wrażliwymi informacjami.
Przede wszystkim zauważ, że rozszerzenia takie jak .css
, .js
, .png
itp. są zazwyczaj konfigurowane do zapisywania w cache. Dlatego, jeśli uzyskasz dostęp do www.example.com/profile.php/nonexistent.js
, cache prawdopodobnie zapisze odpowiedź, ponieważ widzi rozszerzenie .js
. Ale, jeśli aplikacja odpowiada wrażliwymi treściami użytkownika przechowywanymi w www.example.com/profile.php, możesz ukraść te treści od innych użytkowników.
Inne rzeczy do przetestowania:
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
Użyj mniej znanych rozszerzeń, takich jak .avif
Inny bardzo jasny przykład można znaleźć w tym opisie: https://hackerone.com/reports/593712. W przykładzie wyjaśniono, że jeśli załadujesz nieistniejącą stronę, taką jak http://www.example.com/home.php/non-existent.css, treść http://www.example.com/home.php (z wrażliwymi informacjami użytkownika) zostanie zwrócona, a serwer cache zapisze wynik. Następnie atakujący może uzyskać dostęp do http://www.example.com/home.php/non-existent.css w swojej przeglądarce i obserwować poufne informacje użytkowników, którzy uzyskali dostęp wcześniej.
Zauważ, że cache proxy powinno być skonfigurowane do cache'owania plików na podstawie rozszerzenia pliku (.css) a nie na podstawie content-type. W przykładzie http://www.example.com/home.php/non-existent.css będzie miało text/html
content-type zamiast text/css
mime type (co jest oczekiwane dla pliku .css).
Dowiedz się tutaj, jak przeprowadzać ataki Cache Deceptions, nadużywając HTTP Request Smuggling.
toxicache: skaner Golang do znajdowania luk w web cache poisoning w liście URL i testowania wielu technik wstrzykiwania.
Użyj Trickest, aby łatwo budować i automatyzować przepływy pracy zasilane przez najbardziej zaawansowane narzędzia społeczności. Uzyskaj dostęp już dziś:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)