Jun 15, 2026·7 min read·6 visits
A flaw in TYPO3's GeneralUtility::sanitizeLocalUrl allows attackers to bypass local URL verification. By passing URLs with backslashes, attackers trigger modern browser normalizations, redirecting users to external malicious domains.
CVE-2026-47347 is an open redirect vulnerability affecting multiple TYPO3 CMS versions. The issue resides in GeneralUtility::sanitizeLocalUrl, where an insufficient blocklist validation implementation fails to prevent browsers from normalizing malformed relative paths into external protocol-relative redirections. Attackers can exploit this to conduct phishing, session hijacking, or credential harvesting campaigns.
The TYPO3 Content Management System exposes an attack surface via input parameters that dictate downstream HTTP redirections. TYPO3 Core relies on the GeneralUtility::sanitizeLocalUrl function to ensure user-controlled destination strings are confined to safe, local directory paths. This function serves as the central control mechanism for preventing open redirect vectors across both core components and third-party extensions.
The core issue lies in the validation method's failure to address browser-level URL parsing and normalization behavior. While the utility is designed to validate relative paths, it incorrectly classifies structurally malformed strings as local paths. This discrepancy exposes applications to Open Redirect (CWE-601) exploits, where malicious external domains can be disguised as benign internal links.
An attacker can exploit this flaw to orchestrate highly targeted spearphishing or credential harvesting campaigns. Users clicking on a trusted link containing the bypass payload are silently redirected to a malicious destination. This degrades the perceived trustworthiness of the host application, facilitating secondary exploitation vectors.
The root cause of CVE-2026-47347 is a parser differential between the server-side validation logic and client-side web browser normalization rules. When processing an input URL, GeneralUtility::sanitizeLocalUrl historically used a simple blocklist strategy. It scanned the target string for only three characters: the newline (\n), carriage return (\r), and the null byte (\x00).
If these three characters were absent, the function assumed the path was safe to treat as local. It failed to validate the presence of other control characters, such as vertical tabs (\v), form feeds (\f), or backslash delimiters (\). PHP's native parsing and string operations did not treat a sequence starting with backslashes (e.g., \\evil.com) as a valid absolute URL, leading the application to classify it as a relative path.
Conversely, modern web browsers, following the WHATWG URL Living Standard, auto-normalize backslashes to forward slashes before making network requests. When a browser receives a Location: \\\\attacker.com HTTP response header, it normalizes the target to //attacker.com. The browser parses this as a protocol-relative URL and redirects the user's connection to the external domain, bypassing the application's intended restrictions.
Prior to the security patch, the vulnerable logic in typo3/sysext/core/Classes/Utility/GeneralUtility.php checked for forbidden control characters via strpbrk. It did not apply a structured character whitelist. This blocklist approach allowed any invalid characters not specified in the blocklist to flow to the redirection engine.
// Vulnerable Implementation
public static function sanitizeLocalUrl(string $url): string
{
$sanitizedUrl = '';
if (!empty($url)) {
// Only checks for basic newline, carriage return, and null bytes
if (strpbrk($url, "\n\r\x00") !== false) {
static::getLogger()->notice('URL "{url}" contains unexpected whitespace and was denied as local url.', ['url' => $url]);
return '';
}
// Downstream parsing continues, mistakenly allowing backslashes
...The patch introduces a strict RFC 3986 compliance check, switching the design paradigm from a blocklist to a robust whitelist. It defines an explicit array of allowed characters containing alphanumerics, unreserved characters, and valid percent-encoding or scheme-delimiting symbols.
// Patched Implementation
public static function sanitizeLocalUrl(string $url, ServerRequestInterface $req = null): string
{
$sanitizedUrl = '';
if (!empty($url)) {
$validUrlCharacters = [
// Percent-Encoding
'%',
// Reserved Characters (gen-delims & sub-delims)
':', '/', '?', '#', '[', ']', '@',
'!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=',
// Unreserved Characters (ALPHA & DIGIT)
'-', '.', '_', '~',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
];
// Remove all valid characters; if any remain, the URL is invalid
$hasInvalidCharacters = str_replace($validUrlCharacters, '', $url) !== '';
if ($hasInvalidCharacters) {
static::getLogger()->notice('The URL "{url}" contains unexpected characters and was denied as local url.', ['url' => $url]);
return '';
}By utilizing str_replace, the patched code effectively strips all legitimate URL characters from the input. If any character remains, the string contains illegal symbols such as backslashes or non-standard control characters. The function logs a notice and returns an empty string, completely preventing downstream execution of dangerous inputs.
Exploiting this vulnerability requires the presence of an endpoint that accepts a destination URL parameter and processes it via GeneralUtility::sanitizeLocalUrl before initiating a redirect. Standard vectors include authentication forms, language selection switches, or custom payment processing and back-to-origin flows.
An attacker crafts an exploitation vector by supplying a protocol-relative address masked with backslashes. For example, the input \\attacker-controlled-site.com is submitted as the return path. Since the server does not find any blocked control characters (\n, \r, or \x00), it allows the input to pass to the client browser via a Location header.
Other payload variants leverage mixed slashes and control characters to achieve the same result. Payloads such as \v//attacker-controlled-site.com or \x0c//attacker-controlled-site.com evade simplistic regex checks while inducing browser-level normalization. The visual structure of the target URL remains masked in the user's initial interface, decreasing the likelihood of detection prior to execution.
The severity of CVE-2026-47347 is rated as Medium with a CVSS v4.0 score of 5.3. Although it does not permit arbitrary code execution or direct compromise of local system files, the vulnerability significantly undermines the session integrity of application clients. An attacker can use the open redirect to masquerade external landing pages as trusted local modules.
This technique corresponds to MITRE ATT&CK technique T1566.002 (Spearphishing Link). Phishing filters and email security gateways often trust links targeting legitimate enterprise TYPO3 domains. By routing malicious links through the open redirect, attackers bypass automated detection, facilitating high-yield phishing and credential harvesting campaigns.
The EPSS score of 0.00484 indicates a low immediate probability of mass automated exploit campaigns, which is typical for open redirect vulnerabilities. However, because this vulnerability involves a core helper utility in TYPO3 CMS, any third-party extensions using sanitizeLocalUrl are equally exposed. Organizations should immediately prioritize patching to prevent targeted social engineering campaigns against their users.
The primary remediation path is upgrading the TYPO3 installation to the patched releases. The TYPO3 security team has released security updates covering all active LTS and ELTS branches. Administrators should verify their core versions match or exceed 10.4.57 ELTS, 11.5.51 ELTS, 12.4.46 ELTS, 13.4.31 LTS, or 14.3.3 LTS.
If immediate patching is unfeasible, administrators can deploy defensive rules at the Web Application Firewall (WAF) layer. Because the exploit relies on raw or percent-encoded backslashes in query parameters, rules can be configured to drop incoming requests containing these patterns. A sample ModSecurity rule targetting the URI arguments and detecting double backslashes looks like this:
SecRule ARGS "@rx (?i)(?:\\|%5c){2,}[a-z0-9]" "id:1000099,phase:2,deny,status:400,log,msg:'Potential CVE-2026-47347 Open Redirect Bypass Attempt'"
Additionally, network-level intrusion detection systems (IDS) can flag these exploitation attempts. A Snort rule focusing on the raw parameters within incoming HTTP request payloads can alert administrators to validation bypass attempts:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"TYPO3 sanitizeLocalUrl Open Redirect Bypass Attempt"; flow:established,to_server; content:"/alt_intro.php"; http_uri; content:"\\"; http_uri; sid:1000001; rev:1;)
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
TYPO3 CMS TYPO3 | < 10.4.57 | 10.4.57 ELTS |
TYPO3 CMS TYPO3 | 11.0.0 - 11.5.50 | 11.5.51 ELTS |
TYPO3 CMS TYPO3 | 12.0.0 - 12.4.45 | 12.4.46 ELTS |
TYPO3 CMS TYPO3 | 13.0.0 - 13.4.30 | 13.4.31 LTS |
TYPO3 CMS TYPO3 | 14.0.0 - 14.3.2 | 14.3.3 LTS |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-601 |
| Attack Vector | Network (AV:N) |
| CVSS v4.0 | 5.3 (Medium) |
| EPSS Score | 0.00484 |
| Exploit Status | None (No Public Exploit) |
| CISA KEV Status | Not Listed |
| Impact | Subsequent System Integrity (SI:L) |
The web application redirects the user to an untrusted external URL supplied by user input.
An authentication bypass in the SiYuan personal knowledge management system before version 3.7.0 exposes a dynamic icon rendering endpoint. This endpoint processes client-supplied Go template directives. By submitting a crafted request, an unauthenticated remote attacker can leverage registered database template functions to execute arbitrary read-only SQL queries and exfiltrate workspace contents.
CVE-2026-54069 is a critical authentication bypass vulnerability in the SiYuan Note personal knowledge management system. The flaw is located in the HTTP server's middleware handling API authorization, which unconditionally trusts requests carrying a 'chrome-extension://' scheme in the Origin HTTP header, granting administrative access without validating API tokens.
CVE-2026-54089 is a critical authentication bypass vulnerability in File Browser affecting instances configured with proxy-based authentication. An unauthenticated remote attacker with direct network access can impersonate arbitrary users or register new accounts by spoofing configured HTTP headers.
The malicious Cargo package 'exploration' was uploaded to the crates.io registry. During compilation or package import, the crate executes code designed to establish an outbound TCP/HTTP connection, download an external second-stage binary, and execute the binary locally on the host machine. This creates an unauthenticated remote code execution vector impacting developer environments and continuous integration pipelines.
CVE-2026-54088 is a critical command injection vulnerability in File Browser prior to version 2.63.6. When Hook Authentication is enabled, the application interpolates unsanitized credentials into a shell command, allowing unauthenticated remote code execution.
An authenticated remote code execution vulnerability exists in NotrinosERP (versions up to and including 1.0.0) within the Human Resource Management (HRM) module. Users with employee management permissions can upload arbitrary file types, including PHP scripts, which are written directly to a web-accessible directory. This allows for arbitrary code execution in the context of the web-server user.