Demonstração da Vulnerabilidade CVE-2022-31160 do jQuery UI
Este projeto demonstra a Vulnerabilidade de Atualização do Widget Checkboxradio do jQuery UI (CVE-2022-31160), que permite a decodificação de entidades HTML durante operações de atualização do widget, potencialmente levando a ataques de Cross-Site Scripting (XSS).
🚨 Aviso de Segurança
⚠️ Este projeto contém payloads XSS funcionais apenas para fins educacionais e de pesquisa.
Tipo de Vulnerabilidade: Cross-Site Scripting (XSS) via Decodificação de Entidades HTML
Pontuação CVSS: 6.1 (Médio)
Publicado pela primeira vez: 20 de julho de 2022
Causa Raiz
Quando um widget checkboxradio é inicializado em um input dentro de um label, chamar .checkboxradio("refresh") no widget faz com que as entidades HTML no conteúdo do label sejam erroneamente decodificadas. Isso pode converter conteúdo malicioso codificado com segurança em JavaScript executável.
Vetor de Ataque
root@kitploit:~
<!-- Safe encoded content -->
<label for="checkbox">
Text <img src=x onerror="alert('XSS')">
<input type="checkbox" id="checkbox">
</label>
<!-- After .checkboxradio("refresh") -->
<label for="checkbox">
Text
<input type="checkbox" id="checkbox">
</label>
🚀 Início Rápido
Pré-requisitos
Docker instalado em seu sistema
Navegador web com ferramentas de desenvolvedor
Compreensão básica de conceitos de segurança web
Construir e Executar
root@kitploit:~
# Clone or navigate to the project directory
cd jquery-cve-2022-31160
# Build the Docker image
docker build -t jquery-cve-2022-31160 .
# Run the container
docker run -p 3000:3000 jquery-cve-2022-31160
Acessar as Demonstrações
Assim que o container estiver em execução, acesse:
Gatilho: Imediato quando o elemento é inserido no DOM
Confiabilidade: Muito alta (sempre falha com src=x)
Caso de Uso: Demonstra execução XSS imediata
Risco no Mundo Real: Alto - comumente contorna filtros de entrada
2. Manipulador de Evento de Alternância de Detalhes (ontoggle)
Gatilho: Quando o estado de abertura/fechamento do elemento details muda
Confiabilidade: Muito alta (gatilho garantido com o atributo open)
Caso de Uso: Execução imediata na inserção no DOM
Risco no Mundo Real: Alto - execução confiável entre navegadores
3. Manipulador de Evento de Mouse (onmouseover)
Gatilho: Requer interação do usuário (passar o mouse)
Confiabilidade: Alta quando o usuário interage
Caso de Uso: Cenários de engenharia social
Risco no Mundo Real: Médio - requer engajamento do usuário
Por que Esses Payloads Funcionam
Vantagens dos Manipuladores de Evento:
Executam quando o elemento é inserido via innerHTML
Contornam restrições de tags <script>
Funcionam consistentemente em diferentes navegadores
Não requerem recursos externos para carregar
Gatilhos baseados em estado (como ontoggle) são altamente confiáveis
Contorno de Codificação:
Entidades HTML (<, ") são decodificadas pela atualização do jQuery UI
Transforma conteúdo codificado seguro em código executável
Demonstra um contorno de sanitização do mundo real
Múltiplos vetores de execução mostram a diversidade da superfície de ataque
🐳 Uso com Docker
Construindo a Imagem
root@kitploit:~
docker build -t jquery-cve-2022-31160 .
Executando o Container
root@kitploit:~
# Run on default port 3000
docker run -p 3000:3000 jquery-cve-2022-31160
# Run on custom port
docker run -p 8080:3000 jquery-cve-2022-31160
# Run in background
docker run -d -p 3000:3000 jquery-cve-2022-31160
# Run with custom name
docker run --name jquery-xss-demo -p 3000:3000 jquery-cve-2022-31160
Gerenciamento de Containers
root@kitploit:~
# List running containers
docker ps
# Stop the container
docker stop jquery-cve-2022-31160
# Remove the container
docker rm jquery-cve-2022-31160
# Remove the image
docker rmi jquery-cve-2022-31160
🔬 Análise de Segurança
Avaliação de Impacto
Severidade: Médio (CVSS 6.1)
Complexidade do Ataque: Baixa
Interação do Usuário: Necessária (interação com a página)
Escopo: Inalterado (mesma origem)
Confidencialidade: Baixo impacto
Integridade: Baixo impacto
Disponibilidade: Nenhum
Cenários do Mundo Real
Esta vulnerabilidade pode ser explorada em aplicações que:
Utilizam widgets checkboxradio do jQuery UI
Permitem conteúdo gerado pelo usuário em labels
Sanitizam conteúdo usando codificação de entidades HTML
Atualizam widgets programaticamente
Métodos de Detecção
Análise Estática: Pesquisar por chamadas .checkboxradio("refresh")
Análise Dinâmica: Monitorar mudanças no conteúdo HTML durante operações do widget
Varredura Automatizada: Usar ferramentas que detectam XSS baseado em DOM
Testes Manuais: Testar atualização do widget com payloads codificados
🛡️ Mitigação
Ações Imediatas
Atualizar jQuery UI: Atualizar para a versão 1.13.2 ou superior
Validação de Entrada: Implementar validação adequada no lado do servidor
Política de Segurança de Conteúdo: Implantar cabeçalhos CSP restritivos
Codificação de Saída: Usar codificação de saída apropriada ao contexto
Correções de Código
root@kitploit:~
// Before refresh, sanitize or validate content
function safeRefresh(element) {
// Validate label content before refresh
const label = $(`label[for="${element.attr('id')}"]`);
const content = label.html();
// Check for potentially dangerous content
if (content.includes('<') || content.includes('javascript:')) {
console.warn('Potentially dangerous content detected');
return;
}
element.checkboxradio("refresh");
}