Uma das classes mais comuns de vulnerabilidade em sites é chamada de “Cross-Site Scripting” ou “XSS”. Vulnerabilidades XSS são onde é possível para um usuário fazer com que o JavaScript seja executado. Existem várias variantes diferentes de vulnerabilidade XSS, com vários graus de gravidade.
O problema de um invasor ser capaz de executar JavaScript nas sessões de outros usuários é que é possível que o invasor faça qualquer coisa no site que as vítimas veem. Isso inclui redirecionar vítimas para sites externos, roubar tokens de autenticação e monitorar detalhes de pagamento.
A forma mais severa de vulnerabilidade XSS é “Stored” ou “Persistent” Cross-Site Scripting, onde é possível para um invasor criar uma carga XSS e então enviá-la, para que seja salva no banco de dados. Com um exploit XSS salvo no banco de dados, é possível que ele afete outros usuários por um longo período.
Outra forma de Cross-Site Scripting é “refletida”, este tipo não é salvo em nenhum ponto, em vez disso, a carga útil é incluída no navegador. Normalmente, esse tipo de XSS faz parte de ataques de phishing, em que um invasor tenta enganar a vítima para clicar em um link malicioso.
Geralmente, a maioria dos ataques XSS tem a carga útil enviada ao servidor em algum ponto, mas alguns ataques são puramente do lado do cliente, nunca sendo enviados para o servidor e, em vez disso, afetando apenas o JavaScript do lado do cliente. Isso é chamado de XSS baseado em DOM, pois permanece no Modelo de Objeto de Documento JavaScript, ou DOM. Esse tipo de vulnerabilidade é particularmente difícil de identificar e resolver porque as explorações nunca são vistas pelo servidor e, portanto, não podem ser registradas.
Historicamente, a técnica de prevenção contra vulnerabilidades XSS é filtrar todos os dados enviados pelo usuário, usando listas de bloqueio para rejeitar qualquer mensagem com caracteres ou palavras significativas em JavaScript. Isso tendia a levar a uma corrida armamentista para encontrar desvios para o filtro, ao mesmo tempo que evitava alguns envios legítimos de usuários. A solução correta é usar entidades HTML para codificar os dados enviados pelo usuário. com os módulos de entidades HTML habilitados, os caracteres são codificados automaticamente em um formato em que o navegador sabe que deve exibi-los como os símbolos corretos, mas não deve tratá-los como código.