Server-side request forgery

Server-side request forgery (w skrócie SSRF) – rodzaj podatności aplikacji internetowej, pozwalającej atakującemu skłonić serwer do wysłania żądania sieciowego pod dowolnie wskazany adres. Błąd występuje wtedy, gdy aplikacja pobiera zasób spod adresu URL podanego przez użytkownika, nie sprawdzając wcześniej, dokąd ten adres prowadzi.

Nazwa nawiązuje do podatności Cross-site request forgery (CSRF), lecz mechanizm jest odmienny: w CSRF niepożądane żądanie wysyła przeglądarka ofiary, natomiast w SSRF wykonuje je sam serwer.

Żądanie wysłane przez serwer pochodzi z zaufanej pozycji w sieci wewnętrznej, dzięki czemu atakujący może ominąć zaporę sieciową i sięgnąć do usług niedostępnych z internetu. Pozwala to między innymi skanować adresy w sieci lokalnej, wymuszać zapytania DNS oraz łączyć się z usługami korzystającymi z innych protokołów, na przykład z lokalnym serwerem pocztowym SMTP.

Geneza pojęcia

Ataki polegające na wymuszeniu na serwerze wysłania żądania były znane, zanim ukuto dla nich osobną nazwę. Za najwcześniejszy przykład uznaje się atak SMBRelay, w którym napastnik doprowadza do wysłania żądania przez usługę.

Sam termin wprowadził w 2008 roku Deral Heiland podczas konferencji ShmooCon, w wystąpieniu Web Portals: Gateway To Information Or A Hole In Our Perimeter Defenses. Opisał w nim portale firmowe wyposażone w komponenty pobierające dane z systemów wewnętrznych, do których użytkownik nie miał bezpośredniego dostępu – przez co portal stawał się pojedynczym punktem wejścia do zasobów wewnętrznych.

Szersze opracowanie zagadnienia przedstawili w 2012 roku na konferencji Black Hat USA badacze z firmy ERPScan, którzy zebrali znane wówczas odmiany ataku i zaproponowali ich klasyfikację. Zwrócili przy tym uwagę, że SSRF nie jest samodzielną podatnością, lecz sposobem przeprowadzenia ataku z wykorzystaniem podatności już istniejącej.

Cele ataku

Napastnik może skłonić aplikację do wysłania żądania HTTP z powrotem do serwera, na którym ona działa, przez jego interfejs pętli zwrotnej, na przykład podając jako adres zasobu http://localhost/admin. Aplikacje często traktują żądania pochodzące z tego samego komputera jako zaufane. Kontrola dostępu może być realizowana przez osobny komponent umieszczony przed serwerem aplikacji i pomijana, gdy połączenie wychodzi z samego serwera. Na potrzeby odtwarzania systemu po awarii aplikacja może dopuszczać dostęp administracyjny bez logowania dla każdego, kto łączy się z lokalnego komputera, a interfejs administracyjny może nasłuchiwać na innym porcie niż główna aplikacja, niedostępnym bezpośrednio dla użytkowników. Takie relacje zaufania często sprawiają, że SSRF staje się podatnością krytyczną.

Serwer aplikacji może też komunikować się z systemami zaplecza, do których użytkownicy nie mają bezpośredniego dostępu. Systemy te często mają nierutowalne prywatne adresy IP, a ponieważ zwykle chroni je sama topologia sieci, ich zabezpieczenia bywają słabsze.

Ślepy SSRF

Osobną odmianą jest ślepy SSRF (blind SSRF), w którym serwer wprawdzie wysyła żądanie pod adres wskazany przez napastnika, ale otrzymana odpowiedź nie trafia z powrotem do atakującego. Skutki bywają wtedy mniej dotkliwe, bo tą drogą nie da się wprost wydobyć danych z systemów wewnętrznych. Mimo to w części przypadków prowadzi ona aż do zdalnego wykonania kodu, na przykład gdy napastnik zdoła wykorzystać błąd w kliencie HTTP samego serwera, odpowiadając na wywołane przez siebie żądanie spreparowaną treścią.

Podatność tego rodzaju wykrywa się metodami poza pasmem. Testujący podstawia adres domeny, którą sam kontroluje, a następnie sprawdza, czy pojawi się ruch skierowany do jego serwera. Charakterystyczne jest przy tym, że często widać samo zapytanie DNS o podstawioną domenę, bez późniejszego połączenia – infrastruktura sieciowa zwykle przepuszcza ruch DNS na zewnątrz, blokując jednocześnie połączenia.

Inne protokoły i schematy

Atak nie ogranicza się do protokołu HTTP. Żądanie kierowane do podatnej aplikacji jest wprawdzie zwykle żądaniem HTTP, ale połączenie nawiązywane następnie przez serwer może posługiwać się innym protokołem – między innymi FTP, SMB lub SMTP – o ile użyta przez aplikację biblioteka go obsługuje.

Służą do tego schematy adresów inne niż http i https, na przykład file, gopher, dict, data czy phar. W zależności od zastosowanego analizatora dostępne bywają także ftp, ldap, jar, mailto i ssh2. Z tego powodu OWASP zaleca wymuszanie dozwolonego schematu przy budowaniu żądania przez aplikację.

Szczególne znaczenie ma schemat gopher, ponieważ pozwala przesłać dowolne dane zamiast z góry określonego komunikatu. Żądanie postaci gopher://172.16.0.1:3300/123456789 sprawia, że serwer nawiązuje połączenie TCP ze wskazanym adresem i portem, a następnie wysyła znaki pobrane ze ścieżki, przy czym pierwszy z nich zostaje pominięty. Pozwala to skierować dowolny pakiet warstwy aplikacji pod dowolny port dowolnego hosta osiągalnego z zaatakowanego serwera.

Metoda ta ma jednak ograniczenia: część znaków nie jest przekazywana wiernie, a w jednej sesji daje się przesłać tylko jeden pakiet, co uniemożliwia atak na protokoły wymagające wcześniejszego nawiązania połączenia.

Do przeprowadzenia ataku SSRF bywa również wykorzystywana podatność polegająca na wstrzyknięciu zewnętrznej encji do przetwarzanego dokumentu XML (XML external entity, XXE).

Przykłady wykorzystania

W środowiskach chmurowych szczególnie groźne jest odpytanie usługi metadanych instancji, dostępnej pod adresem 169.254.169.254 i zwracającej tymczasowe poświadczenia dostępowe. W ten sposób w 2019 roku wykradziono z infrastruktury banku Capital One dane ponad 100 milionów osób. Do ataku wykorzystano błędnie skonfigurowaną zaporę aplikacji webowej (WAF), którą nakłoniono do przekazywania żądań do usługi metadanych platformy AWS, wydającej serwerowi tymczasowe poświadczenia do zasobów chmury, do których ma on dostęp. Zapora miała przy tym zbyt szerokie uprawnienia, pozwalające wyświetlać wszystkie pliki w zasobnikach danych i odczytywać ich zawartość.

Podatnością tego rodzaju była również CVE-2021-26855 w Microsoft Exchange Serverze, znana pod nazwą ProxyLogon. Pozwalała nieuwierzytelnionemu napastnikowi wysyłać dowolne żądania HTTP i uwierzytelnić się jako sam serwer Exchange, a w konsekwencji sięgnąć po skrzynki pocztowe użytkowników. Wykorzystana wraz z trzema innymi błędami prowadziła do wykonania kodu na serwerze z uprawnieniami konta SYSTEM. Amerykańska baza NVD zaklasyfikowała ją jako SSRF, a CISA umieściła w katalogu podatności aktywnie wykorzystywanych przez napastników.

Klasyfikacja

W katalogu słabości oprogramowania CWE, prowadzonym przez MITRE, podatność ta ma oznaczenie CWE-918. Opisano ją jako sytuację, w której serwer WWW otrzymuje od komponentu nadrzędnego adres URL lub podobne żądanie i pobiera zawartość spod tego adresu, nie upewniając się w wystarczającym stopniu, że żądanie trafi do oczekiwanego miejsca docelowego. Jako nazwę alternatywną katalog podaje XSPA (ang. Cross Site Port Attack).

W zestawieniu OWASP Top 10 z 2021 roku SSRF stanowił osobną kategorię, oznaczoną A10. W edycji z 2025 roku nie występuje już samodzielnie – został włączony do kategorii A01, obejmującej błędy kontroli dostępu, gdzie figuruje jako CWE-918 wśród wyróżnionych słabości tej grupy.

Techniki obchodzenia zabezpieczeń

Filtry sprawdzające adres podany przez użytkownika bywają omijane na kilka sposobów.

Zapis alternatywny adresu. Ten sam adres IP daje się zapisać szesnastkowo, ósemkowo, jako pojedynczą liczbę albo w postaci mieszanej, a także zakodować znakami procentowymi. Filtr porównujący ciąg znaków z zapisem kropkowo-dziesiętnym takiego wariantu nie rozpozna. OWASP odnotowuje, że część powszechnie stosowanych bibliotek walidacyjnych jest na te warianty podatna.

Przekierowania. Aplikacja może sprawdzić podany adres, a następnie podążyć za przekierowaniem HTTP prowadzącym już pod adres wewnętrzny. Z tego powodu OWASP zaleca wyłączenie obsługi przekierowań w kliencie HTTP.

Podmiana odwzorowania nazwy. Napastnik może wskazać kontrolowaną przez siebie domenę, która w chwili sprawdzania rozwiązuje się na adres publiczny, a w momencie wysłania żądania – już na adres wewnętrzny. Mechanizm ten odpowiada technice DNS rebindingu i sprawia, że sprawdzenie samej nazwy domenowej nie chroni przed atakiem, skoro odwzorowanie ustalane jest ponownie w chwili wykonania połączenia.

Niezgodność parserów. Ten sam adres bywa różnie odczytywany przez różne implementacje. Dla ciągu http://example.com\@evil.com parser zgodny ze standardem WHATWG traktuje ukośnik wsteczny jako separator ścieżki i odczytuje nazwę hosta jako example.com, natomiast implementacja wyznaczająca ją jako fragment poprzedzający ostatni znak małpy zwróci evil.com. OWASP zaleca odrzucanie adresów, z których poszczególne parsery odczytują różne nazwy hostów, zamiast prób uzgadniania tych odczytów. Zjawisko to szerzej opisał w 2017 roku na konferencji Black Hat USA Orange Tsai. Jako źródło problemu wskazał niespójność między parserami adresów URL a mechanizmami wykonującymi żądania, a za pomocą własnego narzędzia do fuzzingu wykrył wiele nieznanych wcześniej podatności we wbudowanych bibliotekach popularnych języków programowania, w tym Pythona, PHP, Perla, Ruby, Javy i JavaScriptu, a także w programach Wget i cURL.

Przeciwdziałanie

OWASP zaleca obronę wielowarstwową, prowadzoną równolegle na poziomie aplikacji i sieci. W warstwie aplikacji należy weryfikować wszystkie dane pochodzące od użytkownika, wymuszać schemat, port i adres docelowy według listy dozwolonych wartości, nie odsyłać klientowi surowej odpowiedzi otrzymanej z serwera docelowego oraz wyłączyć podążanie za przekierowaniami HTTP. W warstwie sieci zaleca się wydzielenie funkcji pobierania zasobów zdalnych do osobnego segmentu i takie skonfigurowanie zapory, by domyślnie odrzucała cały ruch poza niezbędnym.

OWASP odradza natomiast opieranie ochrony na liście blokowanych adresów, ponieważ napastnicy dysponują gotowymi technikami obchodzenia takich filtrów. Aplikacja musiałaby bowiem rozpoznać wszystkie adresy prywatne, adresy pętli zwrotnej i adresy link-local w obu wersjach protokołu IP. Dlatego arkusz OWASP poświęcony zapobieganiu SSRF radzi nie przyjmować od użytkownika całego adresu URL, lecz wyłącznie nazwę domeny albo adres IP, porównać otrzymaną wartość z listą dozwolonych i zbudować żądanie samodzielnie. Lista blokowanych adresów pozostaje rozwiązaniem ostatecznym, stosowanym tam, gdzie zbiór dozwolonych celów nie jest z góry znany, na przykład przy mechanizmach typu webhook. W chmurze AWS dodatkowym zabezpieczeniem przed kradzieżą poświadczeń z usługi metadanych jest przejście na IMDSv2 i wyłączenie starszej wersji IMDSv1.

W listopadzie 2019 roku AWS udostępnił drugą wersję usługi metadanych instancji (IMDSv2), w której każde żądanie jest chronione uwierzytelnieniem sesji. Oprogramowanie rozpoczyna sesję żądaniem HTTP PUT i otrzymuje tajny token, którego używa następnie jak hasła w kolejnych żądaniach. Zabezpieczenie to wykorzystuje fakt, że otwarte zapory aplikacji webowych bardzo rzadko obsługują żądania PUT. Usługa nie wydaje też tokenów żądaniom zawierającym nagłówek X-Forwarded-For, co chroni przed wykorzystaniem otwartych odwrotnych serwerów pośredniczących, a pakiety z tokenem mają domyślnie czas życia (TTL) równy 1, przez co nie mogą opuścić instancji. AWS uznał to rozwiązanie za skuteczniejsze od wymagania stałego nagłówka, ponieważ wiele podatności SSRF pozwala napastnikowi ustawiać dowolne nagłówki, i według jego analizy rzeczywistych podatności chroni ono przed zdecydowaną większością z nich. Obie wersje usługi pozostały dostępne, a AWS zalecił przejście na IMDSv2 i ograniczenie dostępu wyłącznie do tej wersji. Usługa metadanych w chmurze Microsoft Azure, aby mieć pewność, że żądania są kierowane bezpośrednio do niej, i zapobiec niezamierzonemu przekierowaniu żądań, odrzuca żądania bez nagłówka Metadata: true oraz żądania zawierające nagłówek X-Forwarded-For.

Przypisy

  1. 1 2 3 4 5 A10:2021 – Server-Side Request Forgery (SSRF) [online], OWASP, 2021 [dostęp 2026-08-24] (ang.).
  2. ↑ Czym jest podatność SSRF? (Server Side Request Forgery) [online], Sekurak, 18 lipca 2016 [dostęp 2026-08-24].
  3. ↑ Adam Ziaja: Praktyczna analiza powłamaniowa. Aplikacja webowa w środowisku Linux. Warszawa: Wydawnictwo Naukowe PWN, 2017, s. 68. ISBN 978-83-01-19347-8. OCLC 1000021213.
  4. ↑ Bezpieczeństwo aplikacji webowych, Biblioteka Narodowa, OCLC 998638539 [dostęp 2026-08-24].
  5. 1 2 3 4 5 6 7 Alexander Polyakov, Dmitry Chastukhin, Alexey Tyurin, SSRF vs. Business-critical applications. Part 1: XXE tunneling in SAP NetWeaver [online], ERPScan, Black Hat USA, 2012 [dostęp 2026-09-23] (ang.).
  6. 1 2 Server-side request forgery (SSRF) [online], Web Security Academy, PortSwigger [dostęp 2026-10-11] (ang.).
  7. 1 2 Blind SSRF vulnerabilities [online], Web Security Academy, PortSwigger [dostęp 2026-09-20] (ang.).
  8. 1 2 3 4 5 6 7 8 Server-Side Request Forgery Prevention Cheat Sheet [online], OWASP [dostęp 2026-09-23] (ang.).
  9. ↑ Unsecured Credentials: Cloud Instance Metadata API (T1552.005) [online], MITRE ATT&CK [dostęp 2026-08-24] (ang.).
  10. ↑ Brian Krebs, What We Can Learn from the Capital One Hack [online], Krebs on Security, 2 sierpnia 2019 [dostęp 2026-10-11] (ang.).
  11. ↑ Mitigate Microsoft Exchange Server Vulnerabilities (Alert AA21-062A) [online], Cybersecurity and Infrastructure Security Agency, 3 marca 2021 [dostęp 2026-09-20] (ang.).
  12. ↑ CVE-2021-26855 [online], National Vulnerability Database, NIST [dostęp 2026-09-20] (ang.).
  13. ↑ CWE-918: Server-Side Request Forgery (SSRF) [online], MITRE, 30 kwietnia 2026 [dostęp 2026-10-11] (ang.).
  14. ↑ Introduction – OWASP Top 10:2025 [online], OWASP [dostęp 2026-09-20] (ang.).
  15. ↑ A01:2025 – Broken Access Control [online], OWASP [dostęp 2026-09-20] (ang.).
  16. ↑ Orange Tsai, A New Era of SSRF – Exploiting URL Parser in Trending Programming Languages! [online], Black Hat USA 2017, lipiec 2017 [dostęp 2026-10-11] (ang.).
  17. ↑ Colm MacCárthaigh, Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Metadata Service [online], AWS Security Blog, 19 listopada 2019 [dostęp 2026-10-11] (ang.).
  18. ↑ Azure Instance Metadata Service for virtual machines [online], Microsoft Learn, 29 lipca 2025 [dostęp 2026-10-11] (ang.).