CVE-2026-31859
published 2026-03-11CVE-2026-31859: Craft is a content management system (CMS). The fix for CVE-2025-35939 in craftcms/cms introduced a strip_tags() call in src/web/User.php to sanitize return…
PriorityP425medium6.1CVSS 3.1
AVNACLPRNUIRSCCLILAN
EPSS
0.18%
8.3th percentile
Craft is a content management system (CMS). The fix for CVE-2025-35939 in craftcms/cms introduced a strip_tags() call in src/web/User.php to sanitize return URLs before they are stored in the session. However, strip_tags() only removes HTML tags (angle brackets) -- it does not inspect or filter URL schemes. Payloads like javascript:alert(document.cookie) contain no HTML tags and pass through strip_tags() completely unmodified, enabling reflected XSS when the return URL is rendered in an href attribute. This vulnerability is fixed in 5.9.7 and 4.17.3.
Affected
4 ranges
| Vendor | Product | Version range | Fixed in |
|---|---|---|---|
| craftcms | cms | >= 4.15.3 < 4.17.3 | 4.17.3 |
| craftcms | cms | >= 5.7.5 < 5.9.7 | 5.9.7 |
| craftcms | craft_cms | >= 4.15.3 < 4.17.3 | 4.17.3 |
| craftcms | craft_cms | >= 5.7.5 < 5.9.7 | 5.9.7 |
CVSS provenance
nvdv3.16.1MEDIUMCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
nvdv4.06.9MEDIUMCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
ghsa6.9MEDIUM
osv6.9MEDIUM
Stop checking back — get the weekly exploitation signal.
Every Monday: what got weaponized or added to CISA KEV in the last seven days — each CVE cross-linked to its PoC, Nuclei template, and detection rule. Free, one email a week, unsubscribe in one click.
GHSA
CraftCMS vulnerable to reflective XSS via incomplete return URL sanitization
ghsa·2026-03-11·CVSS 6.9
CVE-2026-31859 [MEDIUM] CWE-116 CraftCMS vulnerable to reflective XSS via incomplete return URL sanitization
CraftCMS vulnerable to reflective XSS via incomplete return URL sanitization
### Summary
The fix for CVE-2025-35939 in `craftcms/cms` introduced a `strip_tags()` call in `src/web/User.php` to sanitize return URLs before they are stored in the session. However, `strip_tags()` only removes HTML tags (angle brackets) -- it does not inspect or filter URL schemes. Payloads like `javascript:alert(document.cookie)` contain no HTML tags and pass through `strip_tags()` completely unmodified, enabling reflected XSS when the return URL is rendered in an `href` attribute.
### Details
The patched code in is:
```php
public function setReturnUrl($url): void
{
parent::setReturnUrl(strip_tags($url));
}
```
`strip_tags()` removes HTML tags (e.g., ``, ``) from a string, but it is **not** a URL sanitizer
OSV
CraftCMS vulnerable to reflective XSS via incomplete return URL sanitization
osv·2026-03-11·CVSS 6.9
CVE-2026-31859 [MEDIUM] CraftCMS vulnerable to reflective XSS via incomplete return URL sanitization
CraftCMS vulnerable to reflective XSS via incomplete return URL sanitization
### Summary
The fix for CVE-2025-35939 in `craftcms/cms` introduced a `strip_tags()` call in `src/web/User.php` to sanitize return URLs before they are stored in the session. However, `strip_tags()` only removes HTML tags (angle brackets) -- it does not inspect or filter URL schemes. Payloads like `javascript:alert(document.cookie)` contain no HTML tags and pass through `strip_tags()` completely unmodified, enabling reflected XSS when the return URL is rendered in an `href` attribute.
### Details
The patched code in is:
```php
public function setReturnUrl($url): void
{
parent::setReturnUrl(strip_tags($url));
}
```
`strip_tags()` removes HTML tags (e.g., ``, ``) from a string, but it is **not** a URL sanitizer
No detection rules found.
No public exploits indexed.
2026-03-11
Published