
CVE-2026-9811 is a Stored Cross-Site Scripting (Stored XSS) vulnerability affecting Mautic 7 (versions 7.0.0 through 7.1.1).
CVE-2026-9811 एक संग्रहीत क्रॉस-साइट स्क्रिप्टिंग (Stored XSS) भेद्यता है जो Mautic 7 (संस्करण 7.0.0 से 7.1.1) को प्रभावित करती है। यह भेद्यता प्रोजेक्ट सिलेक्टर घटक में मौजूद है, जहाँ AJAX अनुरोध के माध्यम से लौटाए गए प्रोजेक्ट नाम उचित आउटपुट एन्कोडिंग या सैनिटाइज़ेशन के बिना पृष्ठ में डाले जाते हैं। प्रोजेक्ट बनाने की अनुमति वाला एक प्रमाणित उपयोगकर्ता प्रोजेक्ट नाम में एक दुर्भावनापूर्ण JavaScript पेलोड संग्रहीत कर सकता है। जब कोई अन्य व्यवस्थापक बाद में प्रोजेक्ट सिलेक्टर वाला एक एंटिटी एडिटर खोलता है, तो दुर्भावनापूर्ण स्क्रिप्ट उनके ब्राउज़र में निष्पादित होती है।
गुण मान उत्पाद Mautic प्रभावित संस्करण 7.0.0 – 7.1.1 स्थिर संस्करण 7.1.2 घटक प्रोजेक्ट सिलेक्टर भेद्यता प्रकार संग्रहीत क्रॉस-साइट स्क्रिप्टिंग (XSS)
एप्लिकेशन प्रमाणित उपयोगकर्ताओं द्वारा प्रदान किए गए प्रोजेक्ट नामों को संग्रहीत करता है और बाद में उन्हें AJAX एंडपॉइंट के माध्यम से पुनर्प्राप्त करता है। प्रोजेक्ट सिलेक्टर को रेंडर करते समय, एप्लिकेशन इन मानों को बिना एस्केपिंग या सैनिटाइज़ेशन के सीधे DOM में HTML विकल्प तत्वों के रूप में डालता है।
संकल्पनात्मक रूप से:
User creates project
│
▼
Project name stored in database
│
▼
AJAX returns project name
│
▼
Inserted into DOM without sanitization
│
▼
Browser executes embedded JavaScript
क्योंकि एप्लिकेशन संग्रहीत डेटा पर भरोसा करता है, दुर्भावनापूर्ण JavaScript तब निष्पादित होता है जब कोई अन्य विशेषाधिकार प्राप्त उपयोगकर्ता भेद्य पृष्ठ लोड करता है।
Attacker
│
▼
Creates a project with a malicious JavaScript payload as its name
│
▼
Payload is stored in the database
│
▼
Administrator opens an entity editor
│
▼
AJAX request retrieves project names
│
▼
Application inserts project name into the DOM without encoding
│
▼
Browser executes the malicious script
│
▼
Attacker gains actions within the administrator's session
प्रोजेक्ट बनाने की अनुमति वाला एक हमलावर एक ऐसा प्रोजेक्ट बनाता है जिसके नाम में एक दुर्भावनापूर्ण JavaScript पेलोड होता है।
बाद में, एक व्यवस्थापक किसी अन्य एंटिटी को संपादित करता है जिसमें प्रोजेक्ट सिलेक्टर शामिल है। सिलेक्टर AJAX के माध्यम से प्रोजेक्ट नाम लोड करता है और उन्हें सीधे पृष्ठ में डालता है। चूँकि प्रोजेक्ट नाम सैनिटाइज़ नहीं किया गया है, ब्राउज़र एम्बेडेड स्क्रिप्ट को व्यवस्थापक के विशेषाधिकारों के साथ निष्पादित करता है।
कल्पना करें कि Mautic में इस प्रकार का एक फ़ॉर्म है:
POST /projects/create HTTP/1.1
Content-Type: application/x-www-form-urlencoded
projectName=Marketing Campaign
description=Email Campaign
प्रोजेक्ट इस प्रकार सहेजा गया है:
Marketing Campaign
चरण 2: हमलावर एक प्रोजेक्ट बनाता है
सामान्य नाम के बजाय, हमलावर एक हानिरहित JavaScript इवेंट वाला HTML दर्ज करता है:
POST /projects/create HTTP/1.1
Content-Type: application/x-www-form-urlencoded
projectName=<img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
description=Test
डेटाबेस अब ठीक वही स्ट्रिंग संग्रहीत करता है।
चरण 3: AJAX संग्रहीत मान लौटाता है
बाद में, एक व्यवस्थापक एक ऐसा पृष्ठ खोलता है जो प्रोजेक्ट लोड करता है।
AJAX प्रतिक्रिया:
{
"id": 7,
"projectName": ""
}
चरण 4: भेद्य JavaScript
मान लीजिए कि एप्लिकेशन यह करता है:
const project = response.projectName;
document.getElementById("projects").innerHTML +=
`<option>${project}</option>`;
ब्राउज़र यह देखता है:
<option>
<img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
</option>
चूँकि एप्लिकेशन ने स्ट्रिंग को टेक्स्ट के बजाय HTML के रूप में डाला, ब्राउज़र इसे एक वास्तविक तत्व के रूप में पार्स करता है। छवि लोड होने में विफल रहती है (src="x"), जिससे onerror हैंडलर निष्पादित हो जाता है।
सफल शोषण एक हमलावर को निम्नलिखित की अनुमति दे सकता है:
| मीट्रिक | स्कोर |
|---|---|
| CVSS v3.1 (CNA) | 5.4 (मध्यम) |
NVD ने अभी तक इस CVE के लिए अपना स्वयं का CVSS मूल्यांकन प्रकाशित नहीं किया है।
नोट: विक्रेता ने सटीक भेद्य स्रोत कोड प्रकाशित नहीं किया है। निम्नलिखित उदाहरण केवल भेद्यता पैटर्न को दर्शाता है।
// Data returned from AJAX
const project = response.projectName;
// Unsafe: inserted directly into the DOM
document.getElementById("projectSelector").innerHTML +=
`<option>${project}</option>`;
प्रोजेक्ट नाम उपयोगकर्ता इनपुट से उत्पन्न होता है लेकिन HTML एन्कोडिंग के बिना पृष्ठ में डाला जाता है। यदि संग्रहीत मान में HTML या JavaScript है, तो ब्राउज़र इसे सादे टेक्स्ट के बजाय निष्पादन योग्य सामग्री के रूप में व्याख्या करता है।
const option = document.createElement("option");
// Safe: assign as text, not HTML
option.textContent = response.projectName;
document.getElementById("projectSelector").appendChild(option);
या, यदि HTML आउटपुट अपरिहार्य है, तो डालने से पहले उचित आउटपुट एन्कोडिंग सुनिश्चित करें।
textContent (या एक समतुल्य सुरक्षित API) का उपयोग यह सुनिश्चित करता है कि किसी भी विशेष वर्ण को निष्पादन योग्य HTML या JavaScript के बजाय सादे टेक्स्ट के रूप में माना जाए। भले ही एक दुर्भावनापूर्ण प्रोजेक्ट नाम डेटाबेस में संग्रहीत हो, इसे निष्पादित किए जाने के बजाय शाब्दिक रूप से प्रदर्शित किया जाएगा।