
CVE-2026-53767 + CVE-2026-53768 - RCE بعد المصادقة في Chyrp Lite ≤ 2026.01 عبر تجاوز قائمة الحظر uploads_path وعدم التحقق من الامتداد
CVE-2026-53767 + CVE-2026-53768 - تنفيذ أكواد عن بُعد (RCE) موثَّق في Chyrp Lite ≤ 2026.01 ("Iriomote")
الهجوم المتسلسل: تجاوز قائمة حظر
uploads_path(CVE-2026-53768) + غياب التحقق من امتداد الملف فيadmin_update_upload()(CVE-2026-53767) → تنفيذ أكواد عن بُعد بصلاحياتwww-data
تُعد Chyrp Lite ≤ 2026.01 عرضة لسلسلة تنفيذ أكواد عن بُعد (RCE) موثَّقة، يمكن استغلالها من قبل أي مستخدم يمتلك صلاحيات change_settings وedit_upload (الافتراضي: المسؤول).
| CVE | CVE-2026-53767 · CVE-2026-53768 |
| CVSS | 9.1 حرج (AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) |
| المتأثر | xenocrat/chyrp-lite ≤ 2026.01 |
| التصحيح | commit 1489dc9 |
| النشرات الأمنية | GHSA-8h86-c24h-5jp3 · GHSA-r9w7-5h94-wq5x |
| المُبلِّغ | iltosec |
python chyrp_rce_poc.py -h
usage: chyrp_rce_poc.py [-h] -u URL -U USERNAME -P PASSWORD [-c CMD] [-i]
[--config CONFIG] [--restore RESTORE]
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:'
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:' -c 'cat /etc/passwd'
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:' -i
الخطوة 1 - المصادقة
الخطوة 2 - إعادة توجيه uploads_path إلى tools/ (غير مدرج في قائمة الحظر)
image
image
الخطوة 3 - استبدال tools/docgen.php (لا يوجد فحص امتداد عند الاستبدال)
image
image
الخطوة 4 - التنفيذ
http://127.0.0.1/chyrp/tools/docgen.php?cmd=id
image
uploads_path غير مكتملةيتحقق includes/controller/Admin.php من uploads_path مقابل قائمة حظر مكتوبة بشكل ثابت (hardcoded):
admin | ajax | feathers | fonts | includes | modules | themes
دليل tools/ - الذي يأتي مع Chyrp Lite ويحتوي على ملفات .php قابلة للتنفيذ (docgen.php، gettext.php، triggers.php) - غير مدرج. إرسال uploads_path=tools يمر عبر التحقق ويُحفظ في config.json.php.
admin_update_upload()تتحقق upload_tester() (includes/helpers.php) فقط من رمز خطأ رفع PHP وحجم الملف - ولا تجري أي تحقق من الامتداد على الملف البديل. يُؤخذ اسم الملف الهدف من $_POST['file'] ويُحلَّل مقابل مسار uploads_path الحالي. وبما أن tools/docgen.php موجود مسبقاً (ما يحقق فحص is_file())، يتم استبداله بصمت بمحتوى عشوائي.
ملاحظة: يشير علم
--configإلىconfig.json.phpلحساب رمز CSRF. إذا لم يكن الملف قابلاً للقراءة محلياً، يلجأ السكربت تلقائياً إلى استخراج الرمز من استجابة HTML.
حدّث إلى إصدار يتضمن commit 1489dc9 أو أحدث.
تم تطبيق إصلاحين مستقلين:
الإصلاح 1 - إضافة tools (وlicenses) إلى قائمة حظر uploads_path:
// Before
"/^$qdir((admin|ajax|feathers|fonts|includes|modules|themes)$qdir|$)/"
// After
"/^$qdir((admin|ajax|feathers|fonts|includes|licenses|modules|themes|tools)$qdir|$)/"
الإصلاح 2 - التحقق من امتداد الملف المُرفع مقابل القائمة البيضاء في admin_update_upload():
$new_extension = strtolower(pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION));
$whitelist = upload_filter_whitelist();
if (!in_array($new_extension, $whitelist))
error(__("Error"), __("File type is not allowed."), code: 422);
يُطرح إثبات المفهوم (PoC) هذا للأغراض التعليمية والبحثية فقط. استخدمه فقط ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. المؤلف غير مسؤول عن أي إساءة استخدام.