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 Secure e HttpOnly.
  • 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.