Aug 21, 2026·5 min read·3 visits
An authorization bypass in Winter CMS prior to 1.2.14 allows authenticated backend users with basic controller access to bypass granular import/export permission gates by interacting directly with AJAX handlers.
Winter CMS contains an authorization bypass vulnerability within its ImportExportController behavior. Due to a design flaw in the request lifecycle processing, permissions configured for data import and export operations are not validated during AJAX-based requests, allowing authenticated users with limited privileges to perform unauthorized data exfiltration or database manipulation.
The vulnerability designated as GHSA-FM29-4MQ3-PHG6 identifies an authorization bypass within Winter CMS, specifically affecting the ImportExportController behavior located in modules/backend/behaviors/ImportExportController.php.
This behavior is designed as a horizontal code-reuse mixin that allows developers to quickly equip custom backend controllers with comprehensive CSV or Excel import and export capabilities.
The attack surface exists for authenticated backend users who possess permissions to access a parent controller but are explicitly restricted from performing data imports or exports through granular permissions.
Due to an execution-order mismatch in the request lifecycle, the granular security barriers designated for import and export functions were not enforced during direct AJAX-based requests, enabling privilege escalation (CWE-862).
To understand the core flaw, it is necessary to examine the request-handling lifecycle of the Winter CMS backend controller class (Backend\Classes\Controller).
During controller initialization, any declared behaviors, such as ImportExportController, are instantiated, which automatically binds their respective widgets and AJAX handlers to the parent controller instance.
When a request arrives as an AJAX POST, the framework executes Backend\Classes\Controller::execAjaxHandlers() early in the execution sequence.
If the handler name matches an endpoint declared by the behavior (such as onImport or onExport), that handler runs immediately, outputs its response, and early-terminates the execution flow.
Consequently, the execution path never reaches the controller's execPageAction() method, which is the only phase where the security checkpoints in import() and export() were evaluated.
The execution flow mismatch is illustrated in the sequence diagram below, which shows how direct AJAX requests completely bypass the traditional page action security barriers:
Prior to the fix implemented in version 1.2.14, the behavior restricted access exclusively within the page view methods. This meant that the security policy was completely bypassed when interacting directly with the underlying AJAX handlers.
// Vulnerable execution path in ImportExportController.php
public function import()
{
if (!$this->userHasAccess('import')) {
abort(403); // Check was only present here!
}
// ... standard action logic ...
}The official patch modified the behavior to inject authorization checks directly inside each internal handler and the download action. This modification blocks unauthorized operations during the initial state-binding process.
// Patched execution path in ImportExportController.php
public function onImport()
{
if (!$this->userHasAccess('import')) {
abort(403); // Added explicit handler gate
}
try {
$model = $this->importGetModel();
// ... model import logic ...
}
// ... error handling ...
}This remediation ensures completeness because the authorization check is now executed immediately upon entering any entry point that manipulates state or retrieves generated documents.
An attacker seeking to exploit this vulnerability must first obtain valid authenticated credentials for the Winter CMS backend. The user account must have permissions to access the parent controller but be denied the specific import/export administrative actions.
To bypass the standard interface restriction, the attacker bypasses the HTML form and makes a direct POST request to the controller's endpoint, declaring the targeted AJAX handler in the headers.
POST /backend/acme/records HTTP/1.1
Host: target.local
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
X-OCTOBER-REQUEST-HANDLER: onExport
export_columns[]=id&export_columns[]=email&visible_columns[id]=1&visible_columns[email]=1The server executes the query and generates the CSV file, returning a download payload with a temporary identifier. The attacker then fetches the file directly via the unguarded download path, retrieving sensitive database tables without authorization.
The vulnerability introduces severe risks to confidentiality and integrity. Since the import and export utilities handle raw database interactions, bypassing their gates allows full data exfiltration and database tampering.
An attacker can export customer lists, configuration credentials, or proprietary datasets. Additionally, by invoking the import action, the attacker can alter database values, escalate privileges of administrative accounts, or insert malicious entries.
A CVSS v3.1 base score of 8.1 reflects the impact when exploited by a low-privileged user. The attack vector is entirely remote, requires minimal complexity, and bypasses local logical partitioning.
The primary remediation strategy is upgrading the Winter CMS installation to version 1.2.14 or later. This can be achieved through composer by running the update command.
If upgrading immediately is not possible, security teams should apply the code patch manually to modules/backend/behaviors/ImportExportController.php using the commit modifications.
As a temporary workaround, network administrators can deploy Web Application Firewall (WAF) rules to inspect incoming requests. Specifically, log and block any POST requests to /backend routes that contain the request handler header value onExport or onImport if the authenticated user lacks matching privileges.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Winter CMS Winter CMS | >= 1.0.0, < 1.2.14 | 1.2.14 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-862 (Missing Authorization) |
| Attack Vector | Network (Unauthenticated or low-privilege backend session required) |
| CVSS v3.1 Score | 8.1 (High) |
| Impact | Privilege Escalation, Unauthorized Data Exfiltration, Database Manipulation |
| Exploit Status | PoC / Regression Test validation |
| CISA KEV Status | Not Listed |
The software does not perform an authorization check when an actor attempts to access a resource or perform an action.
A Stored Cross-Site Scripting (XSS) vulnerability exists in the Backend List widget of Winter CMS (winter/wn-backend-module). When a list column is configured with the 'image' type and displays attacker-controlled input, the lack of sanitization in the image URL allows injection of arbitrary HTML attributes, potentially executing malicious scripts in the session of administrators viewing the list.
An Insecure Direct Object Reference (IDOR) vulnerability was identified in Winter CMS version 1.2.13. The vulnerability exists within the newly introduced Backend\Controllers\MyAccount controller, which utilizes the FormController behavior without appropriate model query scoping or routing controls. This allows authenticated, low-privilege backend users to retrieve sensitive personal and administrative data of other backend accounts by enumerating record identifiers via standard CRUD routes.
Winter CMS versions prior to 1.2.14 are vulnerable to Stored Cross-Site Scripting (XSS) within the administrative backend interface. The flaw resides in the custom styles rendering pipeline for Brand Settings and Editor Settings. An attacker with privileges to modify backend branding or editor configurations can inject arbitrary JavaScript, which is written to the cache without sanitization. Subsequent page requests that result in a cache hit completely bypass output sanitization filters, leading to JavaScript execution in the sessions of other administrative users.
Winter CMS contains a routing bypass vulnerability that allows Cross-Site Request Forgery (CSRF) attacks to trigger administrative AJAX handlers. Due to case-insensitivity in PHP's method resolution and an insufficiently strict check in the backend controller system, an attacker can invoke these handler methods through lowercase HTTP GET requests, bypassing default CSRF token validation.
A reflected Cross-Site Scripting (XSS) vulnerability exists in the backend Table widget of Winter CMS. The vulnerability is located within the search input template partial, where the application retrieves raw user inputs from the query parameters and renders them directly inside a raw-text script container without sanitization. An attacker can exploit this behavior by passing a crafted tag containing raw-text terminators, leading to code execution in the context of the victim's session.
An information disclosure vulnerability in the document serving subsystem of Wagtail CMS allows unauthorized users to verify if private documents match guessed SHA-1 hashes due to improper order of authentication checks.