[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fEenC9VqE5s6SyEhicUBI4a_O7x1ft6OppLFruRAFtko":3},{"id":4,"url_slug":5,"title":6,"description":7,"plugin_slug":8,"theme_slug":9,"affected_versions":10,"patched_in_version":11,"severity":12,"cvss_score":13,"cvss_vector":14,"vuln_type":15,"published_date":16,"updated_date":17,"references":18,"days_to_patch":20,"patch_diff_files":21,"patch_trac_url":9,"research_status":27,"research_verified":28,"research_rounds_completed":29,"research_plan":30,"research_summary":9,"research_vulnerable_code":9,"research_fix_diff":9,"research_exploit_outline":9,"research_model_used":31,"research_started_at":32,"research_completed_at":33,"research_error":9,"poc_status":9,"poc_video_id":9,"poc_summary":9,"poc_steps":9,"poc_tested_at":9,"poc_wp_version":9,"poc_php_version":9,"poc_playwright_script":9,"poc_exploit_code":9,"poc_has_trace":28,"poc_model_used":9,"poc_verification_depth":9,"poc_exploit_code_gated":28,"source_links":34},"CVE-2026-5063","nex-forms-unauthenticated-stored-cross-site-scripting-via-post-parameter-key-names","NEX-Forms \u003C= 9.1.11 - Unauthenticated Stored Cross-Site Scripting via POST Parameter Key Names","The NEX-Forms – Ultimate Forms Plugin for WordPress plugin for WordPress is vulnerable to Stored Cross-Site Scripting via POST parameter key names in the submit_nex_form() function in versions up to, and including, 9.1.11 due to insufficient input sanitization and output escaping. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.","nex-forms-express-wp-form-builder",null,"\u003C=9.1.11","9.1.12","high",7.2,"CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:N\u002FUI:N\u002FS:C\u002FC:L\u002FI:L\u002FA:N","Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')","2026-05-02 15:41:51","2026-05-03 04:25:52",[19],"https:\u002F\u002Fwww.wordfence.com\u002Fthreat-intel\u002Fvulnerabilities\u002Fid\u002F9bac82ee-55bf-4381-b441-115a675e4834?source=api-prod",1,[22,23,24,25,26],"admin\u002Fcss\u002Fdashboard.css","includes\u002Fclasses\u002Fclass.db.php","includes\u002Fclasses\u002Fclass.functions.php","main.php","readme.txt","researched",false,3,"This research plan outlines the steps to exploit **CVE-2026-5063**, a Stored Cross-Site Scripting (XSS) vulnerability in the NEX-Forms plugin. The vulnerability arises because the plugin saves and subsequently renders POST parameter **keys** (names) without sanitization or escaping during form submission.\n\n### 1. Vulnerability Summary\n*   **Vulnerability:** Unauthenticated Stored XSS.\n*   **Location:** `submit_nex_form()` function (typically triggered via `wp_ajax_nopriv_submit_nex_form`).\n*   **Sink:** Admin dashboard pages where form entries\u002Fleads are displayed (e.g., the \"Entries\" or \"Dashboard\" view).\n*   **Cause:** The plugin iterates through the `$_POST` array to store form submission data. It uses the keys of the `$_POST` array as field labels or identifiers in the database. When an administrator views these submissions, the unsanitized keys are rendered directly into the HTML.\n\n### 2. Attack Vector Analysis\n*   **Endpoint:** `wp-admin\u002Fadmin-ajax.php`\n*   **Action:** `submit_nex_form`\n*   **Payload Location:** The **key** of a POST parameter.\n*   **Authentication:** None (Unauthenticated).\n*   **Preconditions:** A form must exist in NEX-Forms (usually one is created by default upon installation). We need the `nex_forms_Id`.\n\n### 3. Code Flow\n1.  **Entry Point:** An unauthenticated user sends a POST request to `admin-ajax.php?action=submit_nex_form`.\n2.  **Processing:** The `submit_nex_form()` function (residing in the form processing logic) receives the `$_POST` data.\n3.  **Iteration:** The code likely loops through `$_POST` using `foreach($_POST as $key => $value)`.\n4.  **Storage:** The `$key` is stored in the database (typically in the `{prefix}wap_nex_forms_entries` table) as a field label associated with that entry.\n5.  **Rendering (The Sink):** An administrator navigates to the NEX-Forms dashboard. The function `load_form_entries()` or `populate_form_entry()` (found in `includes\u002Fclasses\u002Fclass.db.php`) retrieves the stored entries.\n6.  **Execution:** The dashboard template echoes the stored `$key` without using `esc_html()` or `esc_attr()`, executing the XSS payload in the admin's browser.\n\n### 4. Nonce Acquisition Strategy\nNEX-Forms submission for unauthenticated users typically **does not require a nonce** to ensure compatibility with page caching plugins (which would otherwise serve stale nonces). \n\nHowever, the plugin often requires a `nex_forms_Id`. If a nonce is required for the `nopriv` action:\n1.  **Identify Shortcode:** The plugin uses shortcodes like `[nex_forms id=\"1\"]`.\n2.  **Create Test Page:** `wp post create --post_type=page --post_status=publish --post_content='[nex_forms id=\"1\"]' --post_title='Form Page'`\n3.  **Navigate:** Use `browser_navigate` to the new page.\n4.  **Extract:** Look for localized JS variables. NEX-Forms often uses `nf_ajax` or similar. \n    *   Check for `window.nex_forms_scripts_obj?.ajaxurl` and associated nonces.\n    *   Based on `class.functions.php`, check if `nex_forms_wpnonce` is present in the rendered form HTML.\n\n### 5. Exploitation Strategy\n\n#### Step 1: Discover Form ID\nList existing forms to find a valid `nex_forms_Id`.\n```bash\nwp db query \"SELECT id, title FROM wp_wap_nex_forms\"\n```\n\n#### Step 2: Craft Injection Request\nSend a POST request where the key itself contains the XSS payload. We must include the `nex_forms_Id` and the `action`.\n\n*   **URL:** `http:\u002F\u002Flocalhost:8080\u002Fwp-admin\u002Fadmin-ajax.php`\n*   **Method:** `POST`\n*   **Content-Type:** `application\u002Fx-www-form-urlencoded`\n*   **Body:**\n    ```\n    action=submit_nex_form&nex_forms_Id=1&\u003Csvg\u002Fonload=alert(`XSS_KEY`)>=test_value&is_not_empty=1\n    ```\n    *Note: `is_not_empty` is often a required internal field for NEX-Forms to process the submission.*\n\n#### Step 3: Trigger the XSS\nLog in as an administrator and visit the NEX-Forms entries page:\n*   **URL:** `http:\u002F\u002Flocalhost:8080\u002Fwp-admin\u002Fadmin.php?page=nex-forms-dashboard` (or the specific entries view).\n\n### 6. Test Data Setup\n1.  **Ensure Plugin is Active:** `wp plugin activate nex-forms-express-wp-form-builder`\n2.  **Verify Tables:** Ensure the `wp_wap_nex_forms` and `wp_wap_nex_forms_entries` tables exist.\n3.  **Create a Form (if none exist):**\n    ```bash\n    # This creates a minimal form entry in the DB\n    wp db query \"INSERT INTO wp_wap_nex_forms (title, form_code) VALUES ('Exploit Form', 'dummy_code')\"\n    ```\n4.  **Identify ID:** Get the ID of the created form (usually `1`).\n\n### 7. Expected Results\n*   The `admin-ajax.php` request should return a success status (often a JSON response or `1`).\n*   Upon visiting the NEX-Forms dashboard as an admin, an alert box with `XSS_KEY` should appear.\n*   Checking the database will show the payload in the keys\u002Flabels column.\n\n### 8. Verification Steps\n1.  **Check DB Storage:**\n    ```bash\n    wp db query \"SELECT * FROM wp_wap_nex_forms_entries ORDER BY id DESC LIMIT 1\"\n    ```\n    Confirm that the column containing field mapping includes the string `\u003Csvg\u002Fonload=alert(\\`XSS_KEY\\`)>`.\n2.  **Inspect Response:** Use `http_request` to fetch the admin dashboard and grep for the payload to confirm it is rendered unescaped.\n    ```bash\n    # Example (requires admin cookies)\n    # look for the raw payload in the HTML response\n    ```\n\n### 9. Alternative Approaches\n*   **Payload Variations:** If `\u003Csvg>` is blocked by a WAF, use `\u003Cimg src=x onerror=alert(1)>` or `\">\u003Cscript>alert(1)\u003C\u002Fscript>`.\n*   **Parameter keys in different actions:** Check if `nf_insert_record` (authenticated) or other AJAX actions also process keys unsanitized, which could allow a Contributor-level user to escalate to Admin XSS.\n*   **Submission Method:** NEX-Forms sometimes sends data as a single JSON string in a parameter like `form_data`. If so, the injection would occur inside the JSON keys: `{\"\u003Cimg src=x onerror=alert(1)>\":\"value\"}`. The vulnerability description, however, points specifically to **POST parameter key names**.","gemini-3-flash-preview","2026-05-04 17:00:29","2026-05-04 17:01:08",{"type":35,"vulnerable_version":36,"fixed_version":11,"vulnerable_browse":37,"vulnerable_zip":38,"fixed_browse":39,"fixed_zip":40,"all_tags":41},"plugin","9.1.11","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fnex-forms-express-wp-form-builder\u002Ftags\u002F9.1.11","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fnex-forms-express-wp-form-builder.9.1.11.zip","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fnex-forms-express-wp-form-builder\u002Ftags\u002F9.1.12","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fnex-forms-express-wp-form-builder.9.1.12.zip","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fnex-forms-express-wp-form-builder\u002Ftags"]