Aula 12 - OWASP Top 10 🔟
Objetivo
Objetivo: Conhecer as 10 categorias de vulnerabilidades web mais críticas do mundo, catalogadas pela OWASP, com foco especial em Injection e Broken Access Control — as mais exploradas na prática.
1. O que é a OWASP? 🏛️
A OWASP (Open Worldwide Application Security Project) é uma organização sem fins lucrativos que mantém, entre outros recursos, uma lista atualizada periodicamente das vulnerabilidades web mais críticas — referência obrigatória para qualquer desenvolvedor.
2. As Categorias do OWASP Top 10 📊
| # | Categoria | O que é |
|---|---|---|
| 1 | Broken Access Control | Falhas que permitem acessar recursos sem permissão adequada |
| 2 | Cryptographic Failures | Uso incorreto ou ausência de criptografia em dados sensíveis |
| 3 | Injection | Inserir código malicioso via entrada do usuário (SQL, comandos, etc.) |
| 4 | Insecure Design | Falhas de segurança na arquitetura, não só na implementação |
| 5 | Security Misconfiguration | Configurações padrão inseguras, permissões excessivas |
| 6 | Vulnerable Components | Usar bibliotecas/dependências desatualizadas com falhas conhecidas |
| 7 | Auth Failures | Falhas em autenticação e gerenciamento de sessão |
| 8 | Software/Data Integrity Failures | Confiar em atualizações/dados sem verificar integridade |
| 9 | Logging Failures | Falta de logs adequados para detectar e investigar ataques |
| 10 | SSRF | Servidor é enganado para fazer requisições a locais não autorizados |
3. Foco Prático: SQL Injection 💉
A vulnerabilidade mais didática e ainda muito comum. Acontece quando a entrada do usuário é concatenada diretamente em uma consulta SQL.
# ❌ VULNERÁVEL - concatenação direta
query = f"SELECT * FROM usuarios WHERE nome = '{nome_usuario}'"
# Se nome_usuario for: ' OR '1'='1
# A query vira: SELECT * FROM usuarios WHERE nome = '' OR '1'='1'
# Isso retorna TODOS os usuários!
# ✅ SEGURO - consulta parametrizada (prepared statement)
cursor.execute("SELECT * FROM usuarios WHERE nome = %s", (nome_usuario,))
graph TD
A[Entrada do usuário] --> B{Concatenada direto na query?}
B -- Sim --> C[❌ SQL Injection possível]
B -- Não, usa prepared statement --> D[✅ Entrada tratada como dado, nunca como código] 4. Foco Prático: Broken Access Control 🚪
A categoria número 1 do OWASP na prática mais recente. Acontece quando o sistema não verifica corretamente se o usuário logado tem permissão para acessar um recurso específico.
- IDOR (Insecure Direct Object Reference): mudar
/pedidos/123para/pedidos/124e conseguir ver o pedido de outra pessoa, porque o backend nunca verificou se aquele pedido pertence ao usuário logado.
Autenticado ≠ Autorizado
Só porque um usuário está logado, não significa que ele deve poder acessar qualquer recurso do sistema — cada endpoint precisa verificar explicitamente a permissão (Aula 07).
5. Mini-Projeto: Caça-Vulnerabilidades 🚀
- Encontre (ou peça) um trecho de código com uma consulta SQL montada por concatenação de strings.
- Identifique a vulnerabilidade e explique como ela seria explorada.
- Reescreva o código de forma segura, usando prepared statements.
- Repita o exercício com um endpoint que busca um recurso por ID sem checar se ele pertence ao usuário logado (IDOR).
6. Exercício de Fixação 🧠
- O que significa a sigla OWASP e qual o objetivo do OWASP Top 10?
- Explique com suas palavras como funciona um ataque de SQL Injection.
- O que é um ataque IDOR e por que ele se encaixa na categoria "Broken Access Control"?
Próxima Aula: Como se defender do OWASP Top 10 na prática: Proteções para Aplicações Web 🛡️