Craft Commerce has a SQL Injection can lead to Remote Code Execution via TotalRevenue Widget
Summary
A SQL injection in the Commerce TotalRevenue widget can lead to remote code execution through a chain of four vulnerabilities:
-
SQL Injection -- The TotalRevenue stat interpolates unsanitized widget settings directly into a sprintf-based SQL Expression. Any control panel user can create any widget type without permission checks.
-
PDO Multi-Statement Queries -- PHP
PDO MySQLenablesCLIENT_MULTI_STATEMENTSby default. Neither Yii2 nor Craft CMS disables it. This allows stacking an INSERT statement after the injected SELECT , writing a maliciously serialized PHP object into the queue table. -
Unrestricted
unserialize()-- The yii2-queue PhpSerializer callsunserialize()with no allowed_classes restriction on every queue job. When the queue consumer processes the injected job, it instantiates the attacker-controlled object. -
Gadget Chain (FileCookieJar) --
GuzzleHttp\Cookie\FileCookieJar(a standard Guzzle dependency) has an unguarded__destruct()method that callsfile_put_contents(). The attacker’s serialized payload writes a PHP webshell to the server’s webroot. PHP tags survivejson_encode()because Guzzle usesoptions=0(noJSON_HEX_TAG).
The complete chain requires 3 HTTP requests and achieves arbitrary command execution as the PHP process user. Queue processing is triggered via GET /actions/queue/run, an endpoint that requires no authentication ($allowAnonymous = ['run']).
RCE Exploitation Steps
- Authenticate as any control panel user
- POST to
/admin/actions/dashboard/create-widgetwith stacked SQL injection: settings[type]contains the stacked INSERT with the serialized gadget chain- Response: HTTP 500 (expected -- INSERT already committed)
- Trigger queue processing:
GET /actions/queue/run - Queue consumer deserializes the gadget chain
FileCookieJar::__destruct()writes webshell to webroot- Access the webshell:
GET /poc_rce.php?c=id - Response:
uid=1000(home) gid=1000(home) groups=1000(home)
Affected software
Click a technology to see all vulnerabilities affecting it.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| Composer package | craftcms/commerce | >= 4.0.0, < 4.10.3, >= 5.0.0, < 5.5.5 | 4.10.3, 5.5.5 |
References
- CVSS vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N- Weakness (CWE)
CWE-89- Platform
- Composer
- Package
craftcms/commerce- Disclosed
- 14.04.2026
- Updated
- 11.10.2026 10:22
Sources and licenses
OSV / GitHub Advisory Database - GHSA-875v-7m49-8x88 - CC BY 4.0
Vulnerability history: craftcms/commerce
All published vulnerabilities of this package (Composer package), newest first. Shows whether this is a one-off slip or a package that needs watching.
- Total entries
- 21
- First → latest
- 02.2026 06.2026
- Without a fix
- 0
- Exploited in attacks
- 0
Severity breakdown
- High 5
- Medium 13
- Low 3
Disclosures per year
- 2026: 21
-
Craft Commerce has a SQL Injection can lead to Remote Code Execution via TotalRevenue Widget this entry
Know which vulnerabilities affect your application
With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.