XSS WAF Bypass via TouchScreen

XSS WAF Bypass via TouchScreen

Sejam bem-vindos! Neste artigo irei descrever um pouco sobre o meu processo de exploração realizado há alguns meses, o qual me resultou em um Payload de XSS capaz de realizar Bypass em alguns WAFs (Web Application Firewall).

Esse artigo foi criado apenas para estudos e passagem de conhecimento. Não recomendamos reproduzir estes ataques sem a autorização prévia do responsável pela aplicação. O tema que abordaremos possui alguns termos técnicos e uma demanda de conhecimentos prévios, porém básicos, sobre XSS.

Bom, vamos lá!

Introdução

Antes de iniciarmos o processo de exploração, vamos apenas relembrar o que é o XSS: de forma breve e resumida, o ataque de XSS consiste em nada mais do que a possibilidade de executar códigos JavaScript na aplicação devido à falta de sanitização de dados do usuário. Existem diversos cenários de exploração e seu impacto é muito reconhecido principalmente pela possibilidade de realizar sequestro de sessão de contas de usuários (esse não é o único impacto decorrente da vulnerabilidade, porém é o mais conhecido).

Identificando o vetor de ataque

Para a enumeração de pontos de injeção de XSS, podemos iniciar procurando por parâmetros os quais refletem no código da aplicação. Vale lembrar que este de longe é o único cenário ou um requisito para existir um XSS. No entanto, devido a incidência de XSS refletidos serem bem maiores e mais populares, iremos focar neste ponto inicialmente.

Interceptando por um proxy (BurpSuite), podemos ver de forma clara como ocorre o cenário de um parâmetro refletido:

Neste caso, o valor “redbelt” inserido no campo de pesquisa da página estava refletindo na resposta da aplicação. Sabendo disso, podemos então enumerar de forma manual ou automatizada alguns caracteres especiais a fim de identificar quais não estão sendo efetivamente sanitizados.

Para isso, utilizamos uma tool básica chamada “kxss”:

Texto

Descrição gerada automaticamente

Com isso, identificamos que os caracteres de sinal maior e menor (<>) não estavam sendo filtrados.

Sabendo disso, tentamos então executar um Payload básico de XSS, porém recebemos o bloqueio do nosso amiguinho WAF:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

XSS em Tags HTML

Para prevenir-se de algumas explorações web, é comum encontrar ambientes que façam uso de um WAF (Web Application Firewall). Sua implementação pode ser capaz de registrar logs, identificar e até mesmo bloquear usuários que estejam tentando realizar ações suspeitas na aplicação. Estas ações suspeitas podem ir desde a tentativa de inserção de Payloads maliciosos até mesmo um alto número de requisições à diretórios inexistentes. São inúmeras as regras e filtros que a ferramenta pode adotar.

Para a identificação de ataques de XSS, uma ação comum dos WAFs é identificar e bloquear os ataques com base em palavras ou sequência de caracteres chaves que estejam inseridos em algum input da aplicação (similar a uma Blacklist). Sabendo disso, foi então realizada uma análise de exploração de XSS em Tags HTML. Essa exploração consiste em identificar tags e eventos HTML que estavam sendo permitidos pelo WAF.

Para isso, inicialmente realizou-se uma série de requisições contendo diversas tags HTML a fim de identificar se alguma estava retornando 200 (ou seja, estava sendo aceita pelo WAF):

XSS

Como resultado, todas as tags receberam status 200.

O mesmo processo foi reproduzido, porém desta vez com o intuito de analisar quais eventos estavam sendo aceitos:

XSS

Como resultado, identificou-se que os eventos de touch não estavam sendo bloqueados.

Os eventos de touch são “disparados” sempre que ocorre um ou mais pontos de toque na superfície touch do dispositivo. Resumindo: são ativados quando tocamos na tela do celular ou outro dispositivo que possua touchscreen, como um notebook.

Com essas informações em mãos, podemos agora validar o comportamento do WAF ao receber um Payload neste formado. Enviando a requisição:

XSS

Recebemos então a seguinte resposta:

XSS

Resultando na validação da falta de sanitização dos caracteres especiais pela aplicação e ao mesmo tempo a “aceitação” do WAF para estes eventos e tags inseridas.

Construindo Payload Final

Até o momento já temos então os caracteres que não estão sendo devidamente sanitizados e os eventos e tags aceitos pelo WAF. Com esta estrutura, poderíamos simplesmente inserir nosso método JavaScript agora para alarmar e validar o XSS na aplicação, utilizando o seguinte Payload:

No entanto, a curva é mais embaixo. Se tentarmos simplesmente inserir esse Payload, iremos receber novamente o bloqueio esperado:

XSS

Mesmo com as informações que já possuímos, o alert() do JavaScript ainda está sendo bloqueado. Para poupar o tempo, após algumas tentativas de alteração, encoding, padding, etc., foi possível identificar que o WAF não estava detectando como malicioso caso um Payload em CharCode fosse inserido.

Portanto, foi montado outro Payload básico e transformado em CharCode:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

O CharCode foi então inserido dentro do método String.fromCharCode, que por seguinte estava dentro do método document.write. Desta forma, caso interpretado, o JavaScript iria retornar em string o nosso Payload criado e, por fim, executar para o usuário final quando o mesmo ativar o método touch na tela.

Payload:

Testando o resultado final, o Payload foi inserido e interpretado com sucesso:

Tela de computador com texto preto sobre fundo branco

Descrição gerada automaticamente

Acessando a URL por um dispositivo móvel com touchscreen, foi possível validar o XSS ao realizar um toque na tela:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente
About the Author

Deixe uma resposta