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:
- 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).
- 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.
- 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).