CVE-2026-4141

Quran Translations <= 1.7 - Cross-Site Request Forgery to Playlist Settings Form

mediumCross-Site Request Forgery (CSRF)
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The Quran Translations plugin for WordPress is vulnerable to Cross-Site Request Forgery in all versions up to, and including, 1.7. This is due to missing nonce validation in the quran_playlist_options() function that handles the plugin's settings page. The function processes POST requests to update plugin options via update_option() without any wp_nonce_field() in the form or wp_verify_nonce()/check_admin_referer() verification before processing. This makes it possible for unauthenticated attackers to modify plugin settings (toggling display options for PDF, RSS, podcast, media player links, playlist title, and playlist code) 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:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=1.7
PublishedApril 7, 2026
Last updatedApril 8, 2026
Research Plan
Unverified

This research plan outlines the technical steps required to exploit **CVE-2026-4141**, a Cross-Site Request Forgery (CSRF) vulnerability in the **Quran Translations** plugin for WordPress. ## 1. Vulnerability Summary The **Quran Translations** plugin (versions <= 1.7) contains a CSRF vulnerability …

Show full research plan

This research plan outlines the technical steps required to exploit CVE-2026-4141, a Cross-Site Request Forgery (CSRF) vulnerability in the Quran Translations plugin for WordPress.

1. Vulnerability Summary

The Quran Translations plugin (versions <= 1.7) contains a CSRF vulnerability in its settings management logic. The function quran_playlist_options() (inferred) responsible for rendering and processing the plugin's settings page fails to implement nonce validation. Specifically, it processes POST requests and updates plugin options via update_option() without verifying a cryptographic nonce using check_admin_referer() or wp_verify_nonce().

An attacker can exploit this by tricking an authenticated administrator into submitting a forged request, allowing the attacker to change critical plugin settings, such as the playlist title or injected playlist code.

2. Attack Vector Analysis

  • Vulnerable Endpoint: /wp-admin/admin.php?page=quran_playlist (slug inferred from function name quran_playlist_options).
  • HTTP Method: POST.
  • Target Function: quran_playlist_options()
  • Vulnerable Sink: update_option().
  • Authentication: Requires a site administrator to be logged in (targeted via CSRF).
  • Payload Parameters (Inferred based on description):
    • playlist_title or quran_playlist_title
    • playlist_code or quran_playlist_code
    • show_pdf / show_rss / show_podcast / show_media_player
    • A submit/save parameter (e.g., save_quran_options).

3. Code Flow

  1. Hook Registration: The plugin likely registers an admin menu page via the admin_menu hook:
    add_action('admin_menu', 'quran_translations_menu');
    function quran_translations_menu() {
        add_options_page('Quran Playlist', 'Quran Playlist', 'manage_options', 'quran_playlist', 'quran_playlist_options');
    }
    
  2. Execution: When the administrator visits the settings page or a POST request is sent to that slug, quran_playlist_options() is executed.
  3. Processing (Vulnerable): The function checks for POST data and calls update_option() directly:
    function quran_playlist_options() {
        if ( isset( $_POST['submit_options_check'] ) ) { // Inferred trigger
            // MISSING: check_admin_referer('action_name');
            update_option('quran_playlist_title', $_POST['playlist_title']);
            update_option('quran_playlist_code', $_POST['playlist_code']);
            // ... other options
        }
        // Render the form...
    }
    

4. Nonce Acquisition Strategy

No nonce is required for this exploit.
The vulnerability exists specifically because the plugin does not implement or verify nonces. The wp_nonce_field() is missing from the form, and the backend processing lacks check_admin_referer() or wp_verify_nonce().

To confirm this, the agent should:

  1. Navigate to the settings page as an admin: browser_navigate("/wp-admin/admin.php?page=quran_playlist").
  2. Check the HTML source for a hidden input field with name="_wpnonce". Its absence confirms the vulnerability.

5. Exploitation Strategy

The goal is to change the playlist_title to a malicious string (e.g., "CSRF_EXPLOITED") and the playlist_code to a script block.

Step 1: Identify Parameter Names

Navigate to the settings page and extract the exact name attributes for the form fields.

// Run in browser_eval
const fields = Array.from(document.querySelectorAll('input, textarea')).map(i => i.name);
console.log(fields);

Step 2: Craft and Send Forged Request

Using the http_request tool with the admin's session cookies, perform a POST request to the settings page.

Request Details:

  • URL: http://localhost:8080/wp-admin/admin.php?page=quran_playlist (Inferred slug)
  • Method: POST
  • Headers: Content-Type: application/x-www-form-urlencoded
  • Body: (Adjust parameter names based on Step 1)
    playlist_title=VULNERABLE_TITLE&playlist_code=<script>alert(1)</script>&submit=Save+Changes
    

6. Test Data Setup

  1. Plugin Installation: Ensure the quran-translations-by-edc plugin version <= 1.7 is active.
  2. Admin Access: The exploitation requires the http_request tool to use the administrator's cookies. Ensure the agent has logged in via browser_navigate first.
  3. Initial State: Verify current settings: wp option get quran_playlist_title (or the correct option name).

7. Expected Results

  • The HTTP response from the POST request should be a 200 OK or a 302 Redirect back to the settings page.
  • The response body of the settings page should now display the updated values in the input fields.
  • The update_option calls will persist the new values in the WordPress database.

8. Verification Steps

After sending the exploit request, verify the state change using WP-CLI:

# Verify the title was changed
wp option get quran_playlist_title

# Verify the playlist code was changed (potentially containing XSS)
wp option get quran_playlist_code

Additionally, visit the frontend where the playlist is rendered (e.g., a page with the [quran_playlist] shortcode) to see if the modified values appear.

9. Alternative Approaches

If the plugin uses admin-post.php instead of a self-submitting settings page:

  • Target URL: http://localhost:8080/wp-admin/admin-post.php
  • Additional Parameter: action=update_quran_playlist (or similar).

If the settings are handled via a specialized AJAX handler (though less likely for a settings form in this plugin type):

  • Target URL: http://localhost:8080/wp-admin/admin-ajax.php
  • Body: action=quran_save_settings&... (without nonce).
Research Findings
Static analysis — not yet PoC-verified

Summary

The Quran Translations plugin for WordPress (versions up to 1.7) is vulnerable to Cross-Site Request Forgery (CSRF) because it fails to perform nonce validation on its settings management page. This allows unauthenticated attackers to modify plugin settings, such as the playlist title and injected playlist code, by tricking a logged-in administrator into submitting a forged POST request.

Vulnerable Code

/**
 * Inferred logic for the settings handler in quran-translations-by-edc
 */
function quran_playlist_options() {
    if ( isset( $_POST['submit_options_check'] ) ) { 
        // MISSING: check_admin_referer() or wp_verify_nonce()
        update_option('quran_playlist_title', $_POST['playlist_title']);
        update_option('quran_playlist_code', $_POST['playlist_code']);
        update_option('show_pdf', $_POST['show_pdf']);
        update_option('show_rss', $_POST['show_rss']);
        update_option('show_podcast', $_POST['show_podcast']);
        update_option('show_media_player', $_POST['show_media_player']);
    }
    
    // In the form rendering part of the same function:
    ?>
    <form method="post" action="">
        <!-- MISSING: wp_nonce_field() -->
        <input type="text" name="playlist_title" value="<?php echo get_option('quran_playlist_title'); ?>">
        <textarea name="playlist_code"><?php echo get_option('quran_playlist_code'); ?></textarea>
        <input type="submit" name="submit_options_check" value="Save Changes">
    </form>
    <?php
}

Security Fix

--- a/quran-translations.php
+++ b/quran-translations.php
@@ -3,6 +3,9 @@
 function quran_playlist_options() {
     if ( isset( $_POST['submit_options_check'] ) ) {
+        if ( ! isset( $_POST['quran_playlist_nonce'] ) || ! wp_verify_nonce( $_POST['quran_playlist_nonce'], 'quran_save_playlist_options' ) ) {
+            wp_die( 'Security check failed' );
+        }
         update_option('quran_playlist_title', $_POST['playlist_title']);
         update_option('quran_playlist_code', $_POST['playlist_code']);
         // ... other updates
@@ -15,6 +18,7 @@
     ?>
     <form method="post" action="">
+        <?php wp_nonce_field( 'quran_save_playlist_options', 'quran_playlist_nonce' ); ?>
         <input type="text" name="playlist_title" value="<?php echo get_option('quran_playlist_title'); ?>">
         <input type="submit" name="submit_options_check" value="Save Changes">
     </form>

Exploit Outline

The exploit targets the plugin's settings page, typically located at /wp-admin/admin.php?page=quran_playlist. Since the plugin does not implement any nonce checks or referer verification when processing POST requests to this page, an attacker can craft a malicious HTML form containing parameters like 'playlist_title', 'playlist_code', and 'submit_options_check'. By hosting this form on an external site and tricking an authenticated administrator into visiting it (e.g., via a phishing link or an image tag trigger), the browser will automatically submit the POST request with the administrator's session cookies, successfully updating the plugin options with the attacker's values without the admin's consent.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.