Articles

XSS vs CSRF

Nesta secção, vamos explicar as diferenças entre XSS e CSRF, e discutir se os tokens CSRF podem ajudar a prevenir ataques XSS.

Qual é a diferença entre XSS e CSRF?

Cross-site scripting (ou XSS) permite a um atacante executar JavaScript arbitrário dentro do navegador de um usuário vítima.

Cross-site request forgery (ou CSRF) permite a um atacante induzir um usuário vítima a executar ações que ele não pretende executar.

As consequências das vulnerabilidades do XSS são geralmente mais graves do que para as vulnerabilidades do CSRF:

  • O CSRF frequentemente só se aplica a um subconjunto de ações que um usuário é capaz de executar. Muitas aplicações implementam defesas do CSRF em geral, mas ignoram uma ou duas ações que são deixadas expostas. Por outro lado, um exploit XSS bem sucedido pode normalmente induzir um usuário a executar qualquer ação que o usuário seja capaz de executar, independentemente da funcionalidade na qual a vulnerabilidade surge.
  • CSRF pode ser descrito como uma vulnerabilidade “one-way”, na medida em que enquanto um atacante pode induzir a vítima a emitir um pedido HTTP, eles não podem recuperar a resposta a partir desse pedido. Por outro lado, XSS é “bidirecional”, na medida em que o script injetado do atacante pode emitir solicitações arbitrárias, ler as respostas e exfiltrar dados para um domínio externo à escolha do atacante.

Can que os tokens CSRF previnam ataques XSS?

Alguns ataques XSS podem de facto ser evitados através do uso efectivo de tokens CSRF. Considere uma simples vulnerabilidade XSS refletida que pode ser explorada trivialmente desta forma:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

Agora, suponha que a função vulnerável inclua um token CSRF:

https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>

Assumindo que o servidor valida corretamente o token CSRF, e rejeita pedidos sem um token válido, então o token impede a exploração da vulnerabilidade do XSS. A pista aqui está no nome: “cross-site scripting”, pelo menos em sua forma refletida, envolve um pedido cross-site. Ao impedir que um atacante forje um pedido entre sites, a aplicação previne a exploração trivial da vulnerabilidade XSS.

Algumas advertências importantes surgem aqui:

  • Se uma vulnerabilidade XSS refletida existir em qualquer outro lugar do site dentro de uma função que não esteja protegida por um token CSRF, então esse XSS pode ser explorado da maneira normal.
  • Se uma vulnerabilidade XSS explorável existe em qualquer lugar em um site, então a vulnerabilidade pode ser aproveitada para fazer um usuário vítima executar ações mesmo que essas ações sejam protegidas por tokens CSRF. Nesta situação, o script do atacante pode solicitar a página relevante para obter um token CSRF válido, e então usar o token para executar a ação protegida.
  • Os tokens CSRF não protegem contra as vulnerabilidades do XSS armazenado. Se uma página que é protegida por um token CSRF também é o ponto de saída para uma vulnerabilidade XSS armazenada, então essa vulnerabilidade XSS pode ser explorada da maneira usual, e a carga útil XSS será executada quando um usuário visitar a página.