
PoC en Python y herramienta de explotación masiva para CVE-2026-92966, una ejecución de shortcode almacenado sin autenticación en WordPress LatePoint ≤5.7.0 a través de los campos de nombre de reserva.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-92966 |
| Producto | LatePoint — Reserva de citas |
| Afectado | ≤ 5.7.0 |
| Corregido | 5.7.1 |
| CWE | CWE-94 — Inyección de código (ejecución de shortcode) |
| CVSS 3.1 | 9.1 Crítica (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) |
| CNA | Wordfence |
| Descubridor | hashiramasenju333 |
| Catálogo PoCbit | https://pocbit.org/pocs/ |
| Página PoCbit | https://pocbit.org/pocs/cve-2026-92966 |
| Marcador de verificación | POCBIT-92966-OK |
| Aviso | Wordfence Threat Intel |
PoC en Python alineado con CVE-2026-102425: explotación masiva por defecto, --check, -u, --lab, grupo de hilos, hits.txt / exploited.txt. Sin clave de API — siembra totalmente no autenticada a través del flujo público de reservas.
WordPress LatePoint permite a visitantes anónimos reservar citas. El nombre / apellido del cliente se almacenan solo con sanitize_text_field() — los corchetes no se eliminan, por lo que valores como [caption]…[/caption] persisten.
Cuando el sitio renderiza el bloque Gutenberg del Panel del Cliente (render_customer_dashboard() → [latepoint_customer_dashboard]), la plantilla del panel imprime el nombre del cliente dentro del HTML (Welcome %s con esc_html($customer->full_name)). esc_html no codifica [ ni ], por lo que las cargas útiles tipo shortcode sobreviven en la salida del bloque.
WordPress entonces ejecuta do_shortcode sobre the_content en la prioridad 11. Debido a que 5.7.0 devolvía HTML del panel sin procesar desde el manejador del shortcode, los shortcodes almacenados en la línea de bienvenida se analizaban por segunda vez y se ejecutaban. 5.7.1 corrige esto mediante encode_shortcode_delimiters() en la salida del panel (véase el comentario en shortcodes_helper.php: "the_content runs do_shortcode at priority 11").
Impacto: ejecución arbitraria de shortcode no autenticada. Esto no siempre es RCE instantánea del sistema operativo por sí mismo, pero en una pila típica de WordPress se encadena a plugins críticos (formularios, constructores, gestores de archivos, shortcodes respaldados por eval). El PoC demuestra la ejecución con el [caption] del núcleo y un POCBIT_EXEC_SHORTCODE opcional para gadgets RCE específicos del sitio.
sequenceDiagram
participant A as Attacker
participant B as Booking (nopriv AJAX)
participant DB as wp_latepoint_customers
participant P as Page + Customer Cabinet block
participant WP as the_content do_shortcode
A->>B: first_name=[caption]PAYLOAD[/caption]
B->>DB: store customer (guest booking)
A->>P: GET customer dashboard (session/cookie)
P->>P: shortcode renders Welcome + payload
WP->>WP: second do_shortcode pass
WP-->>A: executed shortcode output (marker)
customer[first_name] (o last_name) con una carga útil de shortcode.do_shortcode.Referencias en el código fuente del proveedor (5.7.0):
lib/models/customer_model.php — prepare_data_before_it_is_set() / sanitize_text_field en los nombreslib/views/customer_cabinet/dashboard.php — línea de bienvenida con full_namelib/helpers/blocks_helper.php — render_customer_dashboard()lib/helpers/shortcodes_helper.php (5.7.1) — encode_shortcode_delimiters()| Archivo | Propósito |
|---|---|
poc.py | CLI, menú interactivo, explotación masiva |
_engine.py | Comprobación de versión, intento de plantación en la reserva, disparo del dashboard, laboratorio |
up.php | Archivo de sondeo opcional si tu shortcode RCE deja archivos |
targets.example.txt | Lista de URL para procesamiento masivo |
extract-5.7.0/ / extract-5.7.1/ | Árboles del proveedor para comparar (opcional) |
pip install requests colorama
python poc.py
exploited.txtpython poc.py targets.txt
python poc.py fofa_latepoint.txt -t 20 -T 28
hits.txtpython poc.py --check targets.txt
Huella: readme.txt Stable tag, pistas del front-end de LatePoint (latepoint-book-form, latepoint_helper), versión ≤ 5.7.0.
python poc.py -u https://target.example --check
python poc.py -u https://target.example
Si el objetivo tiene un shortcode peligroso (gestor de archivos, etc.):
set POCBIT_EXEC_SHORTCODE=[your_shortcode_here]
python poc.py -u https://target.example
O: python poc.py -u URL --exec-shortcode "[shortcode]"
La sonda predeterminada utiliza el shortcode del núcleo de WordPress [caption]POCBIT-92966-OK[/caption] (no se requieren plugins adicionales para demostrar la ejecución).
python poc.py --lab
Se vincula a 127.0.0.1:8797, simula el readme 5.7.0, el plantado de reservas y el doble do_shortcode en el HTML del panel. Se espera "exploited": true.
| Estado | Significado |
|---|---|
affected | Versión ≤ 5.7.0 (modo de comprobación) |
exploited | Marcador tras el asistente de reservas + página del Panel del Cliente con sesión iniciada |
plant_no_auth_cookie | Nombre plantado pero sin cookie de inicio de sesión de cliente/WP desde admin-ajax |
plant_missing_service_id | El asistente de reservas no tiene servicios públicos para seleccionar |
plant_otp_required / plant_auth_blocked | Paso del cliente bloqueado por OTP o política de inicio de sesión |
no_customer_cabinet_page | Sesión correcta pero no se encontró ninguna página [latepoint_customer_dashboard] |
shortcode_not_triggered | Plantado + sesión correctos; el panel se cargó pero el marcador no se ejecutó |
patched_skip | ≥ 5.7.1 |
no_latepoint | Plugin no detectado |
Ejemplos de FOFA / búsqueda:
body="/wp-content/plugins/latepoint/"
body="latepoint-book-form"
body="latepoint_helper"
La tasa de éxito del exploit depende de: que el asistente de reservas sea accesible sin pago, que el bloque del Gabinete del Cliente esté publicado, y de la sesión de invitado tras la reserva.
[ en customer[first_name] / last_name en latepoint_route_call — solo temporalmente.Solo pruebas autorizadas.