Pular para conteúdo

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/123 para /pedidos/124 e 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 🚀

  1. Encontre (ou peça) um trecho de código com uma consulta SQL montada por concatenação de strings.
  2. Identifique a vulnerabilidade e explique como ela seria explorada.
  3. Reescreva o código de forma segura, usando prepared statements.
  4. 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 🧠

  1. O que significa a sigla OWASP e qual o objetivo do OWASP Top 10?
  2. Explique com suas palavras como funciona um ataque de SQL Injection.
  3. 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 🛡️