
प्रूफ-ऑफ-कॉन्सेप्ट जो Appsmith Table Widget में संग्रहीत XSS प्रदर्शित करता है, जो ऊर्ध्वाधर विशेषाधिकार वृद्धि और XSS-से-CSRF हमले के माध्यम से पूर्ण एडमिन अधिग्रहण की ओर ले जाता है।
Appsmith में संग्रहीत XSS (Stored XSS) के माध्यम से विशेषाधिकार वृद्धि का प्रूफ-ऑफ-कॉन्सेप्ट
प्रकटीकरण: मूल रूप से मेरे द्वारा GHSA-5hw4-whxv-6794 के माध्यम से रिपोर्ट किया गया
⚠️ केवल अधिकृत पेंटेस्टिंग/अनुसंधान उपयोग के लिए।
| फ़ील्ड | मान |
|---|---|
| CVE ID | CVE-2026-30862 |
| गंभीरता | 🔴 क्रिटिकल |
| CVSS स्कोर | 9.1 |
| CVSS वेक्टर | [CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H] |
| CWE | CWE-79, CWE-269, CWE-352 |
| प्रभावित उत्पाद | Appsmith ≤ 1.95 |
| पैच किया गया संस्करण | 1.96 |
| परामर्श | GHSA-5hw4-whxv-6794 |
टेबल विजेट (TableWidgetV2) में एक क्रिटिकल स्टोर्ड XSS भेद्यता मौजूद है। मूल कारण React कंपोनेंट रेंडरिंग पाइपलाइन में HTML सैनिटाइज़ेशन की कमी है, जिससे दुर्भावनापूर्ण एट्रिब्यूट्स को DOM में इंटरपोलेट किया जा सकता है। "Invite Users" सुविधा का लाभ उठाकर, एक नियमित उपयोगकर्ता खाते ([email protected]) वाला हमलावर सिस्टम एडमिनिस्ट्रेटर को उच्च-विशेषाधिकार वाला API कॉल (/api/v1/admin/env) निष्पादित करने के लिए बाध्य कर सकता है, जिसके परिणामस्वरूप पूर्ण प्रशासनिक खाता अधिग्रहण होता है।
1. मूल कारण: आउटपुट सैनिटाइज़ेशन सिंक की कमी यह भेद्यता टेबल विजेट के रेंडरिंग इंजन में निहित है
फ़ाइल: app/client/src/widgets/TableWidgetV2/component/cellComponents/BasicCell.tsx
BasicCell कंपोनेंट columnType को URL या Plain Text पर सेट होने पर डेटा को सैनिटाइज़ करने में विफल रहता है। यह कच्चे उपयोगकर्ता-आपूर्ति किए गए मान लौटाता है जो सीधे React चिल्ड्रन के रूप में रेंडर होते हैं, जिन्हें ब्राउज़र निष्पादन योग्य HTML के रूप में व्याख्या करता है।
भेद्य कोड स्निपेट (पंक्तियाँ 132-143 और 172-173):
const contentToRender = useMemo(() => {
switch (columnType) {
case ColumnTypes.URL:
// सैनिटाइज़ेशन के बिना 'url' का href में सीधा इंटरपोलेशन
return <a href={url} target="_blank">{value}</a>;
default:
return value; // पंक्ति 141: कच्चा मान लौटाया गया
}
}, [columnType, url, value]);
// पंक्ति 173: अंतिम सिंक जहां असैनिटाइज़्ड सामग्री DOM में इंजेक्ट की जाती है
<Content ref={contentRef}>{contentToRender}</Content>
2. हमला वेक्टर: सोशल इंजीनियरिंग के माध्यम से XSS-से-CSRF (Invite सुविधा) हालांकि SESSION कुकी HttpOnly द्वारा सुरक्षित है, XSRF-TOKEN document.cookie के माध्यम से सुलभ है। चूंकि Appsmith किसी भी उपयोगकर्ता को अपने ऐप में दूसरों को "Invite" करने की अनुमति देता है, एक हमलावर इसे एडमिन के सक्रिय सत्र के भीतर क्रॉस-प्रिविलेज रिक्वेस्ट फोर्जरी (CPRF) निष्पादित करने के लिए डिलीवरी तंत्र के रूप में उपयोग कर सकता है।
चरण 1: XSS भेद्यता सत्यापन
नियमित उपयोगकर्ता खाते से लॉग इन करें: [email protected]।
एक नया एप्लिकेशन बनाएं और एक टेबल विजेट जोड़ें।
टेबल डेटा प्रॉपर्टी में, निम्नलिखित इंजेक्ट करें:
[{ "id": 1, "payload": "" }]
-- चरण 2: हथियारीकरण (पूर्ण एडमिन अधिग्रहण)
[email protected] के रूप में, प्रशासनिक वातावरण को संशोधित करने के लिए डिज़ाइन किए गए निम्नलिखित पेलोड के साथ टेबल डेटा अपडेट करें:[
{
"id": 1,
"Status": "System Update Required",
"payload": "alert('Admin Privileges Granted to [email protected]'));\">"
}
]
सिस्टम एडमिनिस्ट्रेटर ([email protected]) को ऐप में आमंत्रित करने के लिए "Share" सुविधा का उपयोग करें। यह एडमिन को निमंत्रण खोलने पर दुर्भावनापूर्ण टेबल देखने के लिए बाध्य करता है।
एक बार एडमिन ऐप लॉन्च करता है, तो स्क्रिप्ट पृष्ठभूमि में निष्पादित होती है। यह एडमिन का XSRF-TOKEN पढ़ता है और [email protected] को प्रशासनिक व्हाइटलिस्ट में जोड़ने के लिए PUT अनुरोध भेजता है।
परिणाम: [email protected] के रूप में फिर से लॉग इन करें। अब आपके पास एडमिन सेटिंग्स और सभी इंस्टेंस कॉन्फ़िगरेशन तक पूर्ण पहुंच होगी।
भेद्यता प्रकार: स्टोर्ड XSS / वर्टिकल विशेषाधिकार वृद्धि।
गंभीरता: 9.1 (क्रिटिकल) | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
जोखिम: Appsmith इंस्टेंस का पूर्ण समझौता। हमलावरों को संवेदनशील पर्यावरण चर, डेटाबेस क्रेडेंशियल्स तक पहुंच मिलती है, और इंस्टेंस के भीतर किसी भी एप्लिकेशन को संशोधित करने की क्षमता मिलती है।
सिंक सैनिटाइज़ करें: BasicCell.tsx और संबंधित कंपोनेंट्स में सभी डायनामिक आउटपुट को DOMPurify.sanitize() के साथ लपेटें।
कठोर CSP: XSS पेलोड से प्रशासनिक एंडपॉइंट्स पर अनधिकृत API कॉल को रोकने के लिए एक सख्त connect-src नीति लागू करें।
https://github.com/user-attachments/assets/206a10e4-1619-4887-a552-99761baa0a29