Intermediário Web — OWASP Top 10
Autenticação e Sessão Quebradas
Falhas de autenticação permitem que atacantes se passem por usuários legítimos. Abrangem desde senhas fracas até implementações incorretas de tokens de sessão e JWT.
Brute Force e Credential Stuffing
Brute force: tenta combinações de senha exaustivamente. Credential stuffing: usa listas de credenciais vazadas de outros serviços.
Ferramenta de teste (ambiente próprio / autorizado):
hydra -l admin@example.com -P wordlist.txt https-post-form \
"//example.com/login:email=^USER^&password=^PASS^:Invalid credentials"
Mitigação:
- Rate limiting por IP e por conta.
- Lockout progressivo após N tentativas.
- CAPTCHA em formulários de login.
- Alertas por e-mail em login de novo dispositivo.
Session Fixation
O atacante define o ID de sessão antes da autenticação.
1. Atacante obtém session ID válido: GET /login → Set-Cookie: SESSID=abc123
2. Envia link para vítima: https://example.com/login?SESSID=abc123
3. Vítima faz login com esse session ID
4. Atacante usa o mesmo SESSID abc123 — agora autenticado como vítima
Prevenção: regenerar o ID de sessão após autenticação bem-sucedida.
session_start();
// Após validar credenciais:
session_regenerate_id(true); // novo ID, destrói o antigo
$_SESSION['user_id'] = $user->id;
JWT Fraco — Algoritmo “none” e HS256 vs RS256
Header JWT: {"alg":"none","typ":"JWT"}
Payload: {"sub":"1","role":"admin"}
Assinatura: (vazia)
Bibliotecas antigas aceitavam alg:none sem verificação de assinatura.
Troca de HS256 para RS256:
- HS256: segredo compartilhado — comprometido o servidor, comprometido o JWT.
- RS256: chave privada só no servidor de autenticação; outros serviços verificam só com chave pública.
import jwt
# ERRADO — não especificar algorithms permite bypass
payload = jwt.decode(token, secret)
# CORRETO
payload = jwt.decode(token, secret, algorithms=["HS256"])
Tokens de Sessão Previsíveis
// Geração fraca (evite)
session_id = str(user_id) + str(int(time.time()))
// Geração segura
import secrets
session_id = secrets.token_urlsafe(32) # 256 bits de entropia
Checklist de autenticação segura
- Senhas armazenadas com bcrypt/argon2 (custo adequado).
- MFA habilitado para contas privilegiadas.
- Expiração de sessão após inatividade (ex: 30 min).
- Logout invalida o token/sessão no servidor.
- HTTPS obrigatório; cookies com
SecureeHttpOnly. - Não exibir se o usuário existe ou não na mensagem de erro (“Credenciais inválidas”, não “Usuário não encontrado”).
- Monitorar tentativas de login suspeitas com alertas em tempo real.