
Das Gravity Forms Plugin für WordPress (getestet bis Version 2.9.28) ist anfällig für unauthentifiziertes reflektiertes Cross-Site-Scripting (XSS) über den Parameter `form_ids` in der AJAX-Aktion `gform_get_config`.
form_ids-Parameter von gform_get_config| Feld | Wert |
|---|---|
| Betroffene Software | Gravity Forms (WordPress-Plugin) |
| Anbieter | Rocketgenius, Inc. |
| Schwachstellentyp | CWE-79: Unzureichende Neutralisierung von Eingaben bei der Webseitengenerierung (Reflektiertes Cross-Site-Scripting) |
| CWE-Kette | CWE-20 → CWE-116 → CWE-838 → CWE-79 (siehe CWE-Analyse unten) |
| Betroffene Versionen | Bestätigt in 2.9.28 (aktuellste Version zum Zeitpunkt der Entdeckung); frühere Versionen wahrscheinlich ebenfalls betroffen |
| Behobene Version | 2.9.30.1 (Hotfix) |
| CVSS-3.1-Score | 6.1 (Mittel) |
| CVSS-3.1-Vektor | AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N |
| Erforderliche Authentifizierung | Keine (nicht authentifiziert) |
| Benutzerinteraktion | Erforderlich (das Opfer muss eine vom Angreifer kontrollierte Seite besuchen oder einen manipulierten Link anklicken) |
| Entdeckt von | Anthony Cihan — Obviam |
| Entdeckungsdatum | 2026-03-04 |
| Offenlegungsdatum | 2026-03-18 |
| CVE-ID | CVE-2026-4406 |
Wordfence-Öffentlicher Eintrag
Das Gravity-Forms-Plugin für WordPress (getestet bis Version 2.9.28) ist anfällig für nicht authentifiziertes reflektiertes Cross-Site-Scripting (XSS) über den form_ids-Parameter in der AJAX-Aktion gform_get_config. Die Schwachstelle besteht darin, dass vom Benutzer bereitgestellte form_ids-Werte ohne jegliche Bereinigung, Kodierung oder Ausgabe-Escaping wörtlich in der HTTP-Antwort des Servers reflektiert werden. Die Antwort wird mit einem Content-Type: text/html; charset=UTF-8-Header ausgeliefert, wodurch der Browser den reflektierten Inhalt als HTML parst und rendert, einschließlich aller injizierten Skriptelemente.
Ein nicht authentifizierter Angreifer kann diese Schwachstelle ausnutzen, um beliebiges JavaScript im Kontext der Ursprungsdomain der Ziel-WordPress-Website auszuführen. Da die Aktion gform_get_config ein gültiges config_nonce erfordert und dieses Nonce öffentlich im HTML-Quellcode jeder Seite eingebettet ist, die ein Gravity-Forms-Formular lädt, kann ein Angreifer problemlos ein gültiges Nonce erhalten, indem er vor dem Erstellen der Exploit-Anfrage eine beliebige öffentlich zugängliche Seite der Zielwebsite anfordert.
Eine erfolgreiche Ausnutzung ermöglicht es einem Angreifer, Sitzungscookies zu stehlen, Aktionen im Namen authentifizierter Benutzer (einschließlich WordPress-Administratoren) auszuführen, Benutzer auf bösartige Websites umzuleiten, Seiteninhalte zu verunstalten oder durch die Erstellung von Administratorkonten dauerhaften Zugriff zu erlangen.
POST /wp-admin/admin-ajax.php
### Verwundbare Aktion```
gform_get_config
Der args-POST-Parameter akzeptiert ein JSON-Objekt, das ein form_ids-Array enthält. Werte in diesem Array werden ohne Bereinigung als Objektschlüssel in der JSON-Antwortstruktur verwendet:```json
{"form_ids":["ATTACKER_CONTROLLED_VALUE"]}
### Antwortverhalten
Der Server verarbeitet die `form_ids`-Werte und gibt sie als JSON-Schlüssel im Antworttext wieder. Die Antwort wird in HTML-Kommentar-Markern eingebettet und als `text/html` ausgeliefert:```
Content-Type: text/html; charset=UTF-8
<!-- gf:json_start -->{"success":true,"data":{"common":{"form":{"pagination":{"ATTACKER_CONTROLLED_VALUE":null}}}}}<!-- gf:json_end -->
form_ids-Werte werden nicht als Ganzzahlen validiert, bereinigt oder gefiltert. Der Server akzeptiert beliebige Zeichenfolgeninhalte, einschließlich HTML-Tags und Event-Handler.form_ids-Werte werden ohne HTML-Entity-Kodierung im Antworttext widergespiegelt. Zeichen wie <, >, " und ' werden unverändert durchgelassen.Content-Type: text/html; charset=UTF-8 ausgeliefert, was den Browser anweist, den Antworttext als HTML zu parsen. Alle HTML-Tags innerhalb des widergespiegelten Werts werden vom HTML-Parser des Browsers instanziiert und gerendert.config_nonce, das für die Aktion gform_get_config erforderlich ist, ist im JavaScript-Konfigurationsobjekt (gform_theme_config) auf jeder Seite eingebettet, die ein Gravity-Forms-Formular lädt. Dieses Nonce ist auf allen Seiten identisch und nicht an eine bestimmte Benutzersitzung gebunden, wodurch es für nicht authentifizierte Benutzer trivial zu erlangen ist.Diese Schwachstelle ist das Ergebnis mehrerer beitragender Schwächen, die sich zu einer ausnutzbaren Bedingung verketten. Während CWE-79 die primäre Klassifizierung für die CVE-Meldung ist, dokumentiert die vollständige Kette, wie sich jedes Versagen gegenseitig verstärkt, um die Ausnutzung zu ermöglichen.
CWE-20 CWE-116 CWE-838 CWE-79 Improper Input → Improper Encoding → Inappropriate Encoding → Cross-Site Validation or Escaping of Output for Output Context Scripting (XSS) [EXPLOITABLE] form_ids accepts Reflected values are JSON data served as Browser parses arbitrary strings not HTML-entity text/html instead of injected HTML tags instead of integers encoded in response application/json and executes JS
### CWE-20: Unsachgemäße Eingabevalidierung (Beitragend)
**Rolle:** Grundlegender Ermöglicher — erlaubt, dass schädliche Daten in die Verarbeitungspipeline gelangen.
Der Parameter `form_ids` im `args`-JSON-Objekt soll numerische Formular-IDs enthalten, akzeptiert jedoch beliebige Zeichenfolgeneingaben ohne jegliche Validierung. Es werden keine Typprüfung (`intval()`), keine Regex-Filterung (`^[0-9]+$`), kein Whitelist-Abgleich gegen bekannte Formular-IDs und keine Längenbeschränkungen angewendet.
**Beleg:** Der Server akzeptiert und verarbeitet `form_ids`-Werte, die HTML-Tags, JavaScript-Ereignishandler und beliebiges Unicode enthalten, ohne sie abzulehnen.```json
{"form_ids":["<svg onload=alert(1)>"]} ← Accepted
{"form_ids":["3"]} ← Expected
Rolle: Kernschwachstelle — die direkte Ursache für den XSS-Zustand.
Wenn der Server die JSON-Antwort mit den form_ids-Werten erstellt, wendet er keine HTML-Entity-Kodierung auf die Ausgabe an. Zeichen mit besonderer Bedeutung in HTML (<, >, ", ', &) gelangen unverändert in den Antworttext. Die PHP-Funktionen htmlspecialchars(), esc_html(), wp_json_encode() mit JSON_HEX_TAG oder gleichwertige Ausgabekodierungsfunktionen werden nicht auf die form_ids-Werte angewendet, bevor sie in die Antwort geschrieben werden.
Nachweis: Die wörtliche Zeichenkette <svg onload=alert(document.domain)> erscheint im Antworttext byte-für-byte identisch zur Eingabe, anstatt als <svg onload=alert(document.domain)>.
Rolle: Kontext-Eskalation — verwandelt ein Datenreflexionsproblem in eine ausführbare Code-Injektion.