Codepoints 🤪 A arte dos Emojis
Como bytes fofinhos viram armas em pentest
Opa, bão? Eu sou o Fábio, e hoje resolvi falar sobre algo que muita gente usa, mas pouca gente entende de verdade: emojis. Mais especificamente, sobre os codepoints.
E como isso pode impactar (ou ser explorado) em contextos de segurança (ethical hacking, ok? 😎).
Não vou expor CVE ou falar com profundidade ou questões tecnicas neste post, mas sim apresentar um pouco do meu conhecimento.
🤔 Então, como assim os Emojis são uma "ameaça"?
Bem, emoji nada mais é do que uma sequência de bits chamada Unicode.
Em termos leigos, ele é gerado por uma combinação de caracteres, assim como as letras, mas é "renderizado" de forma totalmente diferente.
Em redes sociais, por exemplo, o emoji pode ser substituído por um SVG ou uma imagem de alta qualidade. Em outros lugares, é só uma questão de tipografia (a fonte que está sendo usada para exibir aquele caractere).
💥 Mas então... onde mora o problema?
Os problemas são vários, hehehe. Vamos começar pelo mais básico:
Os TRAVAS
Se você já viu um "trava" por aí, sabe do que estou falando:
- Lista infinita de emojis
- Quadradinhos pretos e brancos
- Emojis repetidos em fila
- Ou até aquele famoso "ponto da morte": um emoji preto que faz seu celular virar um peso de papel.
Sim, isso é um trava, e funciona de um jeito até bobo:
Ele sobrecarrega recursos e/ou a renderização do sistema, seja carregando milhares de emojis, consumindo cache, forçando a GPU ou forçando uma mecânica que a aplicação não consegue lidar. Em alguns casos, nem precisa quantidade, só o emoji certo, como o ataque ZWJ 👇
🕳️ Ataques ZWJ (Zero Width Joiner)
Antes de tudo: o que é ZWJ?
ZWJ é um caractere invisível (U+200D
) usado para unir dois caracteres e formar um glifo único, como certos emojis compostos.
Exemplo:
👨 + ZWJ + ❤️ + ZWJ + 👨 = 👨❤️👨
Legal né? Agora imagina isso sendo abusado. 😈
Usos maliciosos:
- Criar nomes visualmente iguais, mas tecnicamente diferentes (spoofing)
- Bypassar filtros de palavras (como
admin
) - Travar sistemas que tentam renderizar emojis inválidos ou combinações pesadas
- Obfuscar código malicioso (injetar scripts quebrando parsers)
- Explorar falhas em decodificação, levando até a XSS, SQLi, e outros
📚 Entendendo o Codepoint
Cada caractere Unicode (emoji, letra, símbolo, etc) tem um codepoint: um número único que representa aquele símbolo.
Exemplo:
U+1F600
→ 😄 (smiling face)
Por trás disso, está o poder (e o perigo) dos bytes disfarçados de imagens fofas.
Quando sistemas não lidam bem com essas representações, ou deixam passar caracteres invisíveis, temos espaço pra criar ataques não convencionais.
🐘 1. XSS Poliglota com Tailândes
Em alguns testes, é possível usar caracteres tailandeses ou outros scripts asiáticos para quebrar padrões de parsing e escapar do esperado.
Já vi payloads usando emojis + tailandês pra burlar CSP, quebrar HTML ou criar uma “poliglot payload” que muda de comportamento dependendo do browser.
Certos filtros de XSS dependem de padrões ocidentais (ASCII básico).
Mas o Unicode permite "brincar" com scripts orientais que são interpretados de forma diferente por browsers, mas passam por filtros WAF ou regex mal feitos.
🧪 Exemplo de payload com caractere tailandês:
<สcript>alert('xss')</script>
Sim, isso é <script>
escrito com o "s" tailandês (ส – U+0E2A).
O que acontece aqui?
Browsers modernos (como Chrome) não interpretam diretamente esse payload como JS, MAS:
- Em algumas versões antigas de navegadores ou sistemas mal codificados, esse caractere pode ser normalizado ou substituído.
- WAFs e firewalls podem ignorar esse caractere estranho, permitindo que o payload passe sem ser bloqueado.
- Em contextos onde há substituição de caracteres exóticos, pode ocorrer reformatação ou execução parcial.
Pode-se também usar esses caracteres como "espaço invisível", quebrando o parser da blacklist:
<script>alert(1)</script>
(O caractere entre o scr
e ipt
é um caractere invisível, tipo U+200C
ZWNJ)
💩 2. XSS com Emoji (bypass e obfuscação)
Os emojis podem ser usados para burlar filtros baseados em regex, onde o payload precisa não bater com padrões típicos, ou para confundir leitores/parsers.
🧪 Exemplo de obfuscação de tag com emoji:
<scr💩ipt>alert(1)</scr💩ipt>
Se um filtro estiver procurando por <script>
literal, ele não reconhece esse payload como perigoso.
Mas, em alguns contextos onde os dados são processados antes de chegar ao navegador (ex: algum parser que ignora ou remove emojis), ele pode ser recomposto como um <script>
válido.
Outro uso:
<svg/onload=alert('💀')>
Nesse caso:
- O payload é executado diretamente (clássico XSS via SVG)
- O emoji pode ser usado para confundir logs, ofuscar código ou enganar revisores humanos (ex: parecer inofensivo num bug bounty)
⚠️ Importante
Esses exemplos não executam XSS em todos os ambientes imediatamente. Eles são úteis em:
- Testes de filtros mal configurados
- Exploração de normalizações/unicode parsing
- Ambientes com falha de encoding
🎭 Spoofing com Emojis e Homoglyphs
Quer montar um phishing? (educacional, claro 😅)
Troque letras por caracteres visualmente idênticos:
Amazon → Аmazon (com a cirílica U+0410
)
Gmail → ɢmail (com ɢ modificado)
Ou até mesmo usando emojis no meio do nome pra enganar visualmente o usuário.
🧪 Exemplo: Injeção SQL com Emoji 💩
Imagine que você tem um sistema com este tipo de código (inseguro) no back-end:
SELECT * FROM usuarios WHERE nome = '$entrada';
Agora imagine que um atacante tenta inserir o seguinte input no campo "nome":
' OR '1'='1💩
A string final enviada para o banco ficaria assim:
SELECT * FROM usuarios WHERE nome = '' OR '1'='1💩';
O que acontece aqui?
-
Visualmente, parece só mais uma SQLi simples, com um emoji no final só pra zoar (💩)".
-
Mas o emoji 💩 (U+1F4A9) quebra o parser do banco de dados se:
- O banco não estiver preparado para caracteres UTF-8 multibyte.
- Ou se o charset da tabela/coluna for limitado (ex:
latin1
,ascii
).
Efeito:
Em MySQL antigo ou mal configurado, isso pode gerar:
- Erro de parsing (quebrando a query e revelando stack trace)
- Escape precoce da string (se truncar no emoji)
- Vazamento de informações
- Ou até permitir execução parcial da injeção.
✔️ Conclusão
Emojis são fofos, mas também podem ser perigosos.
Por trás de um rostinho feliz, pode estar escondido um travamento, um bypass de segurança ou até um vetor de ataque mais elaborado.
No fim das contas, tudo se resume a bytes, codepoints e como a aplicação os trata.
Fica a dica: na próxima análise de vulnerabilidade, dê uma olhada nos emojis, talvez eles estejam dizendo mais do que parecem. 😉
Obrigado pela atenção e até a proxima!