Joomla Balbooa Forms Unauthenticated Arbitrary File Upload → RCE (CVE-2026-56291)
Published: 2026-07-27 • Researcher: ChiefYoru (Yoru / يورو, t.me/ChiefYoru)
Exploitation signals
Confirmed exploited in the wild. Added to CISA KEV 2026-07-10. Federal remediation deadline 2026-07-13.
EPSS 76.1% · 99th percentile
- Severity
- Critical
- CVE
- CVE-2026-56291
- Category
- web
- Affected product
- Balbooa Forms (com_baforms) — third-party Joomla! extension by balbooa.com
- Affected versions
- Before 2.4.1
- Disclosed
- 2026-07-27
- Patch status
- Unverified
Tags
References
Archive entry
intelseclab/poc-archiveOn this page
Metadata
| Field | Value |
|---|---|
| Date Added | 2026-07-27 |
| Last Updated | 2026-07-27 |
| Author / Researcher | ChiefYoru (Yoru / يورو, t.me/ChiefYoru) |
| CVE / Advisory | CVE-2026-56291 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (CVSSv3) |
| Status | Weaponized |
| Tags | joomla, balbooa-forms, file-upload, webshell, unauthenticated, rce, kev, actively-exploited, cwe-434 |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Balbooa Forms (com_baforms) — third-party Joomla! extension by balbooa.com |
| Versions Affected | Before 2.4.1 |
| Language / Platform | PHP (Joomla! component), any OS the Joomla install runs on |
| Authentication Required | No |
| Network Access Required | Yes — direct HTTP(S) reachability to the Joomla site’s index.php front controller |
Summary
Balbooa Forms is a popular drag-and-drop form builder extension for Joomla!. Its form.uploadAttachmentFile task — reachable via the unauthenticated com_baforms component entry point — accepts multipart file uploads for form attachments but performs neither a Joomla Session::checkToken() CSRF/session check nor any file-extension whitelist/blacklist validation. An unauthenticated attacker can therefore POST a .php or .phtml file disguised as an image attachment directly to the task handler; the file is stored under a predictable, web-reachable path (/images/baforms/uploads/form-{id}/) and is immediately executable by the PHP interpreter, yielding full remote code execution as the web server user. CISA added this to the KEV catalog on 2026-07-10 with active in-the-wild exploitation observed; EPSS is approximately 0.76.
Vulnerability Details
Root Cause
CWE-434 (Unrestricted Upload of File with Dangerous Type). The form.uploadAttachmentFile task handler in com_baforms (versions prior to 2.4.1) is registered without Joomla’s standard CSRF token check (Session::checkToken()), making it directly invokable by an unauthenticated actor. Worse, the handler saves the uploaded file’s original name/extension into the component’s public uploads directory (images/baforms/uploads/form-{form_id}/) without validating the extension against any whitelist of safe types (images, PDFs, etc.) or blacklist of executable types (.php, .phtml, .php5, etc.). Because this uploads directory sits under Joomla’s public images/ webroot, any file placed there is directly fetchable — and if it carries a server-parsed PHP extension, the web server executes it on request.
Attack Vector
- Send an unauthenticated
POSTto:with a multipart file part namedOutputindex.php?option=com_baforms&task=form.uploadAttachmentFile&form_id={id}&format=jsonfile, containing PHP source but named e.g.shell.phporshell.phtml, spoofing theContent-Typeasimage/jpeg. - Because no CSRF token is required and no extension filtering occurs, the component happily stores the file, typically under
/images/baforms/uploads/form-{form_id}/{original_filename}. - Request the stored file directly over HTTP — the web server executes it as PHP, running attacker-supplied code with the privileges of the web server process.
form_id is enumerable (small sequential integers), so an attacker does not need to know a specific valid form ID in advance — brute-forcing IDs 1–10 (as the PoC does) reliably finds an existing, exploitable form on real-world sites.
Impact
Unauthenticated remote code execution as the web server user (commonly www-data or apache) on any internet-facing Joomla site running a vulnerable Balbooa Forms version — full site compromise, database access via Joomla’s configuration, and a foothold for lateral movement on shared hosting.
Environment / Lab Setup
OS: Any (Joomla is PHP, runs on Linux/Windows)
Target: Joomla! CMS with Balbooa Forms (com_baforms) < 2.4.1 installed and at least one form created
Attacker: Python 3
Tools: BalbooaForms_rce.py (this folder) — requires `requests`, `colorama`, `urllib3`Setup Steps
| |
Proof of Concept
See
BalbooaForms_rce.py(full, unmodified) in this folder — mirrored from ChiefYoru/CVE-2026-56291_PoC. Verified before ingestion: the script performs genuine detection (detect_balbooa()fingerprintscom_baformsvia its component files/manifest), then a real exploit path (deploy_shell()POSTs a crafted multipart file toform.uploadAttachmentFilefor form IDs 1–10, trying both.phpand.phtmlextensions across the three plausible upload-path variants), and finally verifies genuine code execution rather than a blind upload:check_url()fetches the resulting shell URL and confirms the PHP marker string is present in the rendered response (proof the server parsed and executed the file as PHP rather than serving it as static/plain text). The embedded webshell (SHELL_CODE) callsphp_uname()— its output appearing in the response is direct proof of arbitrary PHP code execution on the target — and also exposes a minimal second-stage arbitrary-file-upload form for follow-on tooling. No obfuscation, no destructive default behavior, no phone-home/exfil to third-party infrastructure beyond the attacker-supplied target list.
Step-by-Step Reproduction
Prepare a target list — one host per line (with or without scheme), e.g.
targets.txt:Outputhttps://vulnerable-joomla-site.exampleRun the exploit — it prompts interactively for the target list path:
Shell script1 2python3 BalbooaForms_rce.py [?] Enter Target List: targets.txtCollect results — successfully deployed shell URLs are appended to
shells.txtas they’re found, alongside live console output.
Exploit Code
| |
Expected Output
[INFO] Tools initialized. Target scan starting...
[+] https://vulnerable-joomla-site.example/images/baforms/uploads/form-3/yoru_a1b2c3d4e5.php - [Pwned]
[+] 1 shells saved to shells.txtVisiting the returned shell URL directly in a browser shows the php_uname() output (confirming code execution) plus a minimal file-upload form for dropping a follow-on payload.
Detection & Indicators of Compromise
SIEM / IDS Rule (example):
alert http any any -> any any (msg:"Possible Balbooa Forms unauth file upload (CVE-2026-56291)"; content:"task=form.uploadAttachmentFile"; http_uri; content:"filename="; http_client_body; pcre:"/filename=.*\.(php\d?|phtml|pht)[\"']/i"; sid:9000002;)Remediation
| Action | Detail |
|---|---|
| Patch | Update Balbooa Forms to version 2.4.1 or later, which adds CSRF token validation and file-extension filtering to the upload handler. |
| Workaround | If patching is not immediately possible, block/deny execution of PHP files under images/baforms/uploads/ via web server config (e.g. Apache <Directory> block removing PHP handler, Nginx location block returning 403 for .php/.phtml under that path), and/or disable the Balbooa Forms component entirely until patched. |
| Config Hardening | Generally disable PHP execution in any Joomla images/-rooted, user-writable upload directory (php_admin_flag engine off or equivalent), independent of this specific extension. |
References
Notes
Two independent public PoC implementations exist for this CVE: ChiefYoru/CVE-2026-56291_PoC (ingested here as the canonical source) and shinthink/CVE-2026-56291. Both are functionally similar mass-exploit tools that upload a webshell via the same form.uploadAttachmentFile task and verify execution.
ChiefYoru was chosen over shinthink deliberately, not arbitrarily. In this same verification pass, the shinthink account was also found to have published a PoC for a different CVE (CVE-2026-58480, WordPress Blocksy Companion Pro) that turned out to be a confirmed fake/fabricated exploit — a blind guess-and-spray script with no real vulnerable code path behind it, presented as if it were a working tool. That finding doesn’t retroactively prove shinthink’s CVE-2026-56291 copy is fake — its code for this CVE was also reviewed and does appear to implement a working exploit — but it materially lowers confidence in that account’s output in general. Given two independently-authored, functionally-equivalent PoCs for the same bug, ChiefYoru is preferred as the cleaner source with no such red flag attached, and is credited as the author of record for this entry. shinthink’s copy is retained above only as a secondary reference/mirror.
The upstream ChiefYoru repository contains no README or LICENSE file — it is a single-file drop (BalbooaForms_rce.py, 172 lines, added 2026-07-18 per the repo’s git history) with authorship/contact information embedded directly in the script’s banner and docstring.
| |