Institute Management <= 5.5 - Authenticated (Administrator+) Stored Cross-Site Scripting via 'Enquiry Form Title' Setting
Description
The Institute Management plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'Enquiry Form Title' setting in all versions up to, and including, 5.5. This is due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with Administrator-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. This only affects multi-site installations and installations where unfiltered_html has been disabled.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:NTechnical Details
<=5.5# Exploitation Research Plan: CVE-2026-2714 - Institute Management Stored XSS ## 1. Vulnerability Summary The **Institute Management** plugin (<= 5.5) for WordPress contains a stored cross-site scripting (XSS) vulnerability via the 'Enquiry Form Title' setting. The plugin fails to sanitize the inpu…
Show full research plan
Exploitation Research Plan: CVE-2026-2714 - Institute Management Stored XSS
1. Vulnerability Summary
The Institute Management plugin (<= 5.5) for WordPress contains a stored cross-site scripting (XSS) vulnerability via the 'Enquiry Form Title' setting. The plugin fails to sanitize the input when saving this setting and fails to escape the output when rendering it on the frontend or backend. While the vulnerability requires Administrator-level privileges, it is significant in Multi-site environments or hardened installations where the unfiltered_html capability is disabled for administrators.
2. Attack Vector Analysis
- Endpoint: WordPress Admin Dashboard, specifically the plugin's settings page.
- Vulnerable Setting:
Enquiry Form Title(likely stored as a WordPress option). - HTTP Parameter: Likely a POST parameter named
enquiry_form_titleor similar (inferred). - Authentication: Required (Administrator+).
- Preconditions:
- The environment must be a Multi-site installation OR have
define( 'DISALLOW_UNFILTERED_HTML', true );inwp-config.phpto prevent the administrator from having legitimateunfiltered_htmlrights. - A page must exist that renders the Enquiry Form (often via a shortcode).
- The environment must be a Multi-site installation OR have
3. Code Flow (Inferred)
- Input Stage: The administrator navigates to the "Institute Management" settings menu (e.g.,
wp-admin/admin.php?page=institute-management-settings). - Persistence Stage: Upon clicking "Save", a POST request is sent. A handler (likely registered via
admin_initoradmin_menu) receives the data and callsupdate_option( 'wl_im_enquiry_form_title', $_POST['enquiry_form_title'] )without usingsanitize_text_field. - Rendering Stage: A user (or admin) visits a page containing the enquiry form. The plugin calls
get_option( 'wl_im_enquiry_form_title' )and outputs it directly usingechoorprintfwithoutesc_html()orwp_kses().
4. Nonce Acquisition Strategy
Since this involves an administrative settings page, a CSRF nonce is almost certainly required.
- Identify the Settings Page: Locate the menu slug for the plugin (e.g.,
institute-managementorwl-im-settings). - Navigate via Browser: Use
browser_navigateto go tohttp://localhost:8080/wp-admin/admin.php?page=institute-management-settings. - Extract Nonce: Use
browser_evalto extract the nonce from the settings form.- Target Variable: Look for the hidden input field usually named
_wpnonceor a specific action nonce (e.g.,wl_im_settings_nonce). - Command:
browser_eval("document.querySelector('input[name=\"_wpnonce\"]')?.value")or check for localized JS variables.
- Target Variable: Look for the hidden input field usually named
5. Exploitation Strategy
Step 1: Discover the exact setting field
Navigate to the settings page and inspect the form to identify the exact name of the input field for "Enquiry Form Title".
Step 2: Inject Payload
Submit a POST request to the settings handler (likely options.php if using the Settings API, or the current page if using a custom handler).
Example Request (assuming Settings API):
- URL:
http://localhost:8080/wp-admin/options.php - Method: POST
- Content-Type:
application/x-www-form-urlencoded - Body:
option_page=institute_management_settings_group& wl_im_enquiry_form_title=<script>alert(document.domain)</script>& action=update& _wpnonce=[EXTRACTED_NONCE]
Step 3: Trigger Execution
Identify the shortcode or frontend page where the enquiry form is displayed.
- Create a page with the enquiry shortcode:
wp post create --post_type=page --post_status=publish --post_content='[wl_im_enquiry_form]'(shortcode inferred from plugin slug). - Use
browser_navigateto visit that page. - Observe if the script
<script>alert(document.domain)</script>executes.
6. Test Data Setup
- Hardening: Disable
unfiltered_htmlinwp-config.phpto ensure the test reflects the vulnerability context.wp config set DISALLOW_UNFILTERED_HTML true --raw
- User: Create an administrator user.
- Shortcode Page:
wp post create --post_title="Enquiry" --post_content="[wl_im_enquiry_form]" --post_status="publish" --post_type="page"- (Note: Search the plugin code for
add_shortcodeto find the exact tag).
7. Expected Results
- The settings page accepts the payload without sanitization.
- When the frontend page is loaded, the HTML source contains the raw
<script>tag rather than the escaped<script>. - The browser triggers an alert or executes the injected JS logic.
8. Verification Steps
- Database Check: Use WP-CLI to verify the stored value is not sanitized.
wp option get wl_im_enquiry_form_title(verify it returns the raw<script>tag).
- Response Check: Use
http_requestto fetch the frontend page and check for the presence of the unescaped payload.grep "<script>alert(document.domain)</script>"in the response body.
9. Alternative Approaches
- Custom Post Meta: If the title is not a global setting but a per-form setting, the exploit would involve modifying a specific post meta via the form builder interface.
- Admin XSS: The title might also be reflected back on the settings page itself. If the settings page shows the "Current Title", the XSS would execute every time the administrator visits the settings page, creating a self-reinforcing admin-context exploit.
- Blind XSS: If the enquiry is sent to an admin dashboard, the payload might execute when an admin views the submitted enquiry in the backend. Look for
wl_im_enquiriesor similar management pages.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.