flawopen.com/क्रॉस-साइट स्क्रिप्टिंग
क्रॉस-साइट स्क्रिप्टिंग
क्रॉस-साइट स्क्रिप्टिंग तब होती है जब कोई पेज किसी यूज़र के टेक्स्ट को इस तरह शामिल करता है कि ब्राउज़र उसे HTML या JavaScript की तरह पढ़े, और वह दूसरे यूज़र्स के लिए साइट के अपने अधिकार से चल जाए। सुधार हर जगह एक ही है: हर मान को ठीक उस जगह के अनुसार एनकोड करें जहाँ वह लिखा जाता है, जिन इक्का-दुक्का फ़ील्ड में HTML चाहिए उन्हें सैनिटाइज़ करें, और दोनों को Content Security Policy से मज़बूत करें। सटीक API, कमज़ोर और सुधरा कोड, और इसे पकड़ने वाले CI नियम देखने के लिए नीचे अपनी भाषा चुनें।
आसान भाषा में (ELI5)
एक अख़बार पाठकों के पत्र अपने ही पन्नों पर छापता है। एक पाठक ऐसा पत्र भेजता है जो बिल्कुल संपादक की सूचना जैसा सजाया गया है: 'ग्राहक इस नंबर पर फ़ोन करके सदस्यता नवीनीकरण के लिए अपने कार्ड की जानकारी बताएँ।' अख़बार के अपने फ़ॉन्ट में छपा होने से पाठक उस पर वैसे ही भरोसा करते हैं जैसे संपादक ने ख़ुद लिखा हो। XSS का मतलब है वेबसाइट का किसी विज़िटर के टेक्स्ट को अपने ही पेज में छाप देना, जहाँ ब्राउज़र उसे वेबसाइट का अपना कोड मानकर आपके खाते तक वेबसाइट की पहुँच के साथ चला देता है। एस्केपिंग हर पत्र को साफ़ चिह्नित उद्धरण-बॉक्स के अंदर छापना है, ताकि कोई भी पत्र संपादक की सूचना बनकर न निकल सके।
इस पेज के मुख्य शब्द
- Cross-site scripting (CWE-79)
- कोई वेब पेज अविश्वसनीय डेटा को ब्राउज़र के लिए निष्क्रिय किए बिना शामिल करता है, इसलिए उस डेटा का मार्कअप या स्क्रिप्ट पेज के origin में पार्स होकर चलता है, और DOM, cookies व API तक पहुँच पा लेता है।
- Reflected, stored and DOM-based XSS
- Reflected XSS रिक्वेस्ट का डेटा सीधे रिस्पॉन्स में लौटा देता है, आम तौर पर तैयार किए गए लिंक से। Stored XSS मान को सेव करके हर देखने वाले को परोसता है। DOM-based XSS सर्वर तक पहुँचता ही नहीं: क्लाइंट का JavaScript URL या storage से डेटा उठाकर
innerHTMLजैसे sink में डाल देता है। - Contextual output encoding
- हर आउटपुट संदर्भ की अपनी एनकोडिंग चाहिए: element टेक्स्ट और कोट वाले एट्रिब्यूट के लिए HTML entity, स्क्रिप्ट के अंदर JavaScript string escaping, URL पैरामीटर में percent-encoding, और
hrefवsrcके लिए scheme जाँच। स्क्रिप्ट के अंदर रखे मान को सिर्फ़ HTML-एनकोड करना काफ़ी नहीं है। - Sanitizing vs encoding
- एनकोडिंग मार्कअप को टेक्स्ट की तरह दिखाती है। जब यूज़र को फ़ॉर्मेटिंग भेजनी हो, तो HTML को अनुमति-सूची वाले सैनिटाइज़र (DOMPurify, bleach का उत्तराधिकारी nh3, OWASP Java HTML Sanitizer, HtmlSanitizer, ammonia) से गुज़ारें, जो मान्य टैग रखता है और स्क्रिप्ट, इवेंट हैंडलर व
javascript:URL हटा देता है। - Content Security Policy (CSP)
- एक रिस्पॉन्स header जो ब्राउज़र को बताता है कि कौन-सी स्क्रिप्ट चल सकती हैं।
'unsafe-inline'के बिना nonce-आधारितscript-srcएनकोडिंग की कोई चूक रह जाने पर भी ज़्यादातर डाली गई स्क्रिप्ट रोक देती है, औरrequire-trusted-types-for 'script'DOM sinks को बंद कर देता है।
हमले का चरण-दर-चरण प्रवाह
अविश्वसनीय टेक्स्ट पेज तक पहुँचता है
सर्च शब्द, प्रोफ़ाइल फ़ील्ड, टिप्पणी, URL fragment या API रिस्पॉन्स सर्वर पर पेज बनाते समय या ब्राउज़र में अपडेट करते समय शामिल किया जाता है।
वह सही एनकोडिंग के बिना लिखा जाता है
टेम्पलेट की एस्केपिंग बंद है, मान ऐसे स्क्रिप्ट या URL संदर्भ में जाता है जिसे HTML एस्केपिंग नहीं संभालती, या क्लाइंट कोड उसे innerHTML में रख देता है। हानिरहित टेस्ट मान <img src=x onerror=alert(1)> बिना बदले बचा रहता है।
ब्राउज़र उसे कोड की तरह पढ़ता है
पीड़ित का ब्राउज़र असली <img> एलिमेंट बनाकर onerror चलाता है, या क्लिक करने पर javascript: लिंक चला देता है।
स्क्रिप्ट वेबसाइट बनकर काम करती है
यह साइट के origin के साथ चलती है: पेज पढ़ सकती है, पीड़ित की cookies या टोकन से साइट के API बुला सकती है, यूज़र को दिखने वाली चीज़ें बदल सकती है और उसकी ओर से फ़ॉर्म भेज सकती है।
भाषा के अनुसार XSS गाइड
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- हर पेज को autoescaping चालू वाले टेम्पलेट इंजन से रेंडर करें, और हर छूट (
|safe,Html.Raw,dangerouslySetInnerHTML,raw,unsafe { },{!! !!}) की समीक्षा करें। - सटीक संदर्भ के लिए एनकोड करें: HTML टेक्स्ट और कोट वाले एट्रिब्यूट, JavaScript string, URL पैरामीटर; HTML या JavaScript को कभी स्ट्रिंग जोड़कर न बनाएँ।
- यूज़र के HTML को रेंडर होने की जगह पर किसी सक्रिय रूप से मेंटेन किए अनुमति-सूची सैनिटाइज़र से साफ़ करें।
- यूज़र के URL
href,srcया नेविगेशन तक पहुँचने से पहले उनमें सिर्फ़httpऔरhttpsकी अनुमति दें। 'unsafe-inline'के बिना nonce-आधारित Content-Security-Policy और साथ मेंX-Content-Type-Options: nosniffभेजें।- सेशन टोकन
localStorageके बजायHttpOnly,Secure,SameSite=Laxcookies में रखें।