Unicode Injection

Reading time: 5 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Introdução

Dependendo de como o back-end/front-end se comporta quando recebe caracteres unicode estranhos, um atacante pode ser capaz de contornar proteções e injetar caracteres arbitrários que podem ser usados para explorar vulnerabilidades de injeção como XSS ou SQLi.

Normalização de Unicode

A normalização de Unicode ocorre quando caracteres unicode são normalizados para caracteres ascii.

Um cenário comum desse tipo de vulnerabilidade ocorre quando o sistema está modificando de alguma forma a entrada do usuário após tê-la verificado. Por exemplo, em algumas linguagens, uma simples chamada para tornar a entrada em maiúsculas ou minúsculas pode normalizar a entrada dada e o unicode será transformado em ASCII, gerando novos caracteres.
Para mais informações, consulte:

Unicode Normalization

\u para %

Os caracteres unicode são geralmente representados com o prefixo \u. Por exemplo, o caractere é \u3c4b(ver aqui). Se um backend transforma o prefixo \u em %, a string resultante será %3c4b, que decodificada em URL é: <4b. E, como você pode ver, um caractere < é injetado.
Você poderia usar essa técnica para injetar qualquer tipo de caractere se o backend for vulnerável.
Consulte https://unicode-explorer.com/ para encontrar os caracteres que você precisa.

Essa vulnerabilidade na verdade vem de uma vulnerabilidade que um pesquisador encontrou, para uma explicação mais detalhada, consulte https://www.youtube.com/watch?v=aUsAHb0E7Cg

Injeção de Emoji

Back-ends se comportam de forma estranha quando recebem emojis. Isso aconteceu em este relato onde o pesquisador conseguiu alcançar um XSS com um payload como: 💋img src=x onerror=alert(document.domain)//💛

Neste caso, o erro foi que o servidor, após remover os caracteres maliciosos, converteu a string UTF-8 de Windows-1252 para UTF-8 (basicamente, a codificação de entrada e a conversão de codificação não coincidiram). Então, isso não dá um < adequado, apenas um unicode estranho:
``Então, eles pegaram essa saída e converteram novamente agora de UTF-8 para ASCII. Isso normalizou o para <, assim é como a exploração poderia funcionar nesse sistema.
Isso é o que aconteceu:

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:

Windows Melhor Ajuste/Pior Ajuste

Como explicado em este ótimo post, o Windows possui um recurso chamado Melhor Ajuste que irá substituir caracteres unicode que não podem ser exibidos em modo ASCII por um semelhante. Isso pode levar a comportamentos inesperados quando o backend está esperando um caractere específico mas recebe um diferente.

É possível encontrar caracteres de melhor ajuste em https://worst.fit/mapping/.

Como o Windows geralmente converte strings unicode em strings ascii como uma das últimas partes da execução (geralmente indo de uma API com sufixo "W" para uma API com sufixo "A" como GetEnvironmentVariableA e GetEnvironmentVariableW), isso permitiria que atacantes contornassem proteções enviando caracteres unicode que seriam convertidos por último em caracteres ASCII que realizariam ações inesperadas.

No post do blog, são propostos métodos para contornar vulnerabilidades corrigidas usando uma lista negra de caracteres, explorar traversais de caminho usando caracteres mapeados para “/“ (0x2F) e caracteres mapeados para “\“ (0x5C) ou até mesmo contornar proteções de escape de shell como escapeshellarg do PHP ou subprocess.run do Python usando uma lista, isso foi feito, por exemplo, usando aspas duplas em largura total (U+FF02) em vez de aspas duplas, de modo que no final o que parecia ser 1 argumento foi transformado em 2 argumentos.

Note que para um aplicativo ser vulnerável, ele precisa usar APIs do Windows "W" mas acabar chamando uma API do Windows "A", então o "Melhor ajuste" da string unicode é criado.

Várias vulnerabilidades descobertas não serão corrigidas, pois as pessoas não concordam sobre quem deve corrigir esse problema.

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks