
Démonstration étape par étape de CVE-2021-29447, une vulnérabilité XXE de la bibliothèque multimédia de WordPress permettant de divulguer des fichiers sensibles via des téléchargements WAVE malveillants, incluant les détails d'exploitation et de remédiation.
Un utilisateur ayant la capacité de télécharger un fichier WAVE malveillant (comme un Auteur) peut exploiter un problème d’analyse XML dans la Médiathèque de WordPress, entraînant des attaques XXE pouvant conduire à la divulgation du système de fichiers.
Vulnérabilités XML External Entity (XXE)
XML offre la possibilité de définir des entités personnalisées qui peuvent être réutilisées dans un document. Cela peut, par exemple, servir à éviter les duplications.
Le code suivant définit une entité myEntity pour une utilisation ultérieure.

La valeur des entités définies peut également provenir d’une source externe référencée par une URI. Dans ce cas, on les appelle entités externes :

Les attaques XXE abusent de cette fonctionnalité. Si un attaquant fournissait file:///var/www/wp-config.php comme URI, il réussirait à divulguer le contenu sensible d’un fichier. Ces attaques sont possibles lorsqu’un analyseur XML mal configuré est exécuté sur du contenu contrôlé par l’utilisateur.
XXE dans WordPress
WordPress dispose d’une Médiathèque qui permet aux utilisateurs authentifiés de télécharger des fichiers média, pouvant ensuite être utilisés dans leurs articles.
Pour extraire les méta-informations de ces fichiers média (par exemple, nom de l’artiste ou titre), WordPress utilise la bibliothèque getID3. Une partie de ces métadonnées est analysée sous forme XML. C’est ici qu’une vulnérabilité XXE a été signalée (ligne 730).

La fonction libxml_disable_entity_loader(true) a été dépréciée car les versions PHP 8 utilisent Libxml2 v2.9+, qui désactive par défaut la récupération d’entités externes.
Créez un fichier WAVE malveillant à l’aide de la commande suivante :

Créez un fichier dtd et ajoutez ce code ; cela vous permettra de récupérer le fichier wp-config.php qui contient des données sensibles telles que les identifiants de base de données.

Lancez maintenant un serveur HTTP :

Téléchargez le fichier .wav malveillant dans l’application WordPress. Une fois le fichier .wav téléchargé, vous devriez voir la requête suivante dans les logs de votre serveur HTTP. Note : pour exfiltrer efficacement les données, utilisez Zlib pour le décodage.

Après cela, vous obtiendrez les identifiants de la base de données. Connectez-vous à la base de données et essayez de trouver l’administrateur.

corp-001 est l’administrateur. Cassez son hash de mot de passe, puis connectez-vous en tant qu’administrateur.

WordPress a corrigé la vulnérabilité dans la version 5.7.1 en réintroduisant l’appel à la fonction libxml_disable_entity_loader(), qui avait été dépréciée dans PHP 8. Pour éviter les avertissements de dépréciation PHP, l’opérateur de suppression d’erreur PHP @ a été ajouté à l’appel.

https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447/
https://nvd.nist.gov/vuln/detail/CVE-2021-29447
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-29447
https://github.com/motikan2010/CVE-2021-29447
https://www.youtube.com/watch?v=pkooNXGHl7c
https://www.youtube.com/watch?v=tE8Smz1Jvb8
https://www.mend.io/vulnerability-database/CVE-2021-29447