Bludit CMS API Unrestricted File Upload to RCE (CVE-2026-25099)
by Yahia Hamza · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-25099
- Category
- web
- Affected product
- Bludit CMS (/api/files/<page-key> endpoint)
- Affected versions
- Bludit < 3.18.4 (fixed in 3.18.4)
- Disclosed
- 2026-07-05
- Patch status
- patched
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-03 |
| Author / Researcher | Yahia Hamza |
| CVE / Advisory | CVE-2026-25099 |
| Category | web |
| Severity | High |
| CVSS Score | Not specified in source |
| Status | Weaponized |
| Tags | bludit, cms, file-upload, webshell, rce, php, api-token, cwe-434, authenticated |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Bludit CMS (/api/files/<page-key> endpoint) |
| Versions Affected | Bludit < 3.18.4 (fixed in 3.18.4) |
| Language / Platform | Python 3 PoC against a PHP/Bludit target |
| Authentication Required | Yes (valid API token) |
| Network Access Required | Yes |
Summary
Bludit CMS’s POST /api/files/<page-key> endpoint lets any holder of a valid API token upload files to a page without validating file extension or content, so a PHP file can be uploaded and dropped directly under the web-accessible uploads directory. Once uploaded, the file is reachable at a predictable bl-content/uploads/pages/<page-key>/<filename> URL and executes as the web server user (www-data) when requested, giving the attacker full remote code execution. The included Python tool retrieves the target page’s key, uploads a PHP webshell disguised as an allowed file type, verifies code execution, and then offers either single-command execution or a full interactive shell over HTTP.
Vulnerability Details
Root Cause
The uploadFile() function backing the Bludit files API performs no server-side validation of uploaded file extensions or content type, allowing arbitrary file types (including .php) to be stored in a location served directly by the web server.
Attack Vector
- Attacker obtains a valid Bludit API token (visible under Plugins → API in the admin panel, or otherwise leaked/guessed).
- Attacker queries the API to retrieve the target page’s key.
- Attacker uploads a PHP webshell via
POST /api/files/<page-key>using the valid token; the file lands unmodified inbl-content/uploads/pages/<page-key>/. - Attacker requests the uploaded file’s URL directly, causing the web server to execute the embedded PHP, confirmed by commands such as
id/whoamireturningwww-data.
Impact
Full remote code execution as the web server user on any Bludit installation older than 3.18.4 where an attacker can obtain an API token, enabling complete site and potentially host compromise.
Environment / Lab Setup
Target: Bludit CMS < 3.18.4 with the API plugin enabled and a valid API token
Attacker: Python 3, requests library
Proof of Concept
PoC Script
See
CVE-2026-25099.pyandscreenshots/poc-execution.jpgin this folder.
| |
The script retrieves the target’s page key via the API, uploads a PHP webshell through the vulnerable files endpoint, requests the uploaded file to confirm command execution as www-data, and then either runs a single supplied command or drops into an interactive shell session over HTTP.
Detection & Indicators of Compromise
Signs of compromise:
- Unexpected
.phpfiles present underbl-content/uploads/pages/ - Web server logs showing GET requests to uploaded files returning command output (e.g.,
uid=33(www-data)) - API token usage from unfamiliar IP addresses uploading non-media file types
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade to Bludit 3.18.4 or later |
| Interim mitigation | Disable the API plugin if not required; enforce a strict file-extension allow-list and disable PHP execution within the uploads directory via web server configuration; monitor /bl-content/uploads/ for unexpected PHP files |
References
Notes
Mirrored from https://github.com/yahiahamza/CVE-2026-25099 on 2026-07-05.
| |