kb.erickguedes.com
OWASP: Segurança Web na Prática

Falhas de Autenticação e Controle de Acesso

Aula 4 de 6

A07:2021 — Identification and Authentication Failures

Credential Stuffing

Uso de credenciais vazadas em outros serviços contra o alvo.

Mitigação:
  - MFA obrigatório
  - Rate limiting (ex: 5 tentativas/min)
  - CAPTCHA após falhas
  - Verificação de credenciais vazadas (HaveIBeenPwned API)
  - Device fingerprinting

Senhas Fracas

# Verificar senha contra lista de comuns
import requests

def check_breached_password(password):
    """Verificar se senha já foi vazada (API HaveIBeenPwned - k-anonymity)"""
    import hashlib
    sha1 = hashlib.sha1(password.encode()).hexdigest().upper()
    prefix = sha1[:5]
    suffix = sha1[5:]
    resp = requests.get(f"https://api.pwnedpasswords.com/range/{prefix}")
    return suffix in resp.text

Session Fixation

Atacante força vítima a usar um ID de sessão conhecido.

Ataque:
  1. Atacante obtém session ID e engana vítima
  2. Vítima faz login com session ID fixado
  3. Atacante usa mesmo session ID — acesso à conta da vítima

Prevenção:
  - Gerar novo session ID após login
  - HttpOnly + Secure flags
  - Regenerar token de sessão no login

JWT Attacks

Estrutura JWT

Header.Payload.Signature

Header:    {"alg":"HS256","typ":"JWT"}
Payload:   {"sub":"admin","iat":1700000000}
Signature: HMAC-SHA256(base64(header) + "." + base64(payload), secret)

Ataque alg:none

Header modificado: {"alg":"none","typ":"JWT"}
Assinatura: (vazia)

Se o servidor aceitar "none", qualquer token é válido.
# Testar ataque alg:none
# Token original: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0In0.x
# Token modificado: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJhZG1pbiJ9.
#                    |--- alg:none ---|    |--- sub:admin ---|

Ataques de Força Bruta (HS256)

# Força bruta de secret JWT com hashcat
hashcat -m 16500 jwt.txt /usr/share/wordlists/rockyou.txt

# Verificar JWT com jwt_tool
python3 jwt_tool.py eyJhbGciOiJIUzI1NiJ9...
python3 jwt_tool.py -T token.json token.jwt   # Testar tampering

Ataque de Chave Pública (RS256 → HS256)

Se o servidor usa RS256 (pública/privada) mas permite HS256:
  - Obter a chave pública do servidor
  - Assinar token com HS256 usando a chave pública como segredo
  - Servidor verifica com mesma chave pública

A01:2021 — Broken Access Control

IDOR (Insecure Direct Object References)

GET /api/users/me    → 401 (sem permissão)
GET /api/users/1     → 200 (dados de outro usuário)
GET /api/orders/1001 → 200
GET /api/orders/1002 → 200 (pedido de outro cliente)
# Testar IDOR
curl -H "Authorization: Bearer TOKEN" https://api.alvo.com/users/1
curl -H "Authorization: Bearer TOKEN" https://api.alvo.com/users/2
curl -H "Authorization: Bearer TOKEN" https://api.alvo.com/users/3

Privilege Escalation

Vertical: usuário comum → admin
  - Modificar parâmetro: role=admin, isAdmin=true
  - Acessar /admin sem permissão

Horizontal: usuário A → usuário B
  - Alterar ID na URL: /user/123 → /user/456

Path Traversal

# Directory traversal
../../etc/passwd
..%252f..%252f..%252fetc/passwd       # Double URL encoding
....//....//....//etc/passwd           # Bypass filter
..;/..;/..;/etc/passwd                 # Bypass filter (Java)
file:///etc/passwd                     # Protocolo file

CORS Misconfiguration

# Configuração insegura — qualquer origem pode ler resposta
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

# Ataque: site malicioso lê dados da API alvo via JavaScript
# fetch('https://api.alvo.com/dados', { credentials: 'include' })

OAuth2/OIDC Security

Ataques Comuns

- CSRF no flow OAuth (state parameter ausente)
- Code injection (interceptar authorization code)
- Token interception (redirect_uri mal configurado)
- Consent phishing (escopo excessivo)
- Mix-up attacks (confundir authorization server com resource server)

Mitigações

- state parameter obrigatório (anti-CSRF)
- PKCE (Proof Key for Code Exchange) — S256
- redirect_uri configurado estritamente
- Validar nonce no ID Token
- Escopos mínimos necessários

MFA Implementation

# Exemplo de implementação TOTP
import pyotp

# Gerar secret
secret = pyotp.random_base32()
qr_url = pyotp.totp.TOTP(secret).provisioning_uri("[email protected]", issuer="App")

# Verificar código
totp = pyotp.TOTP(secret)
valid = totp.verify(user_input)  # Código de 6 dígitos

Lab: Testando Autenticação

# 1. Testar IDOR em API REST
curl -H "Authorization: Bearer TOKEN" https://api.alvo.com/users/1
curl -H "Authorization: Bearer TOKEN" https://api.alvo.com/users/2

# 2. Testar JWT alg:none
# Decodificar token
# https://jwt.io

# 3. Verificar headers de segurança
curl -I https://alvo.com | findstr "Strict-Transport-Security"
curl -I https://alvo.com | findstr "Set-Cookie"

# 4. Testar path traversal
curl https://alvo.com/../../etc/passwd

# 5. Verificar CORS
curl -H "Origin: https://atacante.com" -I https://api.alvo.com | findstr "Access-Control"

Falhas de autenticação são as mais exploradas. JWT com alg:none é inaceitável em produção. MFA e rate limiting resolvem 80% dos problemas. Sempre valide permissões no servidor, nunca confie no frontend.