mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
65 lines
5.1 KiB
Markdown
65 lines
5.1 KiB
Markdown
# Inyección de Unicode
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Introducción
|
||
|
||
Dependiendo de cómo se comporte el back-end/front-end cuando **recibe caracteres unicode extraños**, un atacante podría ser capaz de **eludir protecciones e inyectar caracteres arbitrarios** que podrían ser utilizados para **abusar de vulnerabilidades de inyección** como XSS o SQLi.
|
||
|
||
## Normalización de Unicode
|
||
|
||
La normalización de Unicode ocurre cuando **los caracteres unicode se normalizan a caracteres ascii**.
|
||
|
||
Un escenario común de este tipo de vulnerabilidad ocurre cuando el sistema está **modificando** de alguna manera la **entrada** del usuario **después de haberla verificado**. Por ejemplo, en algunos lenguajes, una simple llamada para hacer que la **entrada esté en mayúsculas o minúsculas** podría normalizar la entrada dada y el **unicode se transformará en ASCII** generando nuevos caracteres.\
|
||
Para más información, consulta:
|
||
|
||
{{#ref}}
|
||
unicode-normalization.md
|
||
{{#endref}}
|
||
|
||
## `\u` a `%`
|
||
|
||
Los caracteres unicode generalmente se representan con el **prefijo `\u`**. Por ejemplo, el carácter `㱋` es `\u3c4b`([consúltalo aquí](https://unicode-explorer.com/c/3c4B)). Si un backend **transforma** el prefijo **`\u` en `%`**, la cadena resultante será `%3c4b`, que decodificada en URL es: **`<4b`**. Y, como puedes ver, se **inyecta un carácter `<`**.\
|
||
Podrías usar esta técnica para **inyectar cualquier tipo de carácter** si el backend es vulnerable.\
|
||
Consulta [https://unicode-explorer.com/](https://unicode-explorer.com/) para encontrar los caracteres que necesitas.
|
||
|
||
Esta vulnerabilidad proviene de una vulnerabilidad que un investigador encontró, para una explicación más detallada consulta [https://www.youtube.com/watch?v=aUsAHb0E7Cg](https://www.youtube.com/watch?v=aUsAHb0E7Cg)
|
||
|
||
## Inyección de Emoji
|
||
|
||
Los back-ends se comportan de manera extraña cuando **reciben emojis**. Eso es lo que sucedió en [**este informe**](https://medium.com/@fpatrik/how-i-found-an-xss-vulnerability-via-using-emojis-7ad72de49209) donde el investigador logró conseguir un XSS con una carga útil como: `💋img src=x onerror=alert(document.domain)//💛`
|
||
|
||
En este caso, el error fue que el servidor, después de eliminar los caracteres maliciosos, **convirtió la cadena UTF-8 de Windows-1252 a UTF-8** (básicamente, la codificación de entrada y la conversión de codificación no coincidían). Entonces, esto no da un < adecuado, solo uno unicode extraño: `‹`\
|
||
``Así que tomaron esta salida y **convirtieron de nuevo ahora de UTF-8 a ASCII**. Esto **normalizó** el `‹` a `<`, así es como el exploit pudo funcionar en ese sistema.\
|
||
Esto es lo que sucedió:
|
||
```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 lists:
|
||
|
||
- [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 Mejor Ajuste/Pésimo Ajuste
|
||
|
||
Como se explica en **[esta gran publicación](https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/)**, Windows tiene una característica llamada **Mejor Ajuste** que **reemplazará caracteres unicode** que no se pueden mostrar en modo ASCII por uno similar. Esto puede llevar a un **comportamiento inesperado** cuando el backend está **esperando un carácter específico** pero recibe uno diferente.
|
||
|
||
Es posible encontrar caracteres de mejor ajuste en **[https://worst.fit/mapping/](https://worst.fit/mapping/)**.
|
||
|
||
Como Windows generalmente convertirá cadenas unicode a cadenas ascii como una de las últimas partes de la ejecución (generalmente pasando de una API con sufijo "W" a una API con sufijo "A" como `GetEnvironmentVariableA` y `GetEnvironmentVariableW`), esto permitiría a los atacantes eludir protecciones enviando caracteres unicode que se convertirán finalmente en caracteres ASCII que realizarían acciones inesperadas.
|
||
|
||
En la publicación del blog se proponen métodos para eludir vulnerabilidades corregidas utilizando una **lista negra de caracteres**, explotar **traversales de ruta** utilizando [caracteres mapeados a “/“ (0x2F)](https://worst.fit/mapping/#to%3A0x2f) y [caracteres mapeados a “\“ (0x5C)](https://worst.fit/mapping/#to%3A0x5c) o incluso eludir protecciones de escape de shell como `escapeshellarg` de PHP o `subprocess.run` de Python utilizando una lista, esto se hizo por ejemplo utilizando **comillas dobles de ancho completo (U+FF02)** en lugar de comillas dobles, por lo que al final lo que parecía ser 1 argumento se transformó en 2 argumentos.
|
||
|
||
**Nota que para que una aplicación sea vulnerable necesita usar APIs de Windows "W" pero terminar llamando a una API de Windows "A" para que se cree el "Mejor ajuste" de la cadena unicode.**
|
||
|
||
**Varias vulnerabilidades descubiertas no se corregirán ya que las personas no están de acuerdo en quién debería solucionar este problema.**
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|