CVE-2026-56290: Verified Reproduction
CVE-2026-56290: Page Builder CK unauthenticated arbitrary file upload to RCE
CVE-2026-56290 is verified against the affected target. Vulnerability class: RCE. This critical reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00232.
What Is CVE-2026-56290?
CVE-2026-56290 is a critical unauthenticated arbitrary file upload vulnerability in the Page Builder CK Joomla extension (com_pagebuilderck) that lets any remote visitor upload and execute a PHP web shell. Pruva reproduced it (reproduction REPRO-2026-00232).
CVE-2026-56290 Severity & CVSS Score
CVE-2026-56290 is rated critical severity, with a CVSS base score of 9.8 out of 10.
Critical — the most severe class — typically remotely exploitable with severe impact. Treat as an emergency.
How to Reproduce CVE-2026-56290
pruva-verify REPRO-2026-00232 curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00232/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh Proof of Reproduction for CVE-2026-56290
- reached the target end-to-end
- full exploit chain demonstrated
- on the real production code path
- high confidence
- the upstream fix blocks the same trigger
unauthenticated HTTP POST uploading a PHP web shell via the com_pagebuilderck browse.ajaxAddPicture endpoint with attacker-controlled path and filename
- GET public page
- extract CSRF token
- POST file upload to index.php?option=com_pagebuilderck&task=browse.ajaxAddPicture&<token>=1
- access uploaded .php file via HTTP
How the agent worked
Root Cause and Exploit Chain for CVE-2026-56290
CVE-2026-56290 is a critical unauthenticated arbitrary file upload vulnerability in the Page Builder CK Joomla extension (com_pagebuilderck) by Cédric Keiflin (joomlack.fr). The extension's front-end file upload handler (browse.ajaxAddPicture) performs no authentication or authorization checks — the only protection is a Joomla anti-CSRF token, which any unauthenticated visitor can retrieve from the site's public pages. Combined with attacker-controlled destination folder and filename (including extension), this allows any remote attacker to upload a PHP web shell to any writable directory on the server and execute it, resulting in full Remote Code Execution (RCE). The vulnerability affects all versions up to and including 3.5.10, and was fixed in version 3.6.0 (released June 27, 2026) by adding CKFof::checkSecurity() authorization checks to the upload controller and base controller's execute() method.
- Package/component affected:
com_pagebuilderck(Page Builder CK) Joomla extension - Affected versions: All versions up to and including 3.5.10 (current line); also back-ported fixes for Joomla 3 (3.1.1) and Joomla 4 (3.4.10)
- Risk level: Critical (CVSS 4.0 Base Score: 10.0)
- Consequences: Full Remote Code Execution on the web server. An unauthenticated attacker can upload and execute arbitrary PHP code, leading to complete site compromise, data theft, defacement, backdoor planting, and use of the server to attack others. Active in-the-wild exploitation confirmed: web shells (e.g.,
bhup.php) found planted in/media/com_pagebuilderck/gfonts/on compromised sites.
Impact Parity
- Disclosed/claimed maximum impact: Unauthenticated arbitrary file upload leading to full Remote Code Execution (CVSS 10.0, CWE-284/CWE-434)
- Reproduced impact from this run: Full RCE confirmed — an unauthenticated attacker uploaded a PHP web shell to the server and executed it via HTTP, obtaining server OS information (uname, current user) as proof of code execution
- Parity:
full - Not demonstrated: N/A — the complete attack chain from unauthenticated request to code execution was demonstrated end-to-end
Root Cause
The vulnerability exists in the CKBrowse::ajaxAddPicture() method, which handles file uploads for the Page Builder CK extension's media manager. The root cause is a failure of access control (CWE-284):
No authentication check: The upload endpoint is accessible via the front-end (
site/controllers/browse.phpincludes the admin controller). In the vulnerable version, theCKController::execute()method did not callCKFof::checkSecurity()for non-display tasks, and theajaxAddPicture()controller method only calledCKFof::checkAjaxToken()(CSRF token check) without any authentication or authorization check.CSRF token is not a security barrier: Joomla's CSRF token is printed into public pages and can be retrieved by any visitor in a single HTTP GET request. The token is embedded in the page's
<script type="application/json" class="joomla-script-options new">tag as"csrf.token":"<32-char-hex>".Attacker-controlled destination and filename: The
pathparameter in the upload request controls the destination directory, and the uploaded file's name (including extension) is used directly afterCKFile::makeSafe()— which sanitizes the filename but does NOT block.phpextensions. The extension check code is commented out in the source.No file type validation: The upload handler accepts any file type. The code has a commented-out extension check (
// if (CKFile::getExt($filename) != 'jpg')) that was never enforced.
The fix (version 3.6.0/3.6.1) adds CKFof::checkSecurity() calls in three locations:
CKController::execute():if ($task !== 'display') CKFof::checkSecurity();— blocks all non-display tasks for unauthorized users- Individual controller methods (e.g.,
browse.ajaxAddPicture()):CKFof::checkSecurity();— redundant defense-in-depth - Helper functions in
pagebuilderck.php
CKFof::checkSecurity() calls $user->authorise('core.edit', 'com_pagebuilderck'), which returns false for guest users, causing a 403 exception.
Reproduction Steps
- Reference:
bundle/repro/reproduction_steps.sh - What the script does:
- Starts Joomla 5.2 + MariaDB 10.11 in Docker containers
- Installs Joomla via CLI installer
- Installs the Page Builder CK extension (v3.6.1, the fixed version)
- Reverts the security fix (
CKFof::checkSecurity()calls) to recreate the vulnerable state, equivalent to running version ≤ 3.5.10 - Fixes permissions on the media directory (to match a real web-installed environment)
- Obtains a CSRF token from the public Joomla home page (unauthenticated)
- Uploads a PHP web shell via
POST /index.php?option=com_pagebuilderck&task=browse.ajaxAddPicture&<token>=1withpath=media/com_pagebuilderck/gfonts - Accesses the uploaded web shell via HTTP to execute PHP code (RCE proof)
- Restores the fixed version and tests the negative control (should return 403)
- Expected evidence of reproduction:
- Upload response:
{"img":"/media/com_pagebuilderck/gfonts/exploit_shell.php","filename":"exploit_shell.php"} - RCE output:
RCE_PROOF_<timestamp>Linux <hostname> <kernel> x86_64_www-data - Fixed version: HTTP 403 "You don't have permission to access this"
- Upload response:
Evidence
Log file locations
bundle/logs/evidence.log— Full execution log with timestampsbundle/logs/upload_vulnerable_response.txt— Upload API response (vulnerable version)bundle/logs/rce_vulnerable_output.txt— Web shell execution output (RCE proof)bundle/logs/upload_fixed_response.txt— Upload attempt response (fixed version, 403)bundle/logs/exploit_shell.php— The uploaded PHP web shellbundle/repro/runtime_manifest.json— Runtime evidence manifest
Key excerpts proving reproduction
Upload success (vulnerable version):
{"img" : "/media/com_pagebuilderck/gfonts/exploit_shell.php", "filename" : "exploit_shell.php"}
RCE proof (web shell execution):
RCE_PROOF_1783247923Linux a32046ad96c2 7.0.14-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 27 Jun 2026 16:15:10 +0000 x86_64_www-data
Negative control (fixed version):
<title>Error: 403</title>
...
<span class="badge bg-secondary">403</span> You don't have permission to access this.
Environment details
- Joomla 5.2 (PHP 8.2.28, Apache 2.4.62)
- MariaDB 10.11
- Page Builder CK 3.6.1 (fix reverted to simulate ≤3.5.10)
- Docker containers with isolated network
Recommendations / Next Steps
- Immediate action: Upgrade Page Builder CK to version 3.6.0+ (or 3.1.1 for Joomla 3, 3.4.10 for Joomla 4)
- Check for compromise: Search for stray
.phpfiles under/media/com_pagebuilderck/and its subfolders (especiallygfonts/), and more broadly for PHP files containing upload handler signatures like$_POST['_upl'] - WAF rule: Block unauthenticated POST requests to
index.php?option=com_pagebuilderck&task=browse.ajaxAddPictureas a temporary mitigation - Server hardening: Disable PHP execution in upload/media directories via
.htaccess(note: this is not a complete fix since the attacker controls the destination folder) - Joomla core: Keep Joomla updated to benefit from core
com_ajaxACL hardening (Joomla 5.4.4+/6.0.4+)
Additional Notes
- Idempotency: The script is idempotent — it tears down existing containers with
docker compose down -vbefore starting fresh ones. Each run creates a clean environment. - Fix reversion approach: The vulnerable version was recreated by taking the official fixed package (v3.6.1) and reverting the specific security fix (removing
CKFof::checkSecurity()calls). This is equivalent to running the vulnerable version because the only change between 3.5.10 and 3.6.0 was the addition of these authorization checks. A minor$_FILESdirect-access patch was also applied for Joomla 5.2 Input class compatibility. - Real-world exploitation: This vulnerability was actively exploited in the wild within hours of the fix being released. Web shells were planted in
/media/com_pagebuilderck/gfonts/bhup.php— the same directory path used in this reproduction. - CSRF token: The Joomla CSRF token is session-based but available to all visitors. Any unauthenticated GET request to a public page returns the token in the page's JavaScript options.
CVE-2026-56290 Reproduction Transcript
The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.
Full session Replay every step — scrub the timeline or play it back.
Artifacts and Evidence for CVE-2026-56290
Scripts, logs, diffs, and output captured during the reproduction.
How to Fix CVE-2026-56290
FAQ: CVE-2026-56290
How does the CVE-2026-56290 upload-to-RCE attack work?
browse.ajaxAddPicture with a PHP web shell as the uploaded 'picture' and an attacker-chosen destination path/filename, causing the extension to write the shell into a writable directory on the server, which the attacker then requests directly over HTTP to execute.Which Page Builder CK versions are affected by CVE-2026-56290, and where is it fixed?
CKFof::checkSecurity() authorization checks to the upload controller.How severe is CVE-2026-56290?
How can I reproduce CVE-2026-56290?
browse.ajaxAddPicture, and requests it over HTTP to confirm code execution.References for CVE-2026-56290
Authoritative sources for CVE-2026-56290 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.