O que são ataques CSRF e como você pode evitá-los?
Cross-Site Request Forgery (CSRF) é uma das formas mais antigas de explorar as vulnerabilidades de um site. Ele tem como alvo switches da Web do lado do servidor que geralmente exigem autenticações, como login. Durante um ataque CSRF, um invasor tem como objetivo forçar sua vítima a fazer uma solicitação da Web não autorizada e mal-intencionada em seu nome.
Práticas fracas ou insatisfatórias de segurança de sites e descuido no caminho do usuário são algumas das causas comuns de um ataque CSRF bem-sucedido.
Vejamos o que é um ataque CSRF e as maneiras possíveis de se prevenir dele como desenvolvedor ou usuário.
Como os ataques CSRF afetam você?
Um CSRF é um ataque usado para implementar solicitações não autorizadas durante ações da web que exigem login ou autenticação do usuário. Ataques CSRF podem tirar vantagem de IDs de sessão, cookies, bem como outras vulnerabilidades baseadas em servidor para roubar as credenciais de um usuário.
Por exemplo, habilitar procedimentos anti-CSRF evita interações maliciosas entre domínios.
Depois que essa barreira é quebrada, um invasor pode tirar vantagem rapidamente da ID de sessão do usuário por meio dos cookies criados pelo navegador do usuário e incorporar uma tag de script ao site vulnerável.
Ao manipular um ID, o invasor também pode redirecionar os visitantes para outra página da Web ou explorar métodos de engenharia social, como e-mail para enviar links, incentivando a vítima a baixar software malicioso.
Assim que a vítima executa essas ações, ela envia uma solicitação HTTP para a página de serviço do usuário e autoriza a ação de solicitação em favor do invasor. Isso pode ser devastador para um usuário desavisado.
Um ataque CSRF bem-sucedido pode fazer com que usuários autorizados percam suas credenciais de acesso a um invasor, especialmente durante ações baseadas no servidor, como solicitações de alteração de senha ou nome de usuário. Em cenários piores, o invasor assume toda a sessão e age em nome dos usuários.
O CSRF tem sido usado para sequestrar transações de fundos pela web, bem como alterar nomes de usuário e senhas, o que leva os usuários a perderem o acesso ao serviço afetado.
Como invasores sequestram suas sessões com CSRF: exemplos
Os principais alvos dos ataques CSRF são ações da web que envolvem a autenticação de um usuário. Para ter sucesso, são necessárias ações não intencionais da vítima.
Durante um ataque CSRF, as ações GET, DELETE e PUT, bem como as solicitações POST vulneráveis são os principais alvos de um invasor.
Vejamos o significado desses termos:
- GET: Uma solicitação para coletar um resultado do banco de dados; por exemplo, pesquisa do Google.
- POST: normalmente para enviar solicitações por meio de formulários da web. Uma solicitação POST é comum durante o registro ou login de um usuário, também conhecido como autenticação.
- DELETE: Para remover um recurso do banco de dados. Você faz isso sempre que excluir sua conta de um serviço da web específico.
- PUT: uma solicitação PUT modifica ou atualiza um recurso existente. Um exemplo é mudar seu nome no Facebook .
Na prática, os invasores usam o sequestro de sessão para fazer backup de um ataque CSRF. Ao usar essa combinação, o invasor pode usar um hijack para alterar o endereço IP da vítima.
A mudança no endereço IP então registra a vítima em um novo site onde o invasor inseriu um link fraudulento que envia um formulário replicado ou solicitação de servidor modificada criada por CSRF.
Um usuário desavisado pensa que o redirecionamento vem do provedor de serviços e clica no link na página do invasor. Depois de fazer isso, os hackers enviam um formulário no carregamento da página sem o seu conhecimento.
Exemplo de um Ataque CSRF de solicitação GET
Imagine tentar fazer um pagamento online por meio de uma plataforma de e-commerce não segura. Os proprietários da plataforma usam a solicitação GET para processar sua transação. Essa consulta GET pode ter a seguinte aparência:
https://websiteurl/pay?amount=$10&company=[company ABC's account]
Um sequestrador pode roubar sua transação facilmente, alterando os parâmetros da solicitação GET. Para fazer isso, tudo o que eles precisam fazer é trocar o seu nome pelo deles e, pior, mudar o valor que você pretende pagar. Em seguida, eles ajustam a consulta original para algo assim:
https://websiteurl/pay?amount=$20000&company=[attacker's account]
Depois de clicar em um link para essa solicitação GET modificada, você acaba fazendo uma transferência não intencional para a conta do invasor.
Transacionar por meio de solicitações GET é uma prática ruim e torna as atividades vulneráveis a ataques.
Exemplo de um ataque de CSRF de solicitação POST
No entanto, muitos desenvolvedores acreditam que usar a solicitação POST é mais seguro para fazer transações na web. Embora isso seja verdade, infelizmente, uma solicitação POST também é suscetível a ataques CSRF.
Para sequestrar com sucesso uma solicitação POST, tudo que um invasor precisa é sua ID de sessão atual, alguns formulários invisíveis replicados e, às vezes, um pouco de engenharia social.
Por exemplo, um formulário de solicitação POST pode ter a seguinte aparência:
<form action="Company ABC's account" method="POST">
<input type="text" name="name" placeholder="name"><br>
<input type="number" name="amount"><br>
<input type="submit" name="submit">
</form>
No entanto, um invasor pode trocar sua credencial criando uma nova página e modificando o formulário acima para:
<body onload="document.getElementById('payment-form').submit();">
<form action="Attacker's account" id="payment-form" method="POST">
<input type="text" hidden name="name" placeholder="name"><br>
<input type="number" hidden value=30000 name="amount"><br>
<input type="submit" hidden name="submit">
</form>
</body>
No formulário manipulado, o invasor define o valor do campo de valor como "30000", troca o número da conta do destinatário para o seu, envia o formulário no carregamento da página e também oculta os campos do formulário do usuário.
Depois que eles sequestram a sessão atual, sua página de transação inicia um redirecionamento para a página do invasor, que solicita que você clique em um link que eles sabem que você provavelmente visitará.
Clicar aqui carrega o envio do formulário replicado, que transfere seus fundos para a conta do invasor. Isso significa que você não precisa clicar em botões como "enviar" para que a transação ocorra, pois o JavaScript faz isso automaticamente ao carregar a próxima página da web.
Como alternativa, um invasor também pode criar um rascunho de um email incorporado em HTML que solicita que você clique em um link para realizar o mesmo envio de formulário de carregamento de página.
Outra ação vulnerável a um ataque CSRF é uma alteração de nome de usuário ou senha, um exemplo de solicitação PUT. Um invasor replica seu formulário de solicitação e substitui seu endereço de e-mail pelo dele.
Em seguida, eles roubam sua sessão e o redirecionam para uma página ou enviam um e-mail solicitando que você clique em um link atraente.
Isso então envia um formulário manipulado que envia o link de redefinição de senha para o endereço de e-mail do hacker em vez do seu. Dessa forma, o hacker altera sua senha e o desconecta de sua conta.
Como prevenir ataques CSRF como desenvolvedor
Um dos melhores métodos para evitar um CSRF é usar tokens de alteração frequente, em vez de depender de cookies de sessão para executar uma alteração de estado no servidor.
Muitas estruturas de back-end modernas oferecem segurança contra CSRF. Portanto, se você deseja evitar os detalhes técnicos de se fortalecer contra o CSRF, pode lidar com isso facilmente usando estruturas do lado do servidor que vêm com tokens anti-CSRF integrados.
Quando você usa um token anti-CSRF, as solicitações baseadas no servidor geram cadeias de caracteres aleatórias em vez de cookies de sessão vulneráveis mais estáticos. Dessa forma, você protege sua sessão de ser adivinhada pelo sequestrador.
A implementação de um sistema de autenticação de dois fatores (2FA) para executar transações em seu aplicativo da web também reduz as chances de um CSRF.
É possível iniciar um CSRF por meio de cross-site scripting (XSS), que envolve a injeção de script nos campos do usuário, como formulários de comentários. Para evitar isso, é recomendável habilitar o escape automático de HTML em todos os campos de formulário do usuário em seu site. Essa ação impede que os campos do formulário interpretem os elementos HTML.
Como prevenir ataques CSRF como um usuário
Como usuário de um serviço da Web que envolve autenticação, você tem um papel a desempenhar para impedir que invasores roubem suas credenciais e sessões por meio de CSRF também.
Certifique-se de usar serviços da Web confiáveis durante atividades que envolvam transferência de fundos.
Além disso, use navegadores da web seguros que protegem os usuários da exposição da sessão, bem como mecanismos de pesquisa seguros que protegem contra vazamentos de dados de pesquisa.
Como usuário, você também pode depender de autenticadores de terceiros como o Google Authenticator ou suas alternativas para verificar sua identidade na web.
Embora você possa se sentir impotente para impedir um invasor de sequestrar sua sessão, você ainda pode ajudar a evitar isso garantindo que seu navegador não armazene informações como senhas e outros detalhes de login.
Aumente a sua segurança na web
Os desenvolvedores precisam testar regularmente os aplicativos da web quanto a violações de segurança durante o desenvolvimento e a implantação.
No entanto, é comum introduzir outras vulnerabilidades ao tentar prevenir outras. Portanto, tome cuidado para garantir que você não violou outros parâmetros de segurança ao tentar bloquear um CSRF.