CRSF (Cross-site Request Forgery)

Atacantes podem utilizar algo que indica a sessão do seu usuário (e.g. cookie) para executar uma requisição customizada que acaba enviando junto seu autenticador de sessão. Por exemplo:
Se a vítima estiver logada, o atacante pode enviar um e-mail com um link para uma página que executaria o seguinte script dentro de um iframe ou até mesmo direto, se a sua aplicação não tiver uma correta configuração de CORS.
<script> var xhr = new XMLHttpRequest(); var url = "https://my-app/api/transfer"; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { ... } }; var data = JSON.stringify({"to": "hacker_user_id", "value": 500.0}); xhr.send(data); </script>
Como o endpoint é a URL real da aplicação, o browser vai enviar todos cookies que pertencem àquela URL. Logo, a requisição vai ser autenticada com sua sessão.

Prevenção

  • Configuração de CORS: a aplicação no servidor deve aceitar apenas requisições que venham do mesmo domínio da aplicação do client.
  • CRSF Token: quando um usuário iniciar uma sessão, gere um token e armazene na session storage ou em qualquer lugar que não seja cookies. Então envie esse token no header de todas suas requisições e valide no back-end se ele pertence a sessão do usuário.
  • Tempo de sessão: avalie a necessidade de exigir autenticação mais frequentemente ou diminuir o tempo de sessão.