65 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Unicode Injection
{{#include ../../banners/hacktricks-training.md}}
## Introduction
U zavisnosti od toga kako se back-end/front-end ponaša kada **primi čudne unicode karaktere**, napadač bi mogao da **obiđe zaštite i ubrizga proizvoljne karaktere** koji bi mogli biti korišćeni za **iskorišćavanje ranjivosti injekcije** kao što su XSS ili SQLi.
## Unicode Normalization
Unicode normalizacija se dešava kada se **unicode karakteri normalizuju u ascii karaktere**.
Jedan uobičajen scenario ove vrste ranjivosti se dešava kada sistem **menja** na neki način **ulaz** korisnika **nakon što ga je proverio**. Na primer, u nekim jezicima jednostavan poziv za pravljenje **ulaza velikim ili malim slovima** mogao bi normalizovati dati ulaz i **unicode će biti transformisan u ASCII** generišući nove karaktere.\
Za više informacija pogledajte:
{{#ref}}
unicode-normalization.md
{{#endref}}
## `\u` to `%`
Unicode karakteri se obično predstavljaju sa **`\u` prefiksom**. Na primer, karakter `㱋` je `\u3c4b`([proverite ovde](https://unicode-explorer.com/c/3c4B)). Ako backend **transformiše** prefiks **`\u` u `%`**, rezultantni string će biti `%3c4b`, što URL dekodirano daje: **`<4b`**. I, kao što možete videti, **karakter `<` je ubrizgan**.\
Možete koristiti ovu tehniku da **ubrizgate bilo koju vrstu karaktera** ako je backend ranjiv.\
Pogledajte [https://unicode-explorer.com/](https://unicode-explorer.com/) da pronađete potrebne karaktere.
Ova ranjivost zapravo dolazi iz ranjivosti koju je istraživač pronašao, za dublje objašnjenje pogledajte [https://www.youtube.com/watch?v=aUsAHb0E7Cg](https://www.youtube.com/watch?v=aUsAHb0E7Cg)
## Emoji Injection
Back-endovi se čudno ponašaju kada **primi emojije**. To se desilo u [**ovoj analizi**](https://medium.com/@fpatrik/how-i-found-an-xss-vulnerability-via-using-emojis-7ad72de49209) gde je istraživač uspeo da postigne XSS sa payload-om kao što je: `💋img src=x onerror=alert(document.domain)//💛`
U ovom slučaju, greška je bila što je server nakon uklanjanja zlonamernih karaktera **konvertovao UTF-8 string iz Windows-1252 u UTF-8** (osnovno, kodiranje ulaza i konverzija kodiranja su se poklopili). Tada ovo ne daje pravi < već samo čudan unicode: ``\
``Tako su uzeli ovaj izlaz i **ponovo konvertovali sada iz UTF-8 u ASCII**. Ovo je **normalizovalo** `` u `<`, tako je eksploatacija mogla da funkcioniše na tom sistemu.\
To je ono što se desilo:
```php
<?php
$str = isset($_GET["str"]) ? htmlspecialchars($_GET["str"]) : "";
$str = iconv("Windows-1252", "UTF-8", $str);
$str = iconv("UTF-8", "ASCII//TRANSLIT", $str);
echo "String: " . $str;
```
Emoji liste:
- [https://github.com/iorch/jakaton_feminicidios/blob/master/data/emojis.csv](https://github.com/iorch/jakaton_feminicidios/blob/master/data/emojis.csv)
- [https://unicode.org/emoji/charts-14.0/full-emoji-list.html](https://unicode.org/emoji/charts-14.0/full-emoji-list.html)
## Windows Best-Fit/Worst-fit
Kao što je objašnjeno u **[ovom sjajnom postu](https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/)**, Windows ima funkciju pod nazivom **Best-Fit** koja će **zameniti unicode karaktere** koji se ne mogu prikazati u ASCII modu sličnim. To može dovesti do **neočekivanog ponašanja** kada backend **očekuje određeni karakter** ali dobija drugačiji.
Moguće je pronaći best-fit karaktere u **[https://worst.fit/mapping/](https://worst.fit/mapping/)**.
Kako Windows obično konvertuje unicode stringove u ascii stringove kao jedan od poslednjih delova izvršenja (obično prelazeći sa "W" sufiksiranog API-ja na "A" sufiksirani API kao što su `GetEnvironmentVariableA` i `GetEnvironmentVariableW`), to bi omogućilo napadačima da zaobiđu zaštite slanjem unicode karaktera koji će na kraju biti konvertovani u ASCII karaktere koji bi izvršili neočekivane radnje.
U blog postu su predložene metode za zaobilaženje ranjivosti koje su ispravljene korišćenjem **crne liste karaktera**, iskorišćavanje **putanja** koristeći [karaktere mapirane na “/“ (0x2F)](https://worst.fit/mapping/#to%3A0x2f) i [karaktere mapirane na “\“ (0x5C)](https://worst.fit/mapping/#to%3A0x5c) ili čak zaobilaženje zaštita od shell escape-a kao što su PHP-ov `escapeshellarg` ili Python-ov `subprocess.run` koristeći listu, ovo je urađeno na primer korišćenjem **punih dvostrukih navodnika (U+FF02)** umesto dvostrukih navodnika tako da je na kraju ono što je izgledalo kao 1 argument transformisano u 2 argumenta.
**Napomena da aplikacija bude ranjiva, mora koristiti "W" Windows API-je ali završiti pozivajući "A" Windows API tako da se kreira "Best-fit" unicode stringa.**
**Nekoliko otkrivenih ranjivosti neće biti ispravljeno jer se ljudi ne slažu ko bi trebao da reši ovaj problem.**
{{#include ../../banners/hacktricks-training.md}}