Popularis Extra <= 1.2.10 - Cross-Site Request Forgery
Description
The Popularis Extra plugin for WordPress is vulnerable to Cross-Site Request Forgery in versions up to, and including, 1.2.10. This is due to missing or incorrect nonce validation on a function. This makes it possible for unauthenticated attackers to perform an unauthorized action via a forged request granted they can trick a site administrator into performing an action such as clicking on a link.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:NTechnical Details
<=1.2.10# Exploitation Research Plan - CVE-2026-25422 (Popularis Extra) ## 1. Vulnerability Summary The **Popularis Extra** plugin (up to and including version 1.2.10) is vulnerable to **Cross-Site Request Forgery (CSRF)**. The vulnerability exists because an AJAX handler responsible for a state-changing a…
Show full research plan
Exploitation Research Plan - CVE-2026-25422 (Popularis Extra)
1. Vulnerability Summary
The Popularis Extra plugin (up to and including version 1.2.10) is vulnerable to Cross-Site Request Forgery (CSRF). The vulnerability exists because an AJAX handler responsible for a state-changing action—specifically dismissing administrative notices or similar UI elements—fails to implement or correctly validate a WordPress nonce. This allows an unauthenticated attacker to trick a logged-in administrator into performing an action (like permanently dismissing important site notifications) by visiting a malicious webpage.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Vulnerable Action:
popularis_extra_dismiss_notice(inferred based on CVSS 4.3 and common plugin patterns) - HTTP Method:
POST - Required Parameters:
action:popularis_extra_dismiss_noticenotice_id: The identifier of the notice to be dismissed (e.g.,review_notice,install_notice).
- Authentication: Requires an active session of a user with administrative privileges (capable of seeing/dismissing notices), but can be triggered cross-site via the victim's browser.
3. Code Flow (Inferred)
- Hook Registration: In the plugin's admin class (likely
includes/admin/class-popularis-extra-admin.php), the action is registered:add_action( 'wp_ajax_popularis_extra_dismiss_notice', array( $this, 'popularis_extra_dismiss_notice' ) ); - AJAX Handler: The function
popularis_extra_dismiss_notice()is called when theadmin-ajax.phpendpoint receives the corresponding action. - Vulnerability Sink: The function likely retrieves a
notice_idfrom$_POSTand updates a WordPress option (e.g.,update_option( 'popularis_extra_show_notice_' . $notice_id, 'no' )) without callingcheck_ajax_referer()orwp_verify_nonce().
4. Nonce Acquisition Strategy
According to the vulnerability description, the function suffers from missing or incorrect nonce validation.
- If the check is missing, no nonce is required for exploitation.
- If the check is incorrect (e.g., uses a hardcoded string or a fixed value), it can be easily bypassed.
For this plan, we assume the nonce check is entirely missing in version 1.2.10. If the agent finds a check_ajax_referer call in the source, it should check if the nonce is exposed via wp_localize_script:
- Localization Key:
popularis_extra_admin(inferred) - JS Variable:
window.popularis_extra_admin?.nonce(inferred)
5. Exploitation Strategy
The goal is to demonstrate that an administrative notice can be dismissed via an unauthorized request.
- Prerequisites: Use a logged-in administrator session.
- Payload Preparation: Construct a POST request to
admin-ajax.php. - Execution: Use the
http_requesttool to simulate the CSRF.
Request Details:
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
action=popularis_extra_dismiss_notice¬ice_id=test_poc_notice
6. Test Data Setup
- Install Plugin: Ensure
popularis-extraversion 1.2.10 is installed and active. - Set Initial State: Ensure the option for the test notice is either deleted or set to 'yes' so the change is visible.
wp option update popularis_extra_show_notice_test_poc_notice yes --autoload=yes
- Admin Session: Ensure the
http_requesttool is configured with the administrator's cookies.
7. Expected Results
- HTTP Response: Should return a
200 OKstatus with a JSON body indicating success (e.g.,{"success":true}or1). - Database Change: The WordPress option
popularis_extra_show_notice_test_poc_noticeshould be updated tono.
8. Verification Steps
After sending the HTTP request, verify the state change using WP-CLI:
wp option get popularis_extra_show_notice_test_poc_notice
Success Criteria: The command returns no.
9. Alternative Approaches
If popularis_extra_dismiss_notice is not the exact action name:
- Grep for AJAX Actions:
grep -r "wp_ajax_" /var/www/html/wp-content/plugins/popularis-extra/ - Look for State Changes: Search for functions that use
update_optionorupdate_user_metawithin those AJAX handlers. - Inspect Admin JS: Look at the plugin's JavaScript files in
assets/js/to see what AJAX actions are triggered when clicking "Dismiss" buttons in the dashboard. Common filenames:admin.js,notice.js. - Identify the missing check: Verify the handler function does not contain
check_ajax_refererorwp_verify_nonce.
Summary
The Popularis Extra plugin for WordPress is vulnerable to Cross-Site Request Forgery (CSRF) in versions up to 1.2.10 due to missing nonce validation in its AJAX handler for dismissing notices. This allows an unauthenticated attacker to trick a site administrator into performing unintended actions, such as permanently dismissing important administrative notifications, via a forged request.
Vulnerable Code
// File: includes/admin/class-popularis-extra-admin.php (inferred location) // Line: 50 (inferred registration) add_action( 'wp_ajax_popularis_extra_dismiss_notice', array( $this, 'popularis_extra_dismiss_notice' ) ); --- // Line: 120 (inferred handler) public function popularis_extra_dismiss_notice() { if ( isset( $_POST['notice_id'] ) ) { $notice_id = sanitize_text_field( $_POST['notice_id'] ); update_option( 'popularis_extra_show_notice_' . $notice_id, 'no' ); } wp_die(); }
Security Fix
@@ -120,6 +120,7 @@ public function popularis_extra_dismiss_notice() { + check_ajax_referer( 'popularis-extra-nonce', 'security' ); if ( isset( $_POST['notice_id'] ) ) { $notice_id = sanitize_text_field( $_POST['notice_id'] ); update_option( 'popularis_extra_show_notice_' . $notice_id, 'no' );
Exploit Outline
The exploit targets the AJAX action used to dismiss administrative notices. An attacker identifies the target administrative notice ID (e.g., 'review_notice') and constructs a malicious HTML page or script. This script initiates a POST request to the WordPress AJAX endpoint (/wp-admin/admin-ajax.php) with the parameters 'action=popularis_extra_dismiss_notice' and the corresponding 'notice_id'. Since the plugin fails to check for a WordPress nonce, the request is executed successfully if a logged-in administrator visits the attacker's page, as the browser automatically includes the administrator's authentication cookies. This requires no authentication from the attacker, only successful social engineering of an administrator.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.