
Proof-of-Concept-Exploit für eine reflektierte XSS-Schwachstelle im Groundhogg-WordPress-Plugin, das eine nicht authentifizierte Skriptinjektion über manipulierte URL-Parameter demonstriert.
WordPress-Plugin
Komponentenname WordPress CRM, E-Mail- und Marketing-Automatisierung für WordPress | Award Winner — Groundhogg
Verwundbare Version <= 3.7.3.2
Komponenten-Slug groundhogg
Komponenten-Link https://wordpress.org/plugins/groundhogg/
Schwachstellenklasse A3: Injection
Schwachstellentyp Cross Site Scripting (XSS)
Nicht authentifiziert
Die Versionen 3.7.3.3 und älter des Groundhogg-Plugins enthalten eine Reflected Cross Site Scripting-Schwachstelle aufgrund unzureichender Eingabevalidierung und fehlender Escape-Verarbeitung von URL-Parametern. Diese Schwachstelle tritt bei der Nutzung der Suchfilterfunktion in den Menüs „Contacts", „Funnels" und „Logs" des Plugin-Dashboards auf.
Durch diese Schwachstelle kann ein nicht authentifizierter Benutzer eine URL mit bösartigen Skripten erstellen. Wenn andere Benutzer auf diese URL zugreifen, wird das Skript in ihrem Browser ausgeführt, was möglicherweise zum Verlust von Cookie-Informationen führt. Dies stellt ein ernstes Sicherheitsrisiko dar, da es insbesondere zur Übernahme von Sitzungen von Benutzern mit Administratorrechten ausgenutzt werden kann.
Bereiten Sie eine WordPress-Website mit dem aktivierten Plugin „Groundhogg" <=3.7.3.2 vor.
Da dieses Plugin die REST-API verwendet, muss der Permalink auf
Beitragsnamegesetzt sein.
Anschließend löst der Zugriff auf die Links für jedes der folgenden Menüs eine Reflected-XSS-Schwachstelle aus.
Kontakte-Menü(/wp-admin/admin.php?page=gh_contacts)
http://localhost:8080/wp-admin/admin.php?page=gh_contacts&filters=W1t7ImlkIjoiIiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiJ9XV0

Funnels-Menü(/wp-admin/admin.php?page=gh_funnels)
Um die XSS-Schwachstelle in diesem Menü zu reproduzieren, muss mindestens 1 Funnel vorhanden sein.
http://localhost:8080/wp-admin/admin.php?page=gh_funnels&status=inactive&include_filters=W1t7ImlkIjoiMTBjY2FmZmUtZjE0YS00MTg5LWE0MzctYjA2MTFhMTQ2ZDk1IiwidHlwZSI6InRpdGxlIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiIsImNvbXBhcmUiOiJlcXVhbHMifV1d

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

Bei der Durchführung von Filtersuchen in den Menüs „Contacts", „Funnels" und „Logs" des Groundhogg-Plugin-Dashboards werden die Filtereinstellungen Base64-codiert, bevor sie als URL-Parameter übergeben werden.
Wenn Sie beispielsweise im Menü „Contacts" eine Filtersuche einstellen, bei der „Vorname" auf „Test" gesetzt ist, erhält der URL-Parameter filters die folgenden Daten:
W1t7ImlkIjoiMjM3NzdjMGItYTQ1Ni00M2JlLWExZGMtODkzN2E1MDk0M2I5IiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiJUZXN0In1dXQ

Wenn der im URL-Parameter filters eingegebene Wert Base64-decodiert wird, können Sie die folgenden Daten sehen.
[[{"id":"23777c0b-a456-43be-a1dc-8937a50943b9","type":"first_name","compare":"equals","value":"Test"}]]

Wenn eine Filtersuche angefordert wird, wird die Funktion scripts der Klasse Contacts_Page in der Datei /wp-content/plugins/groundhogg/admin/contacts/contacts-page.php ausgeführt.
An diesem Punkt wird der Base64-codierte URL-Parameter filters decodiert und an die Variable ContactSearch im JavaScript-Bereich der HTTP-Antwort übergeben.

Daher können Sie überprüfen, dass in den HTTP-Antwortdaten die an den URL-Parameter filters übergebenen Base64-codierten Daten decodiert werden, bevor sie ausgeliefert werden.

Anschließend werden die decodierten Daten direkt in die DOM-Elemente eingefügt, die die Filtersuchergebnisse über JavaScript-Logik anzeigen.

Dadurch wird der im PoC eingegebene Filtersuchbegriff (<img src="x" onerror="alert(document.cookie)">) ohne Escape-Verarbeitung als Variable im JavaScript-Code übergeben und durch die Client-Logik in DOM-Elemente eingefügt und ausgeführt.


Infolgedessen können aufgrund unzureichender Escape-Verarbeitung der Filtersuchdaten Werte, die bösartige Skripte enthalten, direkt ausgeführt werden. Diese Schwachstelle tritt auf dieselbe Weise in allen Menüs „Contacts", „Funnels" und „Logs" auf.