Pular para conteúdo

Aula 12 – Segurança em Aplicações Web (OWASP Top 10) 🕸️

Nesta aula vamos sair da teoria criptográfica e entrar no dia a dia de quem constrói aplicações web: as vulnerabilidades mais exploradas do mundo, catalogadas pelo OWASP Top 10.


🏛️ 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 e comuns — referência obrigatória para qualquer desenvolvedor.


🔟 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

💉 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"]

🖼️ Foco Prático: XSS (Cross-Site Scripting)

Ocorre quando dados fornecidos pelo usuário são exibidos na página sem escapar caracteres especiais de HTML, permitindo injetar scripts.

<!-- Comentário de usuário exibido sem tratamento -->
<div>Comentário: <script>roubarCookies()</script></div>

Regra de ouro contra XSS

Nunca confie em dados do usuário. Sempre escape (ou use frameworks que escapam automaticamente, como React/Vue) qualquer conteúdo dinâmico antes de renderizá-lo como HTML.


💻 Testando Cabeçalhos de Segurança

$ # Verificando cabecalhos de seguranca de uma aplicacao web $ curl -sI https://example.com | grep -Ei "x-content-type|x-frame|content-security-policy" $ X-Content-Type-Options: nosniff $ X-Frame-Options: DENY $ Content-Security-Policy: default-src 'self'

📝 Exercícios de Fixação

  1. Básico: O que significa a sigla OWASP e qual o objetivo do OWASP Top 10?
  2. Básico: Explique com suas palavras como funciona um ataque de SQL Injection.
  3. Intermediário: Por que consultas parametrizadas (prepared statements) resolvem o problema de SQL Injection?
  4. Intermediário: Dê um exemplo prático de onde um XSS poderia ser injetado em uma rede social (ex: campo de comentário, nome de perfil).
  5. Desafio: Pesquise a diferença entre XSS Refletido, Armazenado e Baseado em DOM.

🚀 Mini-Projeto: Caça-Vulnerabilidades

Objetivo: Analisar um trecho de código (fornecido pelo professor ou pesquisado por você) e identificar vulnerabilidades do OWASP Top 10.

  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 trecho que renderiza entrada de usuário direto no HTML (risco de XSS).

Ir para Aula 13