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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
SSRF-CVE-2020-15002 — https://hackerone.com/reports/863553 | Kitploit
أدوات/GitHubGitHub/skr0x1c0/ssrf-cve-2020-15002
الاستطلاعتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبجمع المعلوماتاختبار الاختراق
GitHubskr0x1c0/ssrf-cve-2020-15002

SSRF-CVE-2020-15002

https://hackerone.com/reports/863553

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

الأكثر شعبية

عرض الكل →

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

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

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

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

ملخص

تعاني منطق التحقق من صحة عنوان URL المطبق عند معالجة /appsuite/api/oxodocumentfilter&action=addfile من ثلاثة عيوب يمكن استخدامها لتنفيذ هجوم SSRF من نوع Time of Check Time of Use (ToCToU). تسمح هذه المشكلة للمهاجمين بتنفيذ طلبات HTTP GET على خدمات الشبكة الداخلية وقد تؤدي إلى تسرب معلومات محمية.

العيب رقم 1: ثغرة Time of Check Time of Use (ToCToU)

منطق التحقق من صحة URL في طريقة URITools.getFinalURL المنفذة هنا يعاني من ثغرة ToCToU

root@kitploit:~
URL u = new URL(url);
if (validator.isPresent()) {
    Optional<OXException> exception = validator.get().apply(u);
    if (exception.isPresent()) {
        throw exception.get();
    }
}

URLConnection urlConnnection = u.openConnection();

في الكود أعلاه، يتم تحليل DNS لاسم المضيف لعنوان URL المدخل خلال كل من وقت التحقق (validator.get().apply(u)) ووقت الاستخدام (u.openConnection()) عن طريق استدعاء طريقة InetAddress.getByName. لذلك إذا تمكن المهاجم من تغيير نتيجة تحليل DNS بعد وقت التحقق وقبل وقت الاستخدام، يمكنه تجاوز المدقق. هذا العيب وحده من الصعب جدًا استغلاله بسبب القيود التالية

  1. بشكل افتراضي، يقوم InetAddress.getByName بتخزين نتائج تحليل DNS مؤقتًا لمدة 30 ثانية إذا نجح التحليل ولمدة 10 ثوانٍ إذا فشل.
  2. الفاصل الزمني بين validator.get().apply(u) و u.openConnection() صغير جدًا (أقل من مللي ثانية واحدة لعناوين URL العادية). يستخدم العيب رقم 2 لتجاوز هذا القيد

العيب رقم 2: طول عنوان URL المدخل غير محدود

مدقق URL AddFileAction.validator المنفذ هنا لا يتحقق من طول عنوان URL المدخل. من خلال توفير عنوان URL بحجم كبير، يمكن للمهاجم زيادة الفاصل الزمني بين استدعاءات طريقة InetAddress.getByName في وقت التحقق ووقت الاستخدام. يسمح الفاصل الزمني الأكبر للمهاجم باستغلال العيب رقم 1 بسهولة

العيب رقم 3: مدقق URL يسمح بعنوان URL المدخل إذا فشل تحليل DNS الخاص به

طريقة HostList.contains المنفذة هنا ترجع false إذا فشل تحليل DNS لاسم المضيف لعنوان URL المدخل

root@kitploit:~
// Need to resolve as last resort
try {
    return contains(InetAddress.getByName(toCheck), false);
} catch (UnknownHostException e) {
    // Cannot be resolved
    return false;
}

يقوم AddFileAction.validator باستدعاء طريقة blackImageUrlHostlist.contains للتحقق مما إذا كان اسم المضيف لعنوان URL المدخل أو عنوان IP الذي يتم حله موجودًا في القائمة السوداء. إذا تسبب المهاجم في فشل تحليل DNS لاسم المضيف، يتم تخطي فحوصات عنوان IP ويتم قبول URL.

استراتيجية الهجوم

خذ بعين الاعتبار اسم مضيف randomid.dns.pointer.pw مع خادم أسماء موثوق يسيطر عليه المهاجم. استراتيجية الهجوم هي جعل تحليل DNS لـ randomid.dns.pointer.pw يفشل في وقت التحقق (validator.get().apply(u);) وينجح في وقت الاستخدام (u.openConnection()). يسمح هذا للمهاجم بتجاوز مرشحات القائمة السوداء لعناوين IP وتنفيذ طلب HTTP GET على أي عنوان IP موجود في القائمة السوداء. قد يتبع المهاجم الخطوات التالية لتنفيذ هذا الهجوم

  1. قم بتفعيل ذاكرة التخزين المؤقت لـ InetAddress.getByName على الخادم عن طريق تنفيذ إجراء addfile مع بيانات الطلب {"add_imageurl": "http://randomid.dns.pointer.pw"}. في هذا الوقت، سيتم ضبط خادم الأسماء الموثوق لفشل تحليل DNS لـ randomid.dns.pointer.pw عن طريق إرجاع حالة SERVFAIL. سيقوم InetAddress.getByName بتخزين هذه النتيجة الفاشلة مؤقتًا لمدة 10 ثوانٍ.
  2. لاحظ الوقت الذي تم فيه استلام استجابة الطلب أعلاه. هذا هو وقت بدء التخزين المؤقت.
  3. أخبر خادم الأسماء الموثوق للنطاق pointer.pw بإرجاع 127.0.0.1 لطلبات DNS من النوع A لاسم المضيف randomid.dns.pointer.pw.
  4. انتظر لمدة محددة من وقت بدء التخزين المؤقت بحيث يقوم InetAddress.getByName في الخطوة التالية بإرجاع الاستجابة المخزنة (SERVFAIL) في وقت التحقق وإرجاع 127.0.0.1 في وقت الاستخدام (url.openConnection()).
  5. نفذ طلب SSRF مع قيمة add_imageurl مضبوطة على التنسيق http://u{25MB}:[email protected]/path/to/internal/resource.png. هنا u{25MB} يعني أن جزء اسم المستخدم هو سلسلة بطول 25 × 1024 × 1024 حرفًا.

خطوات إعادة الإنتاج

  1. قم بتثبيت golang من https://golang.org/dl/

  2. قم بتثبيت Open-Xchange و Documents في جهاز افتراضي بذاكرة وصول عشوائي لا تقل عن 4 جيجابايت باتباع الأدلة https://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Installation_Guide_for_Debian_9.0 و https://oxpedia.org/wiki/index.php?title=AppSuite:Documents_Installation_Guide#Debian_GNU.2FLinux_9.0_.28valid_from_v7.10.29

  3. قم بتنزيل واستخراج ملف poc.zip

  4. افتح الطرفية / سطر الأوامر واجعل الدليل الحالي هو مجلد poc.zip المستخرج

  5. قم بتشغيل الأمر

    root@kitploit:~
     go run . -serverRoot="http://172.16.66.130" -username="testuser" -password="secret" -targetPath="appsuite/v=7.10.3-9.20200409.083030/apps/themes/logo.png" -targetPort="80" -payloadSize=25 -startSleepDuration=6600
    

    حيث 172.16.66.130 هو عنوان IP للجهاز الظاهري

تنزيل الأداة