VvvebJs SVG Upload Stored Cross-Site Scripting — CVE-2026-5615
by sahmsec (Sakib Ahmed) — [github.com/sahmsec](https://github.com/sahmsec) · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-5615
- Category
- web
- Affected product
- VvvebJs (drag-and-drop website builder)
- Affected versions
- <= 2.0.5
- Disclosed
- 2026-07-05
- Patch status
- unpatched
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-05-07 |
| Author / Researcher | sahmsec (Sakib Ahmed) — github.com/sahmsec |
| CVE / Advisory | CVE-2026-5615 |
| Category | web |
| Severity | High |
| CVSS Score | 8.5 (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N, per source repository) |
| Status | PoC |
| Tags | vvvebjs, stored-xss, svg-upload, file-upload, cms |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | VvvebJs (drag-and-drop website builder) |
| Versions Affected | <= 2.0.5 |
| Language / Platform | PHP (target application); PoC client written in Python 2 |
| Authentication Required | No — the PoC targets the public /upload.php endpoint directly; per the source repository the issue requires user interaction (UI:R) to trigger the stored payload in a victim’s browser |
| Network Access Required | Yes |
Summary
VvvebJs versions <= 2.0.5 allow uploading SVG files without sanitizing their contents. Because SVG is XML that can embed <script>-equivalent event handlers (e.g. onload), an attacker can upload an SVG containing JavaScript, which is stored server-side and served back from a publicly accessible upload path. When a victim (or the same attacker) later views the uploaded SVG in a browser, the embedded JavaScript executes in the site’s origin — a stored/persistent XSS. The PoC uploads such a crafted SVG to a list of targets and confirms exploitation by re-fetching the stored file and checking that the payload markup survived unmodified.
Vulnerability Details
Root Cause
The application’s upload handler (upload.php) accepts files with an image/svg+xml content type / .svg extension without stripping or sanitizing embedded script-capable attributes (such as the onload event handler on the root <svg> element). Because SVG is rendered by browsers as either an image or, when navigated to directly / embedded via certain contexts, as a scriptable document, unsanitized SVG content stored on the server and later served to a browser can execute arbitrary attacker-controlled JavaScript in the context of the hosting origin.
Attack Vector
- The PoC builds a multipart/form-data POST body containing an SVG payload:
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"><text ...></svg>. - It POSTs this file to
{target}/upload.php. - On a
200response, it parses the response body for the path of the newly stored.svgfile. - It issues a
GETto the resulting public URL and checks that the response contains the original filename marker and the exactonload="alert(document.domain)"markup, confirming the stored SVG is served back unsanitized. - In a real browser context, a victim visiting/opening that stored SVG URL would have the embedded
onloadJavaScript execute, demonstrating stored XSS.
Impact
An attacker can persist arbitrary JavaScript on a vulnerable VvvebJs installation via file upload. When a victim views the stored SVG, the script executes in the site’s origin, enabling session/cookie theft, CSRF-token exfiltration, defacement, or further pivoting depending on what the origin exposes to client-side script.
Environment / Lab Setup
Target: VvvebJs <= 2.0.5 web application exposing a reachable /upload.php endpoint.
Attacker: Python 2.7 with the `requests` library; a text file of target base URLs.
Proof of Concept
PoC Script
See
CVE-2026-5615.pyin this folder.CVE-2026-5615.txtin this folder is the example target list distributed with the original repository (bulk of URLs/IPs used for batch testing — see Notes).
| |
The script reads a list of target base URLs, uploads a crafted SVG with an onload="alert(document.domain)" payload to each target’s /upload.php via a thread pool (10 workers), then re-fetches the resulting stored URL to confirm the payload was stored and served unmodified. Successful targets are printed as Exploited and appended to SAHMSEC-CVE-2026-5615_Exploited.txt; other outcomes are reported as Not_Vulnerable, Cant_Access, or Time0ut.
Detection & Indicators of Compromise
POST /upload.php multipart/form-data; filename="expbySAHMSEC*.svg"; Content-Type: image/svg+xml
body contains: <svg ... onload="alert(document.domain)">
Signs of compromise:
- Uploaded
.svgfiles in web-accessible upload directories containingonload,onerror,<script>, or other event-handler/script content. - Unexpected outbound requests or
document.domain/ cookie access originating from pages that embed or link to user-uploaded SVGs. - Log entries showing POSTs to
/upload.phpwith SVG payloads from unfamiliar or automated-looking user agents.
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade VvvebJs to a patched version. No vendor patch version/commit confirmed as of 2026-07-05 in the source repository. |
| Interim mitigation | Disable or restrict SVG uploads; sanitize uploaded SVG content (strip <script>, event-handler attributes, and <foreignObject>); enforce strict MIME-type/extension validation server-side; serve uploaded files with a Content-Disposition: attachment header and a restrictive Content Security Policy; restrict public access to upload directories where possible. |
References
Notes
Mirrored from https://github.com/sahmsec/CVE-2026-5615 on 2026-07-05. The included CVE-2026-5615.txt target list is the example/batch target list shipped in the original repository; it is mirrored as-is for completeness but was not independently verified against each listed host.
| |