CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-HQ84-X37P-J6Q5

GHSA-HQ84-X37P-J6Q5: Reflected Cross-Site Scripting in Winter CMS Backend Table Widget

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 21, 2026·5 min read·1 visit

Executive Summary (TL;DR)

Unsanitized user query parameters reflected inside an HTML script template block allow attackers to terminate the container early and execute arbitrary JavaScript in the victim's browser session.

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.

Vulnerability Overview

The vulnerability affects the backend Table widget component in Winter CMS. This component is responsible for rendering interactive data grids, complete with search, filtering, and sorting utilities, which administrative users access inside the control panel.

The attack surface exists in the search input element located at modules/backend/widgets/table/partials/_table.php. Because this input is part of a template that is processed dynamically on the client side, the developers enclosed the markup in a script element of type text/template.

By leveraging the unique parsing rules that browsers apply to raw-text HTML elements, an unauthenticated attacker can craft a malicious hyperlink that targets this endpoint. If an authenticated administrator visits the link, arbitrary script commands run in their browser context, compromising the administrative session.

Root Cause Analysis

The root cause of this vulnerability lies in the combination of raw parameter reflection and browser HTML tokenization rules. The application retrieves the value of the search GET query parameter directly via the get('search') helper and embeds it into the value attribute of an HTML input tag.

To prevent the browser from rendering the toolbar controls on page load before the JavaScript framework initializes, the entire block is enclosed inside <script type="text/template">. According to the HTML5 specifications, <script> tags are treated as Raw Text Elements.

When the browser's parser encounters a Raw Text Element, it switches to the Script Data State. In this state, the parser does not recognize standard HTML attributes, single quotes, or double quotes as value boundaries. Instead, it scans the character stream exclusively for the literal ending sequence </script>. When an attacker passes a payload containing </script> inside the query string, the parser matches this sequence, closes the initial template block early, and treats the remaining payload as executable code.

Code Analysis and Comparative Diff

The vulnerable code path is situated in the table partial file. Reviewing the difference between the vulnerable and patched versions highlights how the vulnerability was introduced and resolved.

Below is the code before the patch:

<!-- Vulnerable Code -->
<input 
    placeholder="<?= e(trans('backend::lang.list.search_prompt')) ?>"
    name="search"
    id="search"
    value="<?= get('search') ?>"
    type="text"
    autocomplete="off"
    class="table-search-input form-control icon search" />

In the block above, get('search') retrieves the raw parameter and emits it directly. Below is the code after the patch:

<!-- Patched Code -->
<input 
    placeholder="<?= e(trans('backend::lang.list.search_prompt')) ?>"
    name="search"
    id="search"
    value="<?= e(get('search')); ?>"
    type="text"
    autocomplete="off"
    class="table-search-input form-control icon search" />

The patch routes the output through the e() helper function, which runs htmlspecialchars() under the hood. This converts dangerous characters such as < and > into their equivalent HTML entities (&lt; and &gt;). When the browser's parser scans the script block, it sees &lt;/script&gt; instead of the literal closing sequence, preventing the early termination of the raw-text element.

Exploitation Methodology

Exploitation requires targeting an administrative user who has access to the backend table interface. The attacker must construct a URL that points to a backend controller utilizing the table widget and includes the malicious payload in the query string.

A verified exploitation payload uses the raw-text terminator sequence combined with a secondary script block:

</script><script>alert(document.cookie)</script>

When encoded and appended to the target URL, the full request looks as follows:

https://example.com/backend/acme/plugin/items?search=%3C%2Fscript%3E%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E

Once the administrator loads this link, the browser tokenizes the response, terminates the template block at the first occurrence of </script>, and executes the secondary script block immediately, allowing the attacker to read the session cookie or perform actions on behalf of the administrator.

Impact Assessment

The impact of this vulnerability is classified as Medium, reflecting the classic risks associated with session hijacking and client-side privilege escalation. Because the payload executes within the administrative console of Winter CMS, the script runs with the authorization level of the logged-in administrator.

An attacker exploiting this vulnerability can perform unauthorized state modifications, steal session identifiers, or inject persistent backdoors into other sections of the content management system.

The vector breakdown under CVSS v3.1 is CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N. While exploitation requires user interaction to click the crafted link, the lack of prior authorization requirements and the potential for complete control over the CMS backend emphasize the need for immediate remediation.

Remediation and Mitigation

To fully resolve the vulnerability, administrators must update Winter CMS to version v1.2.14 or higher. This update applies the escaping helper systematically across the affected templates.

If an immediate upgrade of the framework is not feasible, the vulnerability can be mitigated manually by applying the patch to the template partial at modules/backend/widgets/table/partials/_table.php on line 44. Ensure that the raw call to get('search') is wrapped inside the escaping helper e() as shown in the code analysis.

In addition, deploying a Web Application Firewall (WAF) with rules that detect and block raw closing HTML tags inside URL parameters can act as a temporary workaround until the patch is successfully applied.

Fix Analysis (1)

Technical Appendix

CVSS Score
6.1/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N

Affected Systems

Winter CMS Core

Affected Versions Detail

Product
Affected Versions
Fixed Version
winter
wintercms
< 1.2.141.2.14
AttributeDetail
CWE IDCWE-79
Attack VectorNetwork
CVSS Score6.1 (Medium)
Exploit StatusProof of Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1059Command and Scripting Interpreter
Execution
T1189Drive-by Compromise
Initial Access
CWE-79
Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

The product does not sanitize or incorrectly sanitizes user-controlled input before it is placed in output that is used as a web page that is served to other users.

References & Sources

  • [1]Fix Commit 1b6397654124fb44a6abf6f3782b6a1d746cef14

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•1 minute ago•GHSA-5CWR-5JXG-PCF6
8.4

GHSA-5CWR-5JXG-PCF6: Stored Cross-Site Scripting via Improper Cache Sanitization in Winter CMS Custom Styles

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.

Amit Schendel
Amit Schendel
0 views•6 min read
•about 1 hour ago•GHSA-P2CH-C2C3-4XM5
8.8

GHSA-P2CH-C2C3-4XM5: Cross-Site Request Forgery in Winter CMS AJAX Routing

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.

Amit Schendel
Amit Schendel
0 views•4 min read
•about 3 hours ago•GHSA-92HV-J533-69WC
3.7

GHSA-92HV-J533-69WC: Information Disclosure via ETag Conditional Matching in Wagtail CMS

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.

Amit Schendel
Amit Schendel
2 views•7 min read
•about 4 hours ago•GHSA-C2XX-CJMH-9Q8F
5.3

GHSA-C2XX-CJMH-9Q8F: Information Disclosure via Inherited Collection View Restriction Bypass in Wagtail API v2

An improper access control vulnerability in Wagtail's Documents and Images API V2 allows unauthenticated remote attackers to retrieve metadata (including titles and filenames) of files residing inside descendant collections of private parent collections, bypassing inherited view restrictions.

Amit Schendel
Amit Schendel
1 views•6 min read
•about 5 hours ago•GHSA-X5CX-W6P2-MXF2
6.5

GHSA-X5CX-W6P2-MXF2: Improper Permission Handling in Wagtail Snippet Copy Functionality

An authorization bypass vulnerability in Wagtail CMS allows authenticated users with snippet creation privileges ('add') to access and view the contents of restricted snippet instances for which they lack viewing or editing permissions. By invoking the copy endpoint, the application pre-populates form data with the properties of the source snippet, exposing sensitive information to unauthorized users.

Alon Barad
Alon Barad
4 views•6 min read
•about 10 hours ago•GHSA-JM5P-837G-RV8G
6.5

GHSA-JM5P-837G-RV8G: Insecure Direct Object Reference (IDOR) in Wagtail Page Translation Endpoint

An authenticated user with global translation permissions can exploit a missing authorization check on the page translation endpoint in Wagtail CMS. This allows the attacker to copy and view pages they do not have explicit edit or explore access to.

Alon Barad
Alon Barad
4 views•7 min read