3.1 KiB
Raw Blame History

Unicode Injection

{{#include ../../banners/hacktricks-training.md}}

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:

{{#ref}} unicode-normalization.md {{#endref}}

\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 realizar 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 < apropriado, 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

$str = isset($_GET["str"]) ? htmlspecialchars($_GET["str"]) : "";

$str = iconv("Windows-1252", "UTF-8", $str);
$str = iconv("UTF-8", "ASCII//TRANSLIT", $str);

echo "String: " . $str;

Listas de Emoji:

{{#include ../../banners/hacktricks-training.md}}