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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-67923 — JetEngine <= 3.7.7 — ثغرة Cross-Site Scripting مخزّنة بدون مصادقة عبر CCT REST API | Kitploit
أدوات/GitHubGitHub/randomrobbiebf/cve-2025-67923
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويبأمن واجهات برمجة التطبيقات
GitHubrandomrobbiebf/cve-2025-67923

CVE-2025-67923

JetEngine <= 3.7.7 — ثغرة Cross-Site Scripting مخزّنة بدون مصادقة عبر CCT REST API

عرض المستودع
19منذ 6 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

تقرير استغلال CVE-2025-67923

JetEngine <= 3.7.7 — برمجة نصية عبر المواقع (XSS) مخزنة بدون مصادقة عبر REST API الخاص بـ CCT

التاريخ: 11 مارس 2026 درجة CVSS: 7.1 (عالية) متجه CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L الملحق المتأثر: JetEngine <= 3.7.7 معرّف الملحق (Slug): jet-engine أُصلح في: 3.7.8 CVE: CVE-2025-67923 CWE: CWE-79 الباحث: Bonds (عبر Patchstack) أُبلغ عنه: 19 أكتوبر 2025 كُشف عنه: يناير 2026 إصدار ووردبريس المُختبر: الأحدث


الملخص التنفيذي

CVE-2025-67923 هي ثغرة برمجة نصية عبر المواقع مخزنة بدون مصادقة (Stored XSS) في ملحق JetEngine لووردبريس تؤثر على جميع الإصدارات حتى 3.7.7. يمكن لمهاجم غير مصادق كتابة HTML/JavaScript عشوائي في حقل نصي لنوع محتوى مخصص (CCT) عبر REST API العامة، ثم يُحقن دون تنقية في DOM عبر نقطة امتصاص innerHTML في JavaScript داخل أداة قوائم الخرائط (Maps Listing) عندما يزور ضحية أي صفحة تحتوي على تلك الأداة.

لا يتطلب الهجوم أي مصادقة أو صلاحيات. يتطلب فقط ما يلي:

  1. وجود CCT في JetEngine مع ضبط صلاحية الكتابة عبر REST API على public.
  2. تهيئة أداة قوائم الخرائط (Maps Listing) على أي صفحة أمامية لعرض الحقل النصي الخاص بـ CCT كتسمية لعلامة الخريطة.

✅ تم تأكيد الثغرة — تم كتابة حمولة XSS المخزنة وتنفيذها

الأثر المؤكد:

  • تخزين HTML/JS عشوائي بدون مصادقة في قاعدة بيانات CCT دون تنقية
  • انطلاق XSS لكل زائر يحمّل أي صفحة تحتوي على أداة قوائم الخرائط
  • سرقة ملفات تعريف الارتباط (cookies)، اختطاف الجلسات، جمع بيانات الاعتماد المخزنة، الاستيلاء على حساب المدير

تفاصيل الثغرة

الملخص الفني

الثغرة عبارة عن مزيج من نقطتي ضعف مستقلتين:

  1. نقص تنقية المدخلات (التخزين): لا يحتوي أسلوب sanitize_field_value() في معالج عناصر CCT على مسار تنقية لحقول نوع text. حالة default: تحوّل الطوابع الزمنية فقط — يمر HTML الخام ويُحفظ في قاعدة البيانات.

  2. نقطة امتصاص XSS عبر DOM (العرض): تقرأ أداة قوائم الخرائط قيمة الحقل المخزنة عبر get_marker_label()، وتغلّفها بـ htmlspecialchars(json_encode(...)) لسمة HTML data-markers، ثم يقرأ JavaScript في الواجهة الأمامية السمة عبر getAttribute() (الذي يفك ترميز كيانات HTML)، ويُدرج markerData.label مباشرة عبر innerHTML — مما ينفذ أي HTML/JavaScript مضمّن.

المكونات المتأثرة

الملفالمشكلة
includes/modules/custom-content-types/inc/rest-api/public-controller.php:424يُرجع create_item_permissions_check قيمة true عندما يكون rest_put_access = 'public' في CCT — لا حاجة لمصادقة
includes/modules/custom-content-types/inc/item-handler.php:489فرع default: في sanitize_field_value() — لا تنقية HTML لحقول نوع text
includes/modules/maps-listings/inc/render.php:233يُرجع get_marker_label() قيمة بيانات وصفية خام دون esc_html()
includes/modules/maps-listings/inc/render.php:247htmlspecialchars(json_encode($result)) — يحمي حدود السمة فقط، لا حقن innerHTML
includes/modules/maps-listings/assets/js/frontend-maps.js:112pinData.content = general.marker.html.replace('_marker_label_', markerData.label) — إدراج تسمية خام في سلسلة HTML
includes/modules/maps-listings/assets/js/public/mapbox-maps.js:175el.innerHTML = data.content — نقطة امتصاص تنفيذ XSS
includes/modules/maps-listings/assets/js/public/leaflet-maps.js:34contentHtml.innerHTML = content — نقطة امتصاص تنفيذ XSS

سلسلة الاستغلال

الخطوة 1 — كتابة REST بدون مصادقة

يتحقق وحدة تحكم REST العامة الخاصة بـ CCT من الصلاحيات عبر check_user_permissions():

// public-controller.php:370-376
public function check_user_permissions( $request, $context ) {
    $content_type = $this->get_content_type_from_request( $request );
    $cap = $content_type->get_arg( $context );

    if ( ! $cap || 'public' === $cap ) {
        return true;  // No authentication required
    } else {
        return current_user_can( $cap );
    }
}

public function create_item_permissions_check( $request ) {
    return $this->check_user_permissions( $request, 'rest_put_access' );
}

عندما يتم ضبط CCT مع rest_put_access = 'public' (إعداد مدعوم وموثق لنماذج مواجهة الجمهور)، تكون نقطة النهاية بدون مصادقة بالكامل. يمكن لأي عميل HTTP إرسال POST إلى /wp-json/jet-cct/{slug}.

الخطوة 2 — تخزين دون تنقية

يستدعي معالج REST الدالة $handler->update_item($params) والتي تصل إلى sanitize_field_value():

// item-handler.php:489-562
public function sanitize_field_value( $value, $field ) {
    $type = isset( $field['type'] ) ? $field['type'] : false;

    switch ( $type ) {
        case 'repeater':    // sanitizes sub-fields
            // ...
        case 'checkbox':    // handles boolean arrays
        case 'checkbox-raw':
            // ...
        case 'media':
        case 'gallery':     // sanitizes media JSON
            // ...
        case 'wysiwyg':
            $value = jet_engine_sanitize_wysiwyg( $value );  // sanitized
            break;

        default:
            // TEXT TYPE FALLS HERE — only timestamp conversion, NO HTML sanitization
            $value = $this->factory->maybe_to_timestamp( $value, $field );
    }

    return $value;
}

يصل حقل من نوع text إلى فرع default:. يُرجع maybe_to_timestamp() القيمة دون تغيير للسلاسل غير التاريخية. يتم تخزين حمولة XSS `` حرفياً.

الخطوة 3 — استرجاع التسمية دون تهريب

عندما تعرض أداة قوائم الخرائط، يقرأ get_marker_label() الحقل:

// render.php:479-535
public function get_marker_label( $post = null, $settings = array() ) {

    // ...
    switch ( $label_type ) {
        case 'meta_field':
            $field = $settings['marker_label_field'];
            if ( $field ) {
                $result = jet_engine()->listings->data->get_meta( $field, $post );
                // No esc_html() here — raw value returned
            }
            break;
    }

    return $result;  // Returns ""
}

تُوضع القيمة المُرجعة في مصفوفة بيانات العلامة:

// render.php:231-237
$result[] = array(
    'id'        => $post_id,
    'latLang'   => $latlang,
    'label'     => $this->get_marker_label( $post, $settings ),  // raw XSS payload
    // ...
);

الخطوة 4 — ترميز السمة لا يمنع XSS عبر innerHTML

تُرمَّز مصفوفة العلامة لسمة HTML:

// render.php:247
return htmlspecialchars( json_encode( $result ) );

يسلسل json_encode القيمة `` كسلسلة "". ثم يقوم htmlspecialchars بترميز JSON بالكامل على مستوى HTML، منتجاً:

[{...,&quot;label&quot;:&quot;&lt;img src=x onerror=alert(1)&gt;&quot;,...}]

تُكتب هذه القيمة في سمة HTML data-markers. الترميز يحمي حدود السمة فقط. عندما يقرأ JavaScript السمة، يفك المتصفح ترميز كيانات HTML، مستعيداً الأحرف الأصلية:

// Browser automatically decodes entities when reading via dataset / getAttribute
const markers = JSON.parse(el.dataset.markers);
// markers[0].label === ''

الخطوة 5 — حقن innerHTML (انطلاق XSS)

في frontend-maps.js، تُدمج سلسلة التسمية الخام مباشرة في سلسلة محتوى HTML:

// frontend-maps.js:112
pinData.content = general.marker.html.replace( '_marker_label_', markerData.label );
// pinData.content = '<div class="jet-map-marker-wrap">
//   
// </div>'

ثم تُعيَّن سلسلة المحتوى هذه كخاصية innerHTML لعنصر العلامة:

// mapbox-maps.js:175
el.innerHTML = data.content;  // XSS FIRES

// leaflet-maps.js:34
contentHtml.innerHTML = content;  // XSS FIRES

كل زائر يحمّل صفحة تحتوي على أداة قوائم الخرائط يطلق الحمولة.


إثبات المفهوم (Proof of Concept)

المتطلبات الأساسية

  1. وحدات maps-listings و custom-content-types في JetEngine مفعّلة.
  2. وجود CCT باسم locations (المعرّف: locations) مع:
    • rest_put_enabled = true
    • rest_put_access = 'public'
    • حقل من نوع text باسم label
  3. تهيئة أداة قوائم الخرائط (Maps Listing) على أي صفحة أمامية مع:
    • marker_type = 'text'
    • marker_label_type = 'meta_field'
    • marker_label_field = 'label'

الخطوة 1 — كتابة حمولة XSS (بدون مصادقة)

تنزيل الأداة