diff --git a/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md b/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md index 15bf1ec63..1eb54c516 100644 --- a/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md +++ b/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md @@ -146,7 +146,7 @@ next={domain}&next=attacker.com ``` ### Paths and Extensions Bypass -Jeśli wymagane jest, aby URL kończył się ścieżką lub rozszerzeniem, lub musiał zawierać ścieżkę, możesz spróbować jednego z następujących obejść: +Jeśli wymagana jest końcówka URL w postaci ścieżki lub rozszerzenia, lub musi zawierać ścieżkę, możesz spróbować jednego z następujących obejść: ``` https://metadata/vulerable/path#/expected/path https://metadata/vulerable/path#.extension @@ -158,7 +158,7 @@ Narzędzie [**recollapse**](https://github.com/0xacb/recollapse) może generowa ### Automatic Custom Wordlists -Sprawdź [**arkusz oszustw dotyczący obejścia walidacji URL**](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) z portswigger, gdzie możesz wprowadzić dozwolony host i host atakującego, a on wygeneruje listę URL do przetestowania. Uwzględnia również, czy możesz użyć URL w parametrze, w nagłówku Host lub w nagłówku CORS. +Sprawdź [**arkusz oszustw dotyczący obejścia walidacji URL**](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) od portswigger, gdzie możesz wprowadzić dozwolony host i atakujący, a on wygeneruje listę URL-i do przetestowania. Uwzględnia również, czy możesz użyć URL w parametrze, w nagłówku Host lub w nagłówku CORS. {{#ref}} https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet @@ -167,7 +167,7 @@ https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet ### Bypass via redirect Możliwe, że serwer **filtruje oryginalne żądanie** SSRF **ale nie** możliwą **odpowiedź przekierowania** na to żądanie.\ -Na przykład, serwer podatny na SSRF poprzez: `url=https://www.google.com/` może **filtruje parametr url**. Ale jeśli użyjesz [serwera python do odpowiedzi z kodem 302](https://pastebin.com/raw/ywAUhFrv) do miejsca, w które chcesz przekierować, możesz być w stanie **uzyskać dostęp do filtrowanych adresów IP** jak 127.0.0.1 lub nawet filtrowanych **protokółów** jak gopher.\ +Na przykład, serwer podatny na SSRF poprzez: `url=https://www.google.com/` może **filtruje parametr url**. Ale jeśli użyjesz [serwera python do odpowiedzi z kodem 302](https://pastebin.com/raw/ywAUhFrv) w miejsce, gdzie chcesz przekierować, możesz być w stanie **uzyskać dostęp do filtrowanych adresów IP** jak 127.0.0.1 lub nawet filtrowanych **protokołów** jak gopher.\ [Sprawdź ten raport.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530) ```python #!/usr/bin/env python3 @@ -193,13 +193,13 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever() ### Sztuczka z ukośnikiem -Sztuczka _backslash-trick_ wykorzystuje różnicę między [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) a [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B). Podczas gdy RFC3986 jest ogólnym ramowym dokumentem dla URI, WHATWG jest specyficzny dla adresów URL w sieci i jest przyjęty przez nowoczesne przeglądarki. Kluczowa różnica polega na tym, że standard WHATWG uznaje ukośnik wsteczny (`\`) za równoważny ukośnikowi (`/`), co wpływa na sposób, w jaki adresy URL są analizowane, szczególnie oznaczając przejście od nazwy hosta do ścieżki w adresie URL. +Sztuczka z _backslash_ wykorzystuje różnicę między [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) a [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B). Podczas gdy RFC3986 jest ogólnym ramowym dokumentem dla URI, WHATWG jest specyficzny dla adresów URL w sieci i jest przyjęty przez nowoczesne przeglądarki. Kluczowa różnica polega na uznaniu znaku backslash (`\`) przez standard WHATWG za równoważny ukośnikowi (`/`), co wpływa na sposób, w jaki adresy URL są analizowane, szczególnie oznaczając przejście od nazwy hosta do ścieżki w adresie URL. ![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg) ### Lewy nawias kwadratowy -Znak „lewy nawias kwadratowy” `[` w segmencie userinfo może spowodować, że UriComponentsBuilder w Springu zwróci wartość nazwy hosta, która różni się od przeglądarek: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878) +Znak „lewy nawias kwadratowy” `[` w segmencie userinfo może spowodować, że UriComponentsBuilder Springa zwróci wartość nazwy hosta, która różni się od przeglądarek: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878) ### Inne nieporozumienia @@ -207,10 +207,42 @@ Znak „lewy nawias kwadratowy” `[` w segmencie userinfo może spowodować, ż obraz z [https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/) +### Sztuczka z identyfikatorem strefy IPv6 (%25) + +Nowoczesne analizatory URL, które wspierają RFC 6874, pozwalają na *link-local* adresy IPv6, aby zawierały **identyfikator strefy** po znaku procenta. Niektóre filtry zabezpieczeń nie są świadome tej składni i będą usuwać tylko literały IPv6 w nawiasach kwadratowych, pozwalając na dotarcie następującego ładunku do wewnętrznego interfejsu: +```text +http://[fe80::1%25eth0]/ # %25 = encoded '%', interpreted as fe80::1%eth0 +http://[fe80::a9ff:fe00:1%25en0]/ # Another example (macOS style) +``` +Jeśli aplikacja docelowa weryfikuje, że host *nie* jest `fe80::1`, ale przestaje analizować na `%`, może błędnie traktować żądanie jako zewnętrzne. Zawsze normalizuj adres **przed** podjęciem jakiejkolwiek decyzji dotyczącej bezpieczeństwa lub całkowicie usuń opcjonalny identyfikator strefy. + +### Ostatnie CVE związane z analizą bibliotek (2022–2025) + +Wiele popularnych frameworków miało problemy z niezgodnością nazw hostów, które mogą być wykorzystane do SSRF, gdy walidacja URL została ominięta za pomocą wymienionych powyżej sztuczek: + +| Rok | CVE | Komponent | Streszczenie błędu | Minimalny PoC | +|------|-----|-----------|--------------|-------------| +| 2024 | CVE-2024-22243 / ‑22262 | Spring `UriComponentsBuilder` | `[` nie jest dozwolone w sekcji *userinfo*, więc `https://example.com\[@internal` jest analizowane jako host `example.com` przez Spring, ale jako `internal` przez przeglądarki, co umożliwia otwarte przekierowanie i SSRF, gdy używane są listy dozwolonych hostów. Zaktualizuj do Spring 5.3.34 / 6.0.19 / 6.1.6+. | +| 2023 | CVE-2023-27592 | **urllib3** <1.26.15 | Mylenie z ukośnikiem pozwoliło na ominięcie filtrów hostów, które dzielą na `@` w `http://example.com\\@169.254.169.254/`. | +| 2022 | CVE-2022-3602 | OpenSSL | Weryfikacja nazwy hosta pominięta, gdy nazwa kończy się na `.` (mylenie z domeną bez kropki). | + +Kiedy polegasz na parserach URL stron trzecich, **porównaj kanonizowany host zwrócony przez zaufaną bibliotekę z surowym ciągiem dostarczonym przez użytkownika**, aby wykryć te klasy problemów. + +### Pomocnicy do generowania ładunków (2024+) + +Tworzenie dużych, niestandardowych list słów ręcznie jest uciążliwe. Narzędzie open-source **SSRF-PayloadMaker** (Python 3) może teraz automatycznie generować *80 k+* kombinacji modyfikacji hostów, w tym mieszane kodowania, wymuszone obniżenie HTTP i warianty z ukośnikiem: +```bash +# Generate every known bypass that transforms the allowed host example.com to attacker.com +python3 ssrf_maker.py --allowed example.com --attacker attacker.com -A -o payloads.txt +``` +Otrzymana lista może być bezpośrednio użyta w Burp Intruder lub `ffuf`. + ## Odniesienia - [https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25](https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25) - [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md) - [https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet](https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet) +- [https://nvd.nist.gov/vuln/detail/CVE-2024-22243](https://nvd.nist.gov/vuln/detail/CVE-2024-22243) +- [https://github.com/hsynuzm/SSRF-PayloadMaker](https://github.com/hsynuzm/SSRF-PayloadMaker) {{#include ../../banners/hacktricks-training.md}}