
PoC of CVE-2025-30921
Plugin WordPress
Component name Newsletters
Vulnerable version <= 4.9.9.7
Component slug newsletters-lite
Component link https://wordpress.org/plugins/newsletters-lite/
Vulnerability class A3 : Injection
Vulnerability type Injection SQL
Administrateur
Lors de la visualisation du graphique d'aperçu des statistiques dans le tableau de bord du plugin (/wp-admin/admin.php?page=newsletters) de la version 4.9.9.7 ou inférieure du plugin Newsletters, une vulnérabilité d'injection SQL se produit en raison d'une validation insuffisante des entrées et d'un traitement d'échappement des paramètres d'URL.
Grâce à cette vulnérabilité, un attaquant disposant de privilèges d'administrateur peut l'exploiter pour extraire des informations de la base de données du site cible.
Préparez un site WordPress avec la version 4.9.9.7 ou inférieure du plugin Newsletters installé.
Accédez au menu du tableau de bord du plugin Newsletters (/wp-admin/admin.php?page=newsletters).

À l'aide des outils de développement du navigateur, recherchez action=wpmlwelcomestats&security= dans l'onglet « Elements » et vérifiez la valeur de security. Par exemple, si le résultat de la recherche apparaît comme ci-dessous, notez 22b1ac0de6.
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

Saisissez la valeur de security notée dans la section <SECURITY VALUE> du chemin URL ci-dessous et envoyez une requête à cette URL
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=<SECURITY VALUE>&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
Lors de la demande de l'URL où se produit la vulnérabilité d'injection SQL dans le PoC ci-dessus, la fonction ajax_welcomestats dans le fichier /wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php est appelée.
À ce stade, le paramètre de requête history_id est directement référencé comme clause de condition dans la chaîne de requête SQL et initialisé comme variable $history_condition. Cette variable est ensuite transmise à la requête de base de données sans aucun traitement d'échappement.

Par conséquent, comme il n'y a pas de validation ou de traitement d'échappement pour les valeurs saisies dans le paramètre URL history_id, une vulnérabilité d'injection SQL se produit. (Notez que les paramètres URL from et to sont également vulnérables aux attaques par injection SQL en raison d'une validation et d'un traitement d'échappement insuffisants.)
Parmi les paramètres de l'URL,
history_idcontient la charge utile d'injection SQL, ce qui permet d'interroger le nom de la base de données (DATABASE()) et sa version (@@VERSION). Par exemple, lorsque la valeur desecurityest22b1ac0de6, accédez à l'URL suivante.
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=22b1ac0de6&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
En vérifiant la réponse de la requête URL, vous pouvez confirmer que le nom de la base de données et les informations de version sont exposés en raison de la vulnérabilité d'injection SQL via le paramètre history_id.
