
Prueba de concepto de explotación para una vulnerabilidad XSS reflejado en el plugin Groundhogg de WordPress, que demuestra la inyección de scripts sin autenticación mediante parámetros de URL manipulados.
Plugin de WordPress
Nombre del componente WordPress CRM, Email & Marketing Automation for WordPress | Award Winner — Groundhogg
Versión vulnerable <= 3.7.3.2
Slug del componente groundhogg
Enlace del componente https://wordpress.org/plugins/groundhogg/
Clase de vulnerabilidad A3: Inyección
Tipo de vulnerabilidad Cross Site Scripting (XSS)
Sin autenticación
Las versiones 3.7.3.3 y anteriores del plugin Groundhogg contienen una vulnerabilidad de Cross Site Scripting reflejado debido a una validación de entrada insuficiente y al procesamiento de escape de los parámetros de URL. Esta vulnerabilidad se produce al utilizar la funcionalidad de filtrado de búsqueda en los menús 'Contacts', 'Funnels' y 'Logs' del panel del plugin.
A través de esta vulnerabilidad, un usuario no autenticado puede crear una URL que contenga scripts maliciosos, y cuando otros usuarios acceden a esta URL, el script se ejecuta en su navegador, lo que puede provocar la fuga de información de cookies. Esto supone un grave riesgo de seguridad, ya que puede explotarse especialmente para secuestrar sesiones de usuarios con privilegios de administrador.
Prepare un sitio de WordPress con el plugin 'Groundhogg' <=3.7.3.2 activado.
Dado que este plugin utiliza la API REST, el enlace permanente debe estar configurado como
Post name.
Posteriormente, acceder a los enlaces de cada menú que se indican a continuación activará una vulnerabilidad de XSS reflejado.
Menú Contacts (/wp-admin/admin.php?page=gh_contacts)
http://localhost:8080/wp-admin/admin.php?page=gh_contacts&filters=W1t7ImlkIjoiIiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiJ9XV0

Menú Funnels (/wp-admin/admin.php?page=gh_funnels)
Para reproducir la vulnerabilidad XSS en este menú, debe existir al menos 1 Funnel.
http://localhost:8080/wp-admin/admin.php?page=gh_funnels&status=inactive&include_filters=W1t7ImlkIjoiMTBjY2FmZmUtZjE0YS00MTg5LWE0MzctYjA2MTFhMTQ2ZDk1IiwidHlwZSI6InRpdGxlIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiIsImNvbXBhcmUiOiJlcXVhbHMifV1d

Menú Logs (/admin.php?page=gh_events)
http://localhost:8080/wp-admin/admin.php?page=gh_events&tab=emails&include_filters=W1t7ImlkIjoiIiwidHlwZSI6ImZyb21fYWRkcmVzcyIsInZhbHVlIjoiPGltZyBzcmM9XCJ4XCIgb25lcnJvcj1cImFsZXJ0KGRvY3VtZW50LmNvb2tpZSlcIj4iLCJjb21wYXJlIjoiZXF1YWxzIn1dXQ

Al realizar búsquedas con filtros en los menús 'Contacts', 'Funnels' y 'Logs' del panel del plugin Groundhogg, la configuración de los filtros se codifica en Base64 antes de pasarse como parámetros de URL.
Por ejemplo, al configurar una búsqueda con filtros en el menú 'Contacts' donde 'First Name' se establece como 'Test', el parámetro de URL filters recibe los siguientes datos:
W1t7ImlkIjoiMjM3NzdjMGItYTQ1Ni00M2JlLWExZGMtODkzN2E1MDk0M2I5IiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiJUZXN0In1dXQ

Cuando el valor introducido en el parámetro de URL filters se decodifica en Base64, se pueden ver los siguientes datos.
[[{"id":"23777c0b-a456-43be-a1dc-8937a50943b9","type":"first_name","compare":"equals","value":"Test"}]]

Cuando se solicita una búsqueda con filtros, se ejecuta la función scripts de la clase Contacts_Page en el archivo /wp-content/plugins/groundhogg/admin/contacts/contacts-page.php.
En este punto, el parámetro de URL filters codificado en Base64 se decodifica y se pasa a la variable ContactSearch en el área de Javascript de la respuesta HTTP.

Por lo tanto, se puede verificar que en los datos de la respuesta HTTP, los datos codificados en Base64 pasados al parámetro de URL filters se decodifican antes de entregarse.

Posteriormente, los datos decodificados se insertan directamente en los elementos DOM que muestran los resultados de la búsqueda con filtros mediante lógica de JavaScript.

A través de esto, el término de búsqueda con filtros (<img src="x" onerror="alert(document.cookie)">) introducido en el PoC se pasa como variable en el código Javascript sin procesamiento de escape y se inserta y ejecuta en los elementos DOM mediante la lógica del cliente.


Como resultado, debido al procesamiento de escape insuficiente de los datos de búsqueda con filtros, los valores que contienen scripts maliciosos pueden ejecutarse directamente, y esta vulnerabilidad se produce de la misma manera en todos los menús 'Contacts', 'Funnels' y 'Logs'.