
PoC für CVE-2025-30921
WordPress-Plugin
Komponentenname Newsletters
Verwundbare Version <= 4.9.9.7
Komponenten-Slug newsletters-lite
Komponenten-Link https://wordpress.org/plugins/newsletters-lite/
Schwachstellenklasse A3: Injection
Schwachstellenart SQL-Injection
Administrator
Beim Anzeigen der Statistik-Übersichtsgrafik im Plugin-Dashboard (/wp-admin/admin.php?page=newsletters) des Newsletters-Plugins in Version 4.9.9.7 oder niedriger kommt es aufgrund unzureichender Eingabevalidierung und unzureichender Escape-Verarbeitung von URL-Parametern zu einer SQL-Injection-Schwachstelle.
Durch diese Schwachstelle kann ein Angreifer mit Administratorrechten Datenbankinformationen der Zielwebsite extrahieren.
Bereiten Sie eine WordPress-Website mit dem Newsletters-Plugin in Version 4.9.9.7 oder niedriger vor.
Navigieren Sie zum Dashboard-Menü des Newsletters-Plugins (/wp-admin/admin.php?page=newsletters).

Suchen Sie mithilfe der Browser-Entwicklertools im Tab 'Elements' nach action=wpmlwelcomestats&security= und prüfen Sie den Wert von security. Wenn das Suchergebnis beispielsweise wie unten gezeigt aussieht, notieren Sie sich 22b1ac0de6.
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

Geben Sie den notierten security-Wert in den Abschnitt <SECURITY VALUE> des folgenden URL-Pfads ein und senden Sie eine Anfrage an diese 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
Beim Anfordern der URL, bei der die SQL-Injection-Schwachstelle aus dem obigen PoC auftritt, wird die Funktion ajax_welcomestats innerhalb der Datei /wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php aufgerufen.
An diesem Punkt wird der Anforderungsparameter history_id direkt als Bedingungsklausel in der SQL-Abfragezeichenfolge referenziert und als Variable $history_condition initialisiert. Diese Variable wird ohne jegliche Escape-Verarbeitung an die Datenbankabfrage übergeben.

Da es daher keine Validierung oder Escape-Verarbeitung für Werte gibt, die im URL-Parameter history_id eingegeben werden, kommt es zu einer SQL-Injection-Schwachstelle. (Beachten Sie, dass auch die URL-Parameter from und to aufgrund unzureichender Eingabevalidierung und Escape-Verarbeitung anfällig für SQL-Injection-Angriffe sind.)
Unter den URL-Parametern enthält
history_iddas SQL-Injection-Payload, das die Abfrage des Datenbanknamens (DATABASE()) und der Version (@@VERSION) ermöglicht. Wenn dersecurity-Wert beispielsweise22b1ac0de6beträgt, rufen Sie die folgende URL auf.
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
Wenn Sie die Antwort auf die URL-Anfrage prüfen, können Sie bestätigen, dass der Datenbankname und die Versionsinformationen aufgrund der SQL-Injection-Schwachstelle über den Parameter history_id offengelegt werden.
