CORS - Misconfigurations & Bypass
Last updated
Last updated
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)
Cross-Origin Resource Sharing (CORS) standard umożliwia serwerom określenie, kto może uzyskać dostęp do ich zasobów oraz które metody żądań HTTP są dozwolone z zewnętrznych źródeł.
Polityka same-origin wymaga, aby serwer żądający zasobu i serwer hostujący zasób dzieliły ten sam protokół (np. http://
), nazwę domeny (np. internal-web.com
) oraz port (np. 80). Zgodnie z tą polityką, tylko strony internetowe z tej samej domeny i portu mają dostęp do zasobów.
Zastosowanie polityki same-origin w kontekście http://normal-website.com/example/example.html
ilustruje się następująco:
Uzyskany URL | Czy dostęp dozwolony? |
---|---|
| Tak: Identyczny schemat, domena i port |
| Tak: Identyczny schemat, domena i port |
| Nie: Inne schemat i port |
| Nie: Inna domena |
| Nie: Inna domena |
| Nie: Inny port* |
*Internet Explorer ignoruje numer portu przy egzekwowaniu polityki same-origin, co pozwala na ten dostęp.
Access-Control-Allow-Origin
Ten nagłówek może zezwalać na wiele źródeł, wartość null
lub znak wieloznaczny *
. Jednak żaden przeglądarka nie obsługuje wielu źródeł, a użycie znaku wieloznacznego *
podlega ograniczeniom. (Znak wieloznaczny musi być używany samodzielnie, a jego użycie razem z Access-Control-Allow-Credentials: true
nie jest dozwolone.)
Ten nagłówek jest wydawany przez serwer w odpowiedzi na żądanie zasobu z innej domeny zainicjowane przez stronę internetową, przy czym przeglądarka automatycznie dodaje nagłówek Origin
.
Access-Control-Allow-Credentials
Zasadniczo, żądania międzydomenowe są realizowane bez poświadczeń, takich jak ciasteczka lub nagłówek autoryzacji. Jednak serwer międzydomenowy może zezwolić na odczyt odpowiedzi, gdy poświadczenia są wysyłane, ustawiając nagłówek Access-Control-Allow-Credentials
na true
.
Jeśli ustawiony na true
, przeglądarka przekaże poświadczenia (ciasteczka, nagłówki autoryzacji lub certyfikaty klienta TLS).
Kiedy inicjowane jest żądanie międzydomenowe w określonych warunkach, takich jak użycie niestandardowej metody HTTP (czegokolwiek innego niż HEAD, GET, POST), wprowadzenie nowych nagłówków lub zastosowanie specjalnej wartości nagłówka Content-Type, może być wymagane żądanie wstępne. To wstępne żądanie, wykorzystujące metodę OPTIONS
, ma na celu poinformowanie serwera o zamiarach nadchodzącego żądania międzydomenowego, w tym o metodach HTTP i nagłówkach, które zamierza użyć.
Protokół Cross-Origin Resource Sharing (CORS) wymaga tego sprawdzenia wstępnego, aby określić wykonalność żądanej operacji międzydomenowej, weryfikując dozwolone metody, nagłówki oraz wiarygodność źródła. Aby uzyskać szczegółowe informacje na temat warunków, które omijają potrzebę żądania wstępnego, zapoznaj się z obszernym przewodnikiem dostarczonym przez Mozilla Developer Network (MDN).
Ważne jest, aby zauważyć, że brak żądania wstępnego nie znosi wymogu, aby odpowiedź zawierała nagłówki autoryzacji. Bez tych nagłówków przeglądarka jest niezdolna do przetworzenia odpowiedzi z żądania międzydomenowego.
Rozważ następujący przykład żądania wstępnego mającego na celu użycie metody PUT
wraz z niestandardowym nagłówkiem o nazwie Special-Request-Header
:
W odpowiedzi serwer może zwrócić nagłówki wskazujące akceptowane metody, dozwolony origin oraz inne szczegóły polityki CORS, jak pokazano poniżej:
Access-Control-Allow-Headers
: Ten nagłówek określa, które nagłówki mogą być używane podczas rzeczywistego żądania. Jest ustawiany przez serwer, aby wskazać dozwolone nagłówki w żądaniach od klienta.
Access-Control-Expose-Headers
: Dzięki temu nagłówkowi serwer informuje klienta, które nagłówki mogą być ujawnione jako część odpowiedzi oprócz prostych nagłówków odpowiedzi.
Access-Control-Max-Age
: Ten nagłówek wskazuje, jak długo wyniki żądania wstępnego mogą być buforowane. Serwer ustawia maksymalny czas, w sekundach, przez który informacje zwrócone przez żądanie wstępne mogą być ponownie używane.
Access-Control-Request-Headers
: Używany w żądaniach wstępnych, ten nagłówek jest ustawiany przez klienta, aby poinformować serwer, które nagłówki HTTP klient chce użyć w rzeczywistym żądaniu.
Access-Control-Request-Method
: Ten nagłówek, również używany w żądaniach wstępnych, jest ustawiany przez klienta, aby wskazać, która metoda HTTP będzie używana w rzeczywistym żądaniu.
Origin
: Ten nagłówek jest automatycznie ustawiany przez przeglądarkę i wskazuje pochodzenie żądania międzydomenowego. Jest używany przez serwer do oceny, czy nadchodzące żądanie powinno być dozwolone czy odrzucone na podstawie polityki CORS.
Należy zauważyć, że zazwyczaj (w zależności od typu zawartości i ustawionych nagłówków) w żądaniu GET/POST nie jest wysyłane żądanie wstępne (żądanie jest wysyłane bezpośrednio), ale jeśli chcesz uzyskać dostęp do nagłówków/ciała odpowiedzi, musi ono zawierać nagłówek Access-Control-Allow-Origin, który to umożliwia. Dlatego CORS nie chroni przed CSRF (ale może być pomocny).
Access-Control-Request-Local-Network
: Ten nagłówek jest dołączany do żądania klienta, aby zaznaczyć, że zapytanie jest skierowane do zasobu w lokalnej sieci. Służy jako znacznik informujący serwer, że żądanie pochodzi z lokalnej sieci.
Access-Control-Allow-Local-Network
: W odpowiedzi serwery wykorzystują ten nagłówek, aby zakomunikować, że żądany zasób może być udostępniany podmiotom spoza lokalnej sieci. Działa jako zielone światło dla udostępniania zasobów w różnych granicach sieci, zapewniając kontrolowany dostęp przy zachowaniu protokołów bezpieczeństwa.
Ważna odpowiedź zezwalająca na żądanie lokalnej sieci musi również zawierać w odpowiedzi nagłówek Access-Controls-Allow-Local_network: true
:
Zauważ, że adres IP linux 0.0.0.0 działa, aby obejść te wymagania dotyczące dostępu do localhost, ponieważ ten adres IP nie jest uważany za "lokalny".
Możliwe jest również obejście wymagań dotyczących sieci lokalnej, jeśli użyjesz publicznego adresu IP lokalnego punktu końcowego (jak publiczny adres IP routera). Ponieważ w kilku przypadkach, nawet jeśli publiczny IP jest używany, jeśli jest z sieci lokalnej, dostęp zostanie przyznany.
Zauważ, że nawet jeśli następująca konfiguracja może wyglądać na bardzo permissywną:
To nie jest dozwolone przez przeglądarki i dlatego poświadczenia nie będą wysyłane z żądaniem dozwolonym przez to.
Zaobserwowano, że ustawienie Access-Control-Allow-Credentials
na true
jest warunkiem wstępnym dla większości prawdziwych ataków. To ustawienie pozwala przeglądarce na wysyłanie poświadczeń i odczytywanie odpowiedzi, co zwiększa skuteczność ataku. Bez tego korzyść z wydania żądania przez przeglądarkę w porównaniu do zrobienia tego samodzielnie maleje, ponieważ wykorzystanie ciasteczek użytkownika staje się niewykonalne.
Istnieje wyjątek, w którym lokalizacja sieciowa ofiary działa jako forma uwierzytelnienia. Umożliwia to wykorzystanie przeglądarki ofiary jako proxy, omijając uwierzytelnienie oparte na adresie IP w celu uzyskania dostępu do aplikacji intranetowych. Metoda ta ma podobieństwa w skutkach do DNS rebinding, ale jest prostsza do wykorzystania.
Origin
w Access-Control-Allow-Origin
Scenariusz z rzeczywistego świata, w którym wartość nagłówka Origin
jest odbijana w Access-Control-Allow-Origin
, jest teoretycznie mało prawdopodobny z powodu ograniczeń dotyczących łączenia tych nagłówków. Jednak deweloperzy, którzy chcą włączyć CORS dla wielu adresów URL, mogą dynamicznie generować nagłówek Access-Control-Allow-Origin
, kopiując wartość nagłówka Origin
. Takie podejście może wprowadzać luki, szczególnie gdy atakujący wykorzystuje domenę o nazwie zaprojektowanej tak, aby wydawała się wiarygodna, wprowadzając w błąd logikę walidacji.
null
Originnull
origin, określony w sytuacjach takich jak przekierowania lub lokalne pliki HTML, zajmuje unikalną pozycję. Niektóre aplikacje dodają ten origin do białej listy, aby ułatwić lokalny rozwój, nieumyślnie pozwalając każdej stronie internetowej na naśladowanie null
origin za pomocą osadzonego iframe, co omija ograniczenia CORS.
Podczas napotkania białej listy domen, kluczowe jest testowanie możliwości ominięcia, takich jak dodanie domeny atakującego do dozwolonej domeny lub wykorzystanie luk w przejęciu subdomen. Dodatkowo, wyrażenia regularne używane do walidacji domen mogą pomijać niuanse w konwencjach nazewnictwa domen, co stwarza dalsze możliwości ominięcia.
Wzorce Regex zazwyczaj koncentrują się na znakach alfanumerycznych, kropkach (.) i myślnikach (-), zaniedbując inne możliwości. Na przykład, nazwa domeny stworzona w celu uwzględnienia znaków interpretowanych inaczej przez przeglądarki i wzorce regex może ominąć kontrole bezpieczeństwa. Obsługa znaków podkreślenia w subdomenach przez Safari, Chrome i Firefox ilustruje, jak takie rozbieżności mogą być wykorzystywane do obejścia logiki walidacji domen.
Aby uzyskać więcej informacji i ustawień tego sprawdzenia ominięcia: https://www.corben.io/advanced-cors-techniques/ i https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397
Programiści często wdrażają mechanizmy obronne, aby chronić przed wykorzystaniem CORS, tworząc białą listę domen, które mają prawo do żądania informacji. Pomimo tych środków ostrożności, bezpieczeństwo systemu nie jest niezawodne. Obecność nawet jednej podatnej subdomeny w dozwolonych domenach może otworzyć drzwi do wykorzystania CORS przez inne luki, takie jak XSS (Cross-Site Scripting).
Aby to zobrazować, rozważmy scenariusz, w którym domena requester.com
jest umieszczona na białej liście, aby uzyskać dostęp do zasobów z innej domeny, provider.com
. Konfiguracja po stronie serwera może wyglądać mniej więcej tak:
W tej konfiguracji wszystkie subdomeny requester.com
mają dostęp. Jednak jeśli subdomena, powiedzmy sub.requester.com
, jest skompromitowana z powodu podatności XSS, atakujący może wykorzystać tę słabość. Na przykład, atakujący z dostępem do sub.requester.com
mógłby wykorzystać podatność XSS, aby obejść polityki CORS i złośliwie uzyskać dostęp do zasobów na provider.com
.
PortSwigger’s URL validation bypass cheat sheet odkrył, że niektóre przeglądarki obsługują dziwne znaki w nazwach domen.
Chrome i Firefox obsługują podkreślenia _
, które mogą obejść regexy wdrożone do walidacji nagłówka Origin
:
Safari jest jeszcze bardziej pobłażliwy w akceptowaniu specjalnych znaków w nazwie domeny:
Możliwe jest, że poprzez wykorzystanie zatrucia pamięci podręcznej po stronie serwera za pomocą wstrzykiwania nagłówków HTTP, można wywołać przechowywaną podatność na Cross-Site Scripting (XSS). Scenariusz ten ma miejsce, gdy aplikacja nie oczyszcza nagłówka Origin
z nielegalnych znaków, co tworzy podatność szczególnie dla użytkowników Internet Explorera i Edge. Te przeglądarki traktują (0x0d) jako prawidłowy terminator nagłówka HTTP, co prowadzi do podatności na wstrzykiwanie nagłówków HTTP.
Rozważ następujące żądanie, w którym nagłówek Origin
jest manipulowany:
Internet Explorer i Edge interpretują odpowiedź jako:
While directly exploiting this vulnerability by making a web browser send a malformed header is not feasible, a crafted request can be manually generated using tools like Burp Suite. This method could lead to a server-side cache saving the response and inadvertently serving it to others. The crafted payload aims to alter the page's character set to UTF-7, a character encoding often associated with XSS vulnerabilities due to its ability to encode characters in a way that can be executed as script in certain contexts.
For further reading on stored XSS vulnerabilities, see PortSwigger.
Note: The exploitation of HTTP header injection vulnerabilities, particularly through server-side cache poisoning, underscores the critical importance of validating and sanitizing all user-supplied input, including HTTP headers. Always employ a robust security model that includes input validation to prevent such vulnerabilities.
In this scenario, an instance of a web page reflecting the contents of a custom HTTP header without proper encoding is observed. Specifically, the web page reflects back the contents included in a X-User-id
header, which could include malicious JavaScript, as demonstrated by the example where the header contains an SVG image tag designed to execute JavaScript code on load.
Cross-Origin Resource Sharing (CORS) policies allow for the sending of custom headers. However, without the response being directly rendered by the browser due to CORS restrictions, the utility of such an injection might seem limited. The critical point arises when considering the browser's cache behavior. If the Vary: Origin
header is not specified, it becomes possible for the malicious response to be cached by the browser. Subsequently, this cached response could be rendered directly when navigating to the URL, bypassing the need for direct rendering upon the initial request. This mechanism enhances the reliability of the attack by leveraging client-side caching.
To illustrate this attack, a JavaScript example is provided, designed to be executed in the environment of a web page, such as through a JSFiddle. This script performs a simple action: it sends a request to a specified URL with a custom header containing the malicious JavaScript. Upon successful request completion, it attempts to navigate to the target URL, potentially triggering the execution of the injected script if the response has been cached without proper handling of the Vary: Origin
header.
Here's a summarized breakdown of the JavaScript used to execute this attack:
XSSI, znane również jako Cross-Site Script Inclusion, to rodzaj podatności, która wykorzystuje fakt, że zasada tej samej lokalizacji (SOP) nie ma zastosowania podczas dołączania zasobów za pomocą tagu skryptu. Dzieje się tak, ponieważ skrypty muszą być w stanie być dołączane z różnych domen. Ta podatność pozwala atakującemu uzyskać dostęp i odczytać dowolną treść, która została dołączona za pomocą tagu skryptu.
Ta podatność staje się szczególnie istotna w przypadku dynamicznego JavaScript lub JSONP (JSON z Padding), zwłaszcza gdy informacje o autoryzacji, takie jak ciasteczka, są używane do uwierzytelniania. Podczas żądania zasobu z innego hosta ciasteczka są dołączane, co czyni je dostępnymi dla atakującego.
Aby lepiej zrozumieć i złagodzić tę podatność, możesz użyć wtyczki BurpSuite dostępnej pod adresem https://github.com/kapytein/jsonp. Ta wtyczka może pomóc w identyfikacji i rozwiązaniu potencjalnych podatności XSSI w Twoich aplikacjach internetowych.
Przeczytaj więcej o różnych typach XSSI i jak je wykorzystać tutaj.
Spróbuj dodać callback
parameter do żądania. Może strona była przygotowana do wysyłania danych jako JSONP. W takim przypadku strona zwróci dane z Content-Type: application/javascript
, co obejdzie politykę CORS.
Jednym ze sposobów na obejście ograniczenia Access-Control-Allow-Origin
jest poproszenie aplikacji internetowej o wykonanie żądania w Twoim imieniu i odesłanie odpowiedzi. Jednak w tym scenariuszu dane uwierzytelniające ostatecznej ofiary nie będą wysyłane, ponieważ żądanie jest kierowane do innej domeny.
CORS-escape: To narzędzie zapewnia proxy, które przekazuje Twoje żądanie wraz z jego nagłówkami, jednocześnie fałszując nagłówek Origin, aby pasował do żądanej domeny. To skutecznie omija politykę CORS. Oto przykład użycia z XMLHttpRequest:
simple-cors-escape: To narzędzie oferuje alternatywne podejście do proxy żądań. Zamiast przekazywać Twoje żądanie w oryginalnej formie, serwer wykonuje własne żądanie z określonymi parametrami.
Możesz obejść kontrole CORS takie jak e.origin === window.origin
, tworząc iframe i z niego otwierając nowe okno. Więcej informacji na następnej stronie:
DNS rebinding poprzez TTL to technika używana do obejścia niektórych zabezpieczeń poprzez manipulację rekordami DNS. Oto jak to działa:
Atakujący tworzy stronę internetową i nakłania ofiarę do jej odwiedzenia.
Atakujący następnie zmienia DNS (IP) swojej domeny, aby wskazywał na stronę ofiary.
Przeglądarka ofiary buforuje odpowiedź DNS, która może mieć wartość TTL (Time to Live) wskazującą, jak długo rekord DNS powinien być uważany za ważny.
Gdy TTL wygasa, przeglądarka ofiary wykonuje nowe żądanie DNS, co pozwala atakującemu na wykonanie kodu JavaScript na stronie ofiary.
Utrzymując kontrolę nad IP ofiary, atakujący może zbierać informacje z ofiary bez wysyłania jakichkolwiek ciasteczek do serwera ofiary.
Ważne jest, aby zauważyć, że przeglądarki mają mechanizmy buforowania, które mogą uniemożliwić natychmiastowe nadużycie tej techniki, nawet przy niskich wartościach TTL.
DNS rebinding może być przydatny do omijania jawnych kontroli IP wykonywanych przez ofiarę lub w scenariuszach, w których użytkownik lub bot pozostaje na tej samej stronie przez dłuższy czas, co pozwala na wygaśnięcie bufora.
Jeśli potrzebujesz szybkiego sposobu na nadużycie DNS rebinding, możesz skorzystać z usług takich jak https://lock.cmpxchg8b.com/rebinder.html.
Aby uruchomić własny serwer DNS rebinding, możesz wykorzystać narzędzia takie jak DNSrebinder (https://github.com/mogwailabs/DNSrebinder). To polega na wystawieniu lokalnego portu 53/udp, utworzeniu rekordu A wskazującego na niego (np. ns.example.com) oraz utworzeniu rekordu NS wskazującego na wcześniej utworzony subdomenę A (np. ns.example.com). Każda subdomena subdomeny ns.example.com będzie następnie rozwiązywana przez Twój host.
Możesz również zbadać publicznie działający serwer pod adresem http://rebind.it/singularity.html w celu dalszego zrozumienia i eksperymentowania.
DNS rebinding poprzez flooding cache DNS to kolejna technika używana do obejścia mechanizmu buforowania przeglądarek i wymuszenia drugiego żądania DNS. Oto jak to działa:
Początkowo, gdy ofiara wykonuje żądanie DNS, otrzymuje odpowiedź z adresem IP atakującego.
Aby obejść obronę buforowania, atakujący wykorzystuje service worker. Service worker zalewa pamięć podręczną DNS, co skutecznie usuwa zbuforowaną nazwę serwera atakującego.
Gdy przeglądarka ofiary wykonuje drugie żądanie DNS, otrzymuje teraz odpowiedź z adresem IP 127.0.0.1, który zazwyczaj odnosi się do localhosta.
Zalewając pamięć podręczną DNS za pomocą service worker, atakujący może manipulować procesem rozwiązywania DNS i zmusić przeglądarkę ofiary do wykonania drugiego żądania, tym razem rozwiązując do pożądanego adresu IP atakującego.
Innym sposobem na obejście obrony buforowania jest wykorzystanie wielu adresów IP dla tej samej subdomeny u dostawcy DNS. Oto jak to działa:
Atakujący ustawia dwa rekordy A (lub jeden rekord A z dwoma IP) dla tej samej subdomeny u dostawcy DNS.
Gdy przeglądarka sprawdza te rekordy, otrzymuje oba adresy IP.
Jeśli przeglądarka zdecyduje się najpierw użyć adresu IP atakującego, atakujący może dostarczyć ładunek, który wykonuje żądania HTTP do tej samej domeny.
Jednak gdy atakujący uzyska adres IP ofiary, przestaje odpowiadać na przeglądarkę ofiary.
Przeglądarka ofiary, zdając sobie sprawę, że domena nie odpowiada, przechodzi do użycia drugiego podanego adresu IP.
Uzyskując dostęp do drugiego adresu IP, przeglądarka omija zasadę tej samej lokalizacji (SOP), co pozwala atakującemu na nadużycie tego i zbieranie oraz eksfiltrację informacji.
Ta technika wykorzystuje zachowanie przeglądarek, gdy dla domeny podawane są wiele adresów IP. Poprzez strategiczne kontrolowanie odpowiedzi i manipulowanie wyborem adresu IP przez przeglądarkę, atakujący może wykorzystać SOP i uzyskać dostęp do informacji od ofiary.
Zauważ, że aby uzyskać dostęp do localhost, powinieneś spróbować ponownie powiązać 127.0.0.1 w Windows i 0.0.0.0 w Linux. Dostawcy tacy jak godaddy czy cloudflare nie pozwolili mi używać IP 0.0.0.0, ale AWS route53 pozwolił mi utworzyć jeden rekord A z 2 IP, z których jednym było "0.0.0.0"
Aby uzyskać więcej informacji, możesz sprawdzić https://unit42.paloaltonetworks.com/dns-rebinding/
Jeśli wewnętrzne IP nie są dozwolone, mogą zapomnieć o zakazaniu 0.0.0.0 (działa na Linuxie i Macu)
Jeśli wewnętrzne IP nie są dozwolone, odpowiedz z CNAME do localhost (działa na Linuxie i Macu)
Jeśli wewnętrzne IP nie są dozwolone jako odpowiedzi DNS, możesz odpowiedzieć CNAME do wewnętrznych usług takich jak www.corporate.internal.
Możesz znaleźć więcej informacji na temat poprzednich technik obejścia i jak używać następującego narzędzia w wykładzie Gerald Doussot - Stan ataków DNS Rebinding & Singularity of Origin - Konferencja DEF CON 27.
Singularity of Origin
to narzędzie do przeprowadzania ataków DNS rebinding. Zawiera niezbędne komponenty do ponownego powiązania adresu IP nazwy serwera DNS ataku z adresem IP docelowej maszyny oraz do dostarczania ładunków atakujących w celu wykorzystania podatnego oprogramowania na docelowej maszynie.
Używaj TLS w usługach wewnętrznych
Żądaj uwierzytelnienia, aby uzyskać dostęp do danych
Waliduj nagłówek Host
https://wicg.github.io/private-network-access/: Propozycja, aby zawsze wysyłać żądanie wstępne, gdy publiczne serwery chcą uzyskać dostęp do serwerów wewnętrznych
Fuzzuj możliwe błędy w konfiguracjach polityki CORS
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)