Winter CMS, CSRF through AJAX Handler Names Reachable as Backend Page Actions, GHSA-p2ch-c2c3-4xm5 (Moderate) -DC-Aug2026-1717

Listen to this Post

Affected versions of Winter CMS allow a backend AJAX handler to be invoked by a plain top-level `GET` navigation with no CSRF token. The `Backend\Classes\Controller::actionExists()` method accepted any public method on a controller as a page action, meaning handler-shaped names (like `onFoo` or index_onFoo) were never reserved from URL dispatch.
An authenticated and authorized request to `/backend/system/eventlogs/index_onEmptyLog` reached the handler of the same name and truncated the system event log. Backend paths are routed through Route::any, and CSRF validation is skipped for HEAD, `GET` and `OPTIONS` requests. The default `SameSite=Lax` session cookie is sent on top-level cross-site navigation, so a link on an attacker-controlled page is sufficient — no form, no script and no token.
Handler arguments are taken from URL path segments, so the attacker also chooses the target record. Affected handlers across the backend, `cms` and `system` modules cover log truncation, resetting settings to their defaults, altering backend user state, and deleting CMS templates. None of them disclose data to the attacker or write attacker-controlled content, so the impact is destructive and state-changing rather than confidential.
To actively exploit this issue, an attacker would need no account of their own, but would need an authenticated backend user holding the relevant permission to follow an attacker-supplied link. The permissions guarding the affected handlers, `system.access_logs` included, are by default assigned only to the built-in Developer role.
The patch restricts page-action dispatch to all-lowercase method names, which reserves handler-shaped names from being reached by URL. AJAX dispatch is unchanged: handlers continue to work over `POST` with the `X-WINTER-REQUEST-HANDLER` header exactly as before. This fix includes a breaking change to backend action routing — a public controller method used as a page action must now be named in lowercase (coming_soon() rather than comingSoon()), and dashed URLs are normalised to snake_case. This security issue has been fixed in v1.2.14.

DailyCVE Form

Platform: Winter CMS
Version: < v1.2.14
Vulnerability: CSRF (CWE-352)
Severity: Moderate
Date: 2026-08-20

Prediction: Already patched (2026-08-20)

What Undercode Say:

Check current Winter CMS version
php artisan winter:version
Check if the session cookie SameSite attribute is set to Lax (default)
grep -i "same_site" config/session.php
Check the commit that fixes the issue
git show 353b23804dee2acf49fca996c72637040446824f

Exploit: (Educational Purposes!)

To demonstrate the vulnerability, an attacker could craft a link like:

<a href="https://target.com/backend/system/eventlogs/index_onEmptyLog">Click here</a>

If a logged-in backend user with the `system.access_logs` permission clicks this link, the system event log is truncated without any CSRF token validation. The attacker can also manipulate URL path segments to target specific records:

https://target.com/backend/cms/templates/onDeleteTemplate/1

This would delete CMS template with ID 1 if the victim has the necessary permissions.

Protection

1. Upgrade to v1.2.14 immediately:

composer update winter/wn-backend-module

2. If you cannot upgrade, apply the patch manually:

git cherry-pick 353b23804dee2acf49fca996c72637040446824f

3. As an interim mitigation, set `’same_site’ => ‘strict’` in config/session.php. A strict session cookie is not sent on cross-site top-level navigation, which prevents the victim’s session accompanying an attacker’s link. Review this against any single sign-on or inbound-link flows into your backend first, as it also affects legitimate cross-site entry.

Impact

The impact is destructive and state-changing rather than confidential. An attacker can:
– Truncate system event logs
– Reset settings to defaults
– Alter backend user states
– Delete CMS templates
No data is disclosed to the attacker, and no attacker-controlled content is written. An attacker needs no account of their own but requires an authenticated backend user with the relevant permissions to follow a link. The permissions are by default assigned only to the built-in Developer role.

🎯Let’s Practice Exploiting & Learn Patching For Free:

🎓 Live Courses & Certifications:

Join Undercode Academy for Verified Certifications

🚀 Request a Custom Project:

Secure, high-velocity infrastructure and disruptive technological engineering. Contact our engineering team for high-tier development and proprietary systems:
[email protected]
💎 Smart Architecture | 🛡️ Secure by Design | ⭐ Trusted by Thousands

Sources:

Reported By: github.com
Extra Source Hub:
Undercode

🔐JOIN OUR CYBER WORLD [ CVE News • HackMonitor • UndercodeNews ]

💬 Whatsapp | 💬 Telegram

📢 Follow DailyCVE & Stay Tuned:

𝕏 formerly Twitter 🐦 | @ Threads | 🔗 Linkedin Featured Image

Scroll to Top