Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/dungsocool/cve-2020-13671-old
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration TestingSviluppo Payload
GitHubdungsocool/cve-2020-13671-old

CVE-2020-13671-old

CVE-2020-13671 - Analisi della vulnerabilità di RCE in Drupal tramite caricamento di file e PoC

Vedi Repository
3 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2020-13671

RCE tramite caricamento file — Drupal Core

Software: Drupal Core 8.7.5 (Versioni interessate: 7.x < 7.78, 8.x < 8.8.11, 8.9.x < 8.9.9, 9.0.x < 9.0.8)
CVSS: 8.8 (Alto)
CWE: CWE-434 — Caricamento senza restrizioni di file con tipo pericoloso
CISA KEV: Sì — Vulnerabilità nota sfruttata
Advisory: SA-CORE-2020-012


Cos'è Drupal

Drupal è un sistema di gestione dei contenuti (CMS) open-source scritto in PHP, simile a WordPress o Joomla ma orientato alla realizzazione di sistemi più complessi — siti web enterprise, piattaforme multilingua. Drupal utilizza un'architettura modulare, che consente di estendere le funzionalità abilitando/disabilitando i moduli disponibili o installandone altri dalla community.

Una delle funzioni di base di qualsiasi CMS è consentire agli utenti di caricare file — avatar del profilo, documenti allegati, allegati negli articoli. Drupal salva questi file nella directory sites/default/files/ e li serve direttamente tramite il web server (Apache o Nginx).

⇒ Questo crea una chiara superficie d'attacco: se un attaccante riesce a caricare un file PHP in quella directory, il web server lo eseguirà quando viene acceduto tramite una richiesta in ingresso.

Per prevenire questo, Drupal costruisce più livelli di difesa: validazione delle estensioni dei file, rinomina dei file pericolosi, posizionamento di .htaccess per bloccare l'esecuzione di script nella directory di upload. Ma nella versione 8.7.5, gli attaccanti sfruttano esattamente il punto cieco tra questi livelli.

Condizioni di sfruttamento

Questa vulnerabilità richiede un account con permessi di caricamento file. Per impostazione predefinita in Drupal 8.7.5, gli utenti normali (Autenticati) hanno solo il permesso di visualizzare i contenuti e pubblicare commenti — nessun permesso di creare articoli o caricare file.

AccountSfruttabile?Spiegazione
AmministratoreSìPermessi di upload completi
Editor / Creatore di contenutiSìSe gli viene concesso il permesso "Crea contenuto" con upload da parte dell'amministratore
Utente autenticato (predefinito)NoPer impostazione predefinita non ha il permesso di creare contenuti o caricare file
Anonimo (non autenticato)NoNessun permesso di upload

Tuttavia, in pratica, molti siti Drupal concedono agli utenti normali i permessi di creazione contenuti (forum, blog della community, siti di notizie che consentono l'invio di articoli). In questi casi, un attaccante deve solo registrare un account per sfruttarla.

Flusso dell'attacco:

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 principale ( Root Cause )

Nel file core/modules/file/file.module, c'è una singola regex che determina quali file sono considerati eseguibili:

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

image.png

Questa regex elenca 7 estensioni: phar, php, pl, py, cgi, asp, js. Qualsiasi file con un'estensione che corrisponde a questa lista verrà automaticamente rinominato con l'aggiunta di .txt da Drupal — neutralizzando la capacità di esecuzione.

Tuttavia, il motore PHP non elabora solo i file .php. A seconda della configurazione del web server, riconosce ed esegue anche altre estensioni:

EstensioneSignificatoInclusa nella regex?
.phpPHP standardSì
.phtmlTemplate alternativo PHPNo
.php5Handler PHP 5No
.phtTemplate PHPNo
.phpsSorgente PHPNo
.shtmlInclusioni lato serverNo

5 varianti di estensione PHP sono completamente assenti dalla regex. Ciò significa che un file chiamato shell.phtml inviato a Drupal → la regex non trova corrispondenza → non viene rinominato → viene salvato con il suo nome originale nella directory di upload → il web server vede .phtml → lo esegue come PHP → l'attaccante ottiene RCE. Questa è la causa principale: Drupal utilizzava una blacklist per bloccare le estensioni pericolose, ma quella lista era incompleta.

Analisi di ogni livello di difesa

Quando un utente carica un file, Drupal lo fa passare attraverso 3 funzioni di validazione prima di salvarlo. Di seguito un'analisi del motivo per cui tutte e 3 falliscono con .phtml.

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

Scopo: rilevare le estensioni pericolose posizionate al centro del nome del file e aggiungere _ per neutralizzarle. Ecco come funziona la funzione:

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;

Ad esempio con shell.phtml:

  • explode divide in ["shell", "phtml"]
  • shift prende "shell", lasciando ["phtml"]
  • pop prende "phtml", lasciando []
  • L'array centrale è vuoto → foreach non viene eseguito
  • Restituisce "shell.phtml" intatto

Tuttavia, se il file ha una sola estensione, la funzione non interviene. Quindi, questa funzione è progettata solo per gestire file con più estensioni.

Livello 2 — FILE_INSECURE_EXTENSION_REGEX (file.module:1015)

Questo è il livello di difesa principale. Codice alla riga 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 il nome del file corrisponde alla regex → cambia il MIME in text/plain e aggiunge .txt alla fine.

Con shell.phtml:

  • preg_match('/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i', 'shell.phtml') restituisce 0
  • Nessuna corrispondenza → non entra nel blocco if → il file mantiene il suo nome originale

Quindi, questa sezione avrebbe dovuto bloccare i file pericolosi, ma poiché la regex non sa che .phtml è pericoloso, la aggira senza problemi.

Livello 3 — .htaccess nella directory di upload

Drupal posiziona un file .htaccess in 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>

La direttiva php_flag engine off spegne il motore PHP per l'intera directory, ma si applica solo a mod_php5. Drupal 8.7.5 gira su PHP 7, il che significa che mod_php7 è attivo e non disabilitato.

E .htaccess ha anche altre 3 debolezze:

  • Nginx non legge .htaccess — questo file è completamente inefficace su Nginx
  • Apache configurato con AllowOverride None → .htaccess viene ignorato
  • Server che utilizzano PHP-FPM invece di mod_php → la direttiva php_flag non ha effetto

Sfruttamento

Passo 1 — Creare la webshell

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

Passo 2 — Caricare il file

Accedi a Drupal con un account che ha i permessi di upload → Contenuti → Aggiungi contenuto → Articolo → nel campo Immagine, seleziona il file webshell.phtml → Carica.

Drupal accetta il file, non lo rinomina e lo salva con il suo nome originale in sites/default/files/.

image.png

Passo 3 — Eseguire la webshell

Dopodiché, esegui la chiamata shell con whoami:

image.png

Così, abbiamo ottenuto con successo RCE come www-data.

Proseguendo i test per visualizzare le credenziali:

image.png

Risultato

L'attaccante può leggere settings.php contenente le credenziali del database, eseguire il dump dell'intero DB, installare una reverse shell o elevare i privilegi a root.

Rimedio

Aggiornare la regex — aggiungi le 5 estensioni mancanti:

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'

Aggiornare .htaccess — aggiungi la disabilitazione per mod_php7:

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

La patch funziona ma si basa ancora su una blacklist. Se in futuro emergeranno nuove estensioni (.php8, .phpt), la regex dovrà essere aggiornata di nuovo. La whitelist — consentire solo estensioni note e sicure — sarebbe un approccio più completo.

Riepilogo

File vulnerabilecore/modules/file/file.module riga 28
Causa principaleLa blacklist della regex non include .phtml, .php5, .pht, .phps, .shtml
ImpattoCaricamento di .phtml → il server esegue → RCE
3 livelli di difesa aggiratifile_munge_filename() → FILE_INSECURE_EXTENSION_REGEX → .htaccess
PatchAggiungere 5 estensioni alla regex + disabilitare mod_php7 in .htaccess
Scarica lo strumento