
SureForms <= 2.2.0 - अप्रमाणित संग्रहीत क्रॉस-साइट स्क्रिप्टिंग
SureForms प्लगइन में एक गंभीर Stored XSS भेद्यता मौजूद है। यह भेद्यता entries.js में एक असुरक्षित क्लाइंट-साइड कार्यान्वयन से उत्पन्न होती है, जहाँ उपयोगकर्ता इनपुट प्रोग्रामेटिक रूप से डिकोड (सर्वर-साइड सैनिटाइज़ेशन को उलटते हुए) किया जाता है और फिर उचित क्लाइंट-साइड सैनिटाइज़ेशन के बिना dangerouslySetInnerHTML का उपयोग करके प्रस्तुत किया जाता है। यह अप्रमाणित हमलावरों को WordPress के डिफ़ॉल्ट फ़िल्टर को दरकिनार करते हुए मानक फ़ॉर्म फ़ील्ड के माध्यम से दुर्भावनापूर्ण जावास्क्रिप्ट पेलोड इंजेक्ट करने की अनुमति देता है।
wp_ksesयह सत्यापित करने के लिए कि कोई लक्ष्य साइट SureForms चला रही है या नहीं, अनुवाद फ़ाइल हैडर का निरीक्षण करें जिसमें आमतौर पर संस्करण संख्या होती है।
लक्ष्य URL:
http://target-site.com/wp-content/plugins/sureforms/languages/sureforms.pot
सत्यापन कमांड:
curl -s "http://target-site.com/wp-content/plugins/sureforms/languages/sureforms.pot" | grep "Project-Id-Version"
यह भेद्यता React-आधारित एडमिन इंटरफ़ेस में निवास करती है जो फ़ॉर्म प्रविष्टियाँ देखने के लिए उपयोग होता है (entries.js)।
मिनिफ़ाइड entries.js फ़ाइल में, HTML एंटिटी को संभालने के लिए एक सहायक फ़ंक्शन (विश्लेषित बिल्ड में Xv के रूप में पहचाना गया) है।
कोड तर्क (पुनर्निर्मित):
// Function Xv: फ़ील्ड मानों का प्री-प्रोसेसिंग
var Xv = function(input) {
var value = input.value;
// भेद्यता का मूल कारण:
// यदि स्ट्रिंग में HTML एंटिटी हैं (जैसे <), तो एक textarea बनाएं,
// सामग्री इंजेक्ट करें, और मान निकालें।
// यह प्रभावी रूप से HTML एंटिटी को वापस रॉ HTML टैग में डिकोड करता है।
// उदाहरण: "<img ...>" बन जाता है ""
if (typeof value === "string" && value.match(/&[a-zA-Z0-9#]+;/)) {
var textarea = document.createElement("textarea");
textarea.innerHTML = value;
// सैनिटाइज़ेशन को उलटने का तर्क
if (textarea.value.includes("<") || textarea.value.includes(">")) {
value = textarea.value; // अब 'value' में रॉ HTML है
}
}
return { ...input, value: value };
}
विश्लेषण: यह फ़ंक्शन बैकएंड सुरक्षा को विफल कर देता है। भले ही WordPress <script> को डेटाबेस में <script> के रूप में सही ढंग से संग्रहीत करे, यह फ़ंक्शन API से लाने के तुरंत बाद इसे वापस <script> में बदल देता है।
डिकोडिंग के बाद, डेटा रेंडरिंग घटक (जिसे Jv के रूप में पहचाना गया) को पास किया जाता है।
कोड तर्क (पुनर्निर्मित):
// Function Jv: फ़ील्ड का रेंडरिंग
var Jv = function(props) {
var field = props.field;
var val = field.value; // यह मान अब रॉ HTML है (पोस्ट-डिकोडिंग)
// ट्रिगर: जाँचें कि क्या स्ट्रिंग HTML जैसी दिखती है
if (typeof val === "string" && val.match(/<[^>]+>/g)) {
// सिंक: क्लाइंट-साइड सैनिटाइज़ेशन (जैसे DOMPurify) के बिना dangerouslySetInnerHTML का उपयोग करके रेंडर करें
return React.createElement("span", {
dangerouslySetInnerHTML: { __html: val }
});
}
// गैर-HTML टेक्स्ट के लिए सुरक्षित रेंडर
return React.createElement("span", null, val);
}
इंजेक्शन: एक अप्रमाणित हमलावर फ्रंटएंड पर एक फ़ॉर्म सबमिट करता है। रॉ HTML टैग (जिन्हें WordPress बैकएंड द्वारा हटाया/सैनिटाइज़ किया जाएगा) का उपयोग करने के बजाय, हमलावर HTML एंटिटी भेजता है।
भंडारण: WordPress इनपुट (जैसे <img...) को सुरक्षित टेक्स्ट मानता है और डेटाबेस में संग्रहीत करता है।
निष्पादन (जाल):
Xv एंटिटी का पता लगाता है और <img... को वापस ` Entries पर जाएँ।विवरण देखने के लिए चरण 1 में सबमिट की गई प्रविष्टि पर क्लिक करें।
परिणाम: ब्राउज़र जावास्क्रिप्ट पेलोड (alert('XSS_SUREFORMS')) निष्पादित करेगा।