Open Redirect¶
Open Redirect to podatność polegająca na tym, że aplikacja przekierowuje użytkownika na adres URL wskazany w parametrze żądania bez odpowiedniej walidacji. Atakujący może skonstruować link prowadzący przez zaufaną domenę aplikacji, który ostatecznie kieruje ofiarę na stronę kontrolowaną przez niego.
Podatność sama w sobie nie prowadzi zazwyczaj do bezpośredniego naruszenia poufności lub integralności aplikacji, jednak jest często wykorzystywana jako warstwa uwiarygadniająca w atakach socjotechnicznych (phishing) oraz jako jeden z elementów łańcucha ataku prowadzącego do poważniejszych podatności.
Skutki udanego ataku¶
Open Redirect może być wykorzystany następująco:
- phishing - link wygląda na pochodzący z zaufanej domeny aplikacji, lecz ostatecznie prowadzi do strony atakującego,
- kradzież tokenów autoryzacyjnych poprzez przekierowanie do kontrolowanego punktu,
- omijanie filtrów antyphishingowych i bezpieczeństwa poczty (URL „zaufany" z punktu widzenia skanerów),
- wykorzystanie podatności jako elementu bardziej złożonych ataków, np. phishingu lub nieprawidłowo zabezpieczonych przepływów OAuth/OIDC,
- naruszenie zaufania do marki i reputacji usługi.
Mechanizm działania¶
Aplikacja przyjmuje parametr określający adres docelowy i przekierowuje do niego:
lub:
Jeśli aplikacja nie waliduje wartości next/url, atakujący może wskazać zewnętrzną domenę:
Serwer odpowiada:
i przeglądarka ofiary trafia na stronę atakującego.
Uwaga
Weryfikacja zaczynająca się od „czy URL zawiera moją domenę" jest błędna. Walidacja powinna wykorzystywać jeden, zgodny z późniejszym sposobem użycia parser URL i sprawdzać wszystkie istotne elementy adresu, w szczególności schemat, host oraz port. Nie należy podejmować decyzji na podstawie wyszukiwania nazwy domeny w surowym ciągu znaków.
Charakterystyka¶
Podatność Open Redirect może wystąpić w funkcjach, które ustalają adres przekierowania na podstawie danych przekazanych przez użytkownika. Typowe przykłady obejmują:
- przekierowania po logowaniu/wylogowaniu (
?next=,?returnTo=,?redirect=), - obsługę przepływów OAuth/OIDC z nieprawidłową walidacją parametru
redirect_uri, - mechanizmy skracania linków oraz udostępniania odnośników, jeżeli powodują przekierowanie do adresu wskazanego przez użytkownika,
- endpointy przekierowujące na podstawie parametrów takich jak
urllubtarget, - zapisywanie adresu poprzednio odwiedzonej strony i przekierowywanie do niego bez odpowiedniej walidacji.
Rekomendacje¶
Aby ograniczyć ryzyko występowania podatności należy:
-
Nie przekierowywać na zewnętrzne adresy URL na podstawie parametru użytkownika. Jeżeli przekierowanie dotyczy tylko zasobów aplikacji, należy używać ścieżek względnych:
i po stronie serwera składać pełny URL z własnej, stałej domeny konfiguracyjnej.
-
Stosować allowlistę dozwolonych celów przekierowania - porównywanie po normalizacji i z dokładnym dopasowaniem hosta (przykład uproszczony):
-
Walidować
redirect_uriw OAuth/OIDC dokładnie (dokładne dopasowanie zarejestrowanych URI), nie prefix-match. - Odrzucać schematy inne niż
http/https(w szczególnościjavascript:,data:,file:,vbscript:). - Unikać przekierowań pośrednich przez użytkownika-kontrolowane URL; preferować stałe trasy w aplikacji.
- Należy jawnie odrzucać adresy w formacie scheme-relative (tzw. protocol-relative URL), czyli zaczynające się od // bez podania schematu, np. //evil.example - przeglądarka interpretuje je względem protokołu bieżącej strony, więc mimo braku http:/https: nadal prowadzą do przekierowania na zewnętrzną domenę. Tak samo należy odrzucać warianty z backslashem (np. /\evil.example, \evil.example) oraz adresy zawierające znaki sterujące, stosując jeden, jednoznacznie zdefiniowany proces parsowania i normalizacji. Więcej o tym mechanizmie i sposobach obejścia walidacji można przeczytać w dokumencie: OWASP Testing Guide - Testing for Client-side URL Redirect.
- Logować i monitorować przekierowania, zwłaszcza te wskazujące na nietypowe, zewnętrzne domeny.