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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2019-11581 — حقن القوالب بدون مصادقة في Atlassian Jira | Kitploit
أدوات/GitHubGitHub/petrusviet/cve-2019-11581
تحليل الثغرات الأمنيةالاستغلالشيل كوداستغلال تطبيقات الويبالتعلم والتعليمتطوير الحمولات
GitHubpetrusviet/cve-2019-11581

CVE-2019-11581

حقن القوالب بدون مصادقة في Atlassian Jira

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

الأكثر شعبية

عرض الكل →

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

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

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

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

حقن قوالب بدون مصادقة في Atlassian Jira (CVE-2019-11581)

I) البناء

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

4.4.x
5.x.x
6.x.x
7.0.x
7.1.x
7.2.x
7.3.x
7.4.x
7.5.x
7.6.x before 7.6.14 (the fixed version for 7.6.x)
7.7.x
7.8.x
7.9.x
7.10.x
7.11.x
7.12.x
7.13.x before 7.13.5 (the fixed version for 7.13.x)
8.0.x before 8.0.3 (the fixed version for 8.0.x)
8.1.x before 8.1.2 (the fixed version for 8.1.x)
8.2.x before 8.2.3 (the fixed version for 8.2.x)

2. البناء والتصحيح

  • عدّل قيمة set JVM_SUPPORT_RECOMMENDED_ARGS= في الملف ./bin/setenv.bat (أو ما يعادله في ./bin/setenv.sh لنظام لينكس) لتتمكن من تشغيل التصحيح عن بُعد
set JVM_SUPPORT_RECOMMENDED_ARGS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  • في IDE (Intellij) أنشئ Debug Configurations: Remote JVM Debug مع قيمة host و port لتكون localhost:5005 و Command line aguments for remote JVM
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
  • شغّل الملف ./bin/config.bat (أو config.sh في لينكس) وعدّل "Jira home" إلى مجلد jira home الخاص بك image

  • شغّل الملف ./bin/start-jira.bat (أو ./bin/start-jira.sh في لينكس). تحقق من أن إصدار جافا والمنفذين 8080 و5005 متاحان، وإلا فلن يعمل!

  • نختار الوضع الخاص (private mode) image

  • في هذه الخطوة، تذكّروا استخدام عنوان بريد إلكتروني يمكنه استقبال الإيميل :) image

  • أكملوا الإعدادات (Conf) واختبروا الاتصال بشكل كامل image

  • في http://localhost:8080/secure/admin/EditApplicationProperties!default.jspa فعّل ميزة Contact Administrators Form image

  • سأذكر بعض الملاحظات فقط عند البناء، يمكنكم الاطلاع على بناء Jira من المصدر

II) التحليل

بعد قراءة الإشعار الأمني علمنا أن هذا الخطأ يقع في ContactAdministrators و SendBulkMail (وهذا الأخير سأتجاهله لأنه يتطلب مصادقة). لذلك بدأت باختبار ميزة ContactAdministrators والتقاط الطلب

image

  • لاحظت أن الطلب يذهب إلى /secure/ContactAdministrators.jspa، لذا نظرت إلى الملف ./atlassian-jira/WEB-INF/web.xml لمعرفة أي class سيُوجَّه إليه هذا الطلب
    image
    image

  • بهذا تتم معالجة الطلب في JiraWebworkActionDispatcher، لذا وضعت نقطة توقف (breakpoint) في init و server في هذا class وشغّلت التصحيح image

  • وهكذا توقف البرنامج عند الدالة server، وبعد تتبّع قليل انتقل البرنامج إلى ContactAdministrators.doExecute() image

  • ثم مررنا عبر send، وهنا يعرض البرنامج قائمة بحسابات الأدمن النشطة image

  • ثم يمر البرنامج عبر الدالة sendTo. هنا نرى أن البرنامج ينشئ MailQueueItem ويضيفه إلى mailQueue. image

  • يستدعي البرنامج الدالة EmailBuilder.withSubject. هنا يتم تحويل نص موضوع البريد الإلكتروني (الذي يرسله المهاجم) من String إلى TemplateSources وتُسند إلى المعامل subjectTemplate في EmailBuilder. image

  • في الدالة renderLater ينشئ البرنامج EmailRenderer ويستخدمه لإنشاء RenderingMailQueueItem image

  • من هنا، عند العودة إلى الدالة ContactAdministrators.sendTo، بعد إنشاء MailQueueItem يضيف البرنامج العنصر إلى mailQueue ثم يعود إلى دالة doExecute لإجراء Redirect. إذا اتبعنا مسار التصحيح هذا فلن نتمكن من الوصول إلى الجزء الذي يعرض فيه البرنامج البريد الإلكتروني، وبالتالي لا يمكن الوصول إلى النقطة التي يحدث فيها حقن القالب. فماذا أفعل لتتبّع معالجة البريد الإلكتروني؟؟؟

  • رأيت أن في EmailRenderer دالة renderNow (والبرنامج يستدعي renderLater فقط). توقعت أنه عندما يُستدعى البريد الموجود في queue ليتم عرضه، فإنه سيسلك نفس مسار renderNow، لذلك قررت التتبّع بدءًا من الدالة renderNow image

  • من renderNow يستدعي البرنامج EmailRenderer.render(). وضعت نقطة توقف هنا وأعدت إرسال الطلب لأرى إن كان البرنامج سيصل فعلاً إلى هذه النقطة image

  • لحسن الحظ، سار البرنامج في الاتجاه الذي توقعته. بعدها استدعى البرنامج renderEmailSubject image

  • ثم يستدعي البرنامج DefaultVelocityTemplatingEngine.render(this.subjectTemplate) image

  • نصل إلى DefaultVelocityTemplatingEngine.applying و DefaultVelocityTemplatingEngine.asPlainText image

  • ثم يواصل الاستدعاء إلى asPlainText(Writer writer) image

  • نصل إلى toWriterImpl، ولأن writer الذي مررته هو Fragment، يقفز البرنامج إلى else

private void toWriterImpl(Writer writer, boolean attachCartridge) throws IOException {
            if (this.source instanceof File) {
                File template = (File)this.source;
                if (attachCartridge) {
                    this.context.attachEventCartridge(DefaultVelocityTemplatingEngine.this.createDefaultCartridge());
                }

                DefaultVelocityTemplatingEngine.this.velocityManager.writeEncodedBody(writer, template.getPath(), "", DefaultVelocityTemplatingEngine.this.applicationProperties.getEncoding(), this.context);
            } else if (this.source instanceof Fragment) {
                Fragment fragment = (Fragment)this.source;
                if (attachCartridge) {
                    this.context.attachEventCartridge(DefaultVelocityTemplatingEngine.this.createDefaultCartridge());
                }

                DefaultVelocityTemplatingEngine.this.velocityManager.writeEncodedBodyForContent(writer, fragment.getContent(), this.context);
            }
تنزيل الأداة