Unicode Normalization

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

WhiteIntel es un motor de búsqueda alimentado por la dark web que ofrece funcionalidades gratuitas para verificar si una empresa o sus clientes han sido comprometidos por malwares ladrones.

El objetivo principal de WhiteIntel es combatir los secuestros de cuentas y los ataques de ransomware resultantes de malwares que roban información.

Puedes visitar su sitio web y probar su motor de forma gratuita en:


Este es un resumen de: https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/. Echa un vistazo para más detalles (imágenes tomadas de allí).

Comprendiendo Unicode y Normalización

La normalización Unicode es un proceso que asegura que diferentes representaciones binarias de caracteres se estandaricen al mismo valor binario. Este proceso es crucial al tratar con cadenas en programación y procesamiento de datos. El estándar Unicode define dos tipos de equivalencia de caracteres:

  1. Equivalencia Canónica: Los caracteres se consideran equivalentes canónicamente si tienen la misma apariencia y significado al ser impresos o mostrados.

  2. Equivalencia de Compatibilidad: Una forma más débil de equivalencia donde los caracteres pueden representar el mismo carácter abstracto pero mostrarse de manera diferente.

Existen cuatro algoritmos de normalización Unicode: NFC, NFD, NFKC y NFKD. Cada algoritmo emplea técnicas de normalización canónica y de compatibilidad de manera diferente. Para una comprensión más profunda, puedes explorar estas técnicas en Unicode.org.

Puntos Clave sobre la Codificación Unicode

Comprender la codificación Unicode es fundamental, especialmente al tratar problemas de interoperabilidad entre diferentes sistemas o lenguajes. Aquí están los puntos principales:

  • Puntos de Código y Caracteres: En Unicode, a cada carácter o símbolo se le asigna un valor numérico conocido como "punto de código".

  • Representación en Bytes: El punto de código (o carácter) se representa por uno o más bytes en memoria. Por ejemplo, los caracteres LATIN-1 (comunes en países de habla inglesa) se representan usando un byte. Sin embargo, los idiomas con un conjunto más grande de caracteres necesitan más bytes para la representación.

  • Codificación: Este término se refiere a cómo los caracteres se transforman en una serie de bytes. UTF-8 es un estándar de codificación prevalente donde los caracteres ASCII se representan usando un byte, y hasta cuatro bytes para otros caracteres.

  • Procesamiento de Datos: Los sistemas que procesan datos deben ser conscientes de la codificación utilizada para convertir correctamente el flujo de bytes en caracteres.

  • Variantes de UTF: Además de UTF-8, existen otros estándares de codificación como UTF-16 (usando un mínimo de 2 bytes, hasta 4) y UTF-32 (usando 4 bytes para todos los caracteres).

Es crucial comprender estos conceptos para manejar y mitigar efectivamente los problemas potenciales derivados de la complejidad de Unicode y sus diversos métodos de codificación.

Un ejemplo de cómo Unicode normaliza dos bytes diferentes que representan el mismo carácter:

unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")

Una lista de caracteres equivalentes Unicode se puede encontrar aquí: https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html y https://0xacb.com/normalization_table

Descubrimiento

Si encuentras dentro de una aplicación web un valor que se está devolviendo, podrías intentar enviar 'KELVIN SIGN' (U+0212A) que se normaliza a "K" (puedes enviarlo como %e2%84%aa). Si se devuelve un "K", entonces, se está realizando algún tipo de normalización Unicode.

Otro ejemplo: %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 después de la normalización Unicode es Leonishan.

Ejemplos Vulnerables

Burla del filtro de Inyección SQL

Imagina una página web que está utilizando el carácter ' para crear consultas SQL con la entrada del usuario. Esta web, como medida de seguridad, elimina todas las ocurrencias del carácter ' de la entrada del usuario, pero después de esa eliminación y antes de la creación de la consulta, normaliza usando Unicode la entrada del usuario.

Entonces, un usuario malintencionado podría insertar un carácter Unicode diferente equivalente a ' (0x27) como %ef%bc%87, cuando la entrada se normaliza, se crea una comilla simple y aparece una vulnerabilidad de Inyección SQL:

Algunos caracteres Unicode interesantes

  • 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

Plantilla sqlmap

XSS (Cross Site Scripting)

Podrías usar uno de los siguientes caracteres para engañar a la aplicación web y explotar un XSS:

Ten en cuenta que, por ejemplo, el primer carácter Unicode propuesto puede ser enviado como: %e2%89%ae o como %u226e

Fuzzing de Regexes

Cuando el backend está verificando la entrada del usuario con una regex, podría ser posible que la entrada esté siendo normalizada para la regex pero no para donde se está utilizando. Por ejemplo, en una Redirección Abierta o SSRF la regex podría estar normalizando la URL enviada pero luego accediéndola tal cual.

La herramienta recollapse permite generar variaciones de la entrada para fuzzear el backend. Para más información, revisa el github y este post.

Referencias

WhiteIntel es un motor de búsqueda alimentado por la dark web que ofrece funcionalidades gratuitas para verificar si una empresa o sus clientes han sido comprometidos por malwares de robo.

El objetivo principal de WhiteIntel es combatir los secuestros de cuentas y los ataques de ransomware resultantes de malwares que roban información.

Puedes visitar su sitio web y probar su motor de forma gratuita en:

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización