Cross-site Request Forgery (CSRF)

O que é?

O CSRF é uma vulnerabilidade que induz a vítima a realizar ações que ela não pretendia fazer em uma aplicação web na qual ela está autenticada no momento.

Como funciona?

O ataque funciona porque o navegador envia automaticamente os cookies de sessão para o servidor em cada requisição. O atacante se aproveita dessa confiança que o site tem no navegador do usuário para realizar ações em nome da vítima.

Exemplos de Ações:

  • Transferência de fundos.
  • Alteração de endereço de e-mail.
  • Mudança de senha.

Condições para um ataque bem-sucedido

Para que um ataque CSRF ocorra, três condições devem ser atendidas:

  1. Uma ação relevante: Deve haver uma ação dentro da aplicação que o atacante tenha motivo para induzir (ex: mudar a senha de outros usuários).
  2. Manipulação de sessão baseada em cookies: A aplicação depende apenas de cookies de sessão para identificar o usuário que fez a requisição.
  3. Nenhum parâmetro de requisição imprevisível: As requisições para realizar a ação não contêm nenhum parâmetro que o atacante não possa determinar ou adivinhar (ex: tokens secretos).

Anatomia de um ataque

O atacante geralmente constrói uma página HTML maliciosa que contém um formulário escondido. Assim que a vítima visita a página, o script executa um “auto-submit” do formulário para o site alvo.

Exemplo de Payload:

<html>
  <body>
    <form action="https://vulnerable-website.com/email/change" method="POST">
      <input type="hidden" name="email" value="[email protected]" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body>
</html>

Como Prevenir

Anti-CSRF Tokens

  • É a defesa mais comum.

  • O servidor gera um token único, secreto e imprevisível para cada sessão de usuário ou requisição.

  • O token deve ser incluído em requisições que alteram o estado do sistema (como POST).

  • O servidor verifica se o token enviado na requisição corresponde ao token gerado; se não corresponder, a requisição é rejeitada.

SameSite Cookies

Atributo na configuração do cookie que controla se o cookie é enviado em requisições originadas de outros sites:

  • Strict: O cookie só é enviado se a requisição partir do mesmo site onde o cookie foi criado.

  • Lax: O cookie é enviado em navegações “top-level” (como links), mas não em requisições transversais como imagens ou frames de terceiros.

  • None: O cookie é enviado em todas as situações (requer o atributo Secure).