diff --git a/pentesting-web/cors-bypass.md b/pentesting-web/cors-bypass.md index c18ddc898..2e05fc32b 100644 --- a/pentesting-web/cors-bypass.md +++ b/pentesting-web/cors-bypass.md @@ -16,13 +16,13 @@ HackTricks का समर्थन करने के अन्य तरी ## CORS क्या है? -क्रॉस-ऑरिजिन रिसोर्स शेयरिंग (CORS) मानक **सर्वरों को उनके एसेट्स तक कौन पहुंच सकता है** और **बाहरी स्रोतों से कौन से HTTP अनुरोध विधियाँ परमिट की जा सकती हैं** को परिभाषित करने की अनुमति देता है। +Cross-Origin Resource Sharing (CORS) मानक **सर्वरों को उनके संपत्तियों तक कौन पहुंच सकता है** और **किस HTTP अनुरोध विधियों की अनुमति है** यह परिभाषित करने की अनुमति देता है। -एक **समान-उत्पत्ति** नीति एक नियम है जो कहता है कि एक **सर्वर जो** एक संसाधन का अनुरोध कर रहा है और संसाधन को **होस्ट करने वाला सर्वर** एक ही प्रोटोकॉल (जैसे, `http://`), डोमेन नाम (जैसे, `internal-web.com`), और **पोर्ट** (जैसे, 80) साझा करते हों। इस नीति के तहत, केवल वेब पेज जो एक ही डोमेन और पोर्ट से हैं, उन्हें संसाधनों तक पहुंचने की अनुमति है। +एक **समान-मूल** नीति एक ऐसी **सर्वर को अनुरोध करने** की अनुमति देती है जो संपत्ति को होस्ट कर रहा है **साझा प्रोटोकॉल (जैसे, `http://`), डोमेन नाम (जैसे, `internal-web.com`), और पोर्ट (जैसे, 80)** को साझा करता है। इस नीति के तहत, केवल वेब पृष्ठ जिनका डोमेन और पोर्ट समान हैं को संपत्तियों तक पहुंचने की अनुमति है। -`http://normal-website.com/example/example.html` के संदर्भ में समान-उत्पत्ति नीति का अनुपालन निम्नलिखित रूप में है: +`http://normal-website.com/example/example.html` के संदर्भ में समान-मूल नीति का अनुपालन निम्नलिखित रूप में है: -| एक्सेस किया गया URL | एक्सेस की अनुमति? | +| URL तक पहुंचा गया | पहुंच की अनुमति? | | ----------------------------------------- | --------------------------------------- | | `http://normal-website.com/example/` | हाँ: एकसमान योजना, डोमेन, और पोर्ट | | `http://normal-website.com/example2/` | हाँ: एकसमान योजना, डोमेन, और पोर्ट | @@ -31,17 +31,17 @@ HackTricks का समर्थन करने के अन्य तरी | `http://www.normal-website.com/example/` | नहीं: विभिन्न डोमेन | | `http://normal-website.com:8080/example/` | नहीं: विभिन्न पोर्ट\* | -\*इंटरनेट एक्सप्लोरर समान-उत्पत्ति नीति को प्रवर्तित करते समय पोर्ट नंबर को नजरअंदाज करता है, इसलिए यह पहुंच की अनुमति देता है। +\*इंटरनेट एक्सप्लोरर समान-मूल नीति को प्रवर्तित करते समय पोर्ट नंबर को नजरअंदाज करता है, इसलिए यह पहुंच की अनुमति देता है। ### `Access-Control-Allow-Origin` हेडर -यह हेडर **कई मूल्यों**, एक **`null`** मान, या वाइल्डकार्ड **`*`** की अनुमति दे सकता है। हालांकि, **कोई भी ब्राउज़र कई मूल्यों का समर्थन नहीं करता**, और वाइल्डकार्ड `*` का उपयोग **सीमाओं** के अधीन है। (वाइल्डकार्ड केवल अकेले उपयोग किया जाना चाहिए, और इसका उपयोग `Access-Control-Allow-Credentials: true` के साथ नहीं किया जा सकता है।) +यह हेडर **कई मूल्यों की अनुमति** दे सकता है, एक **`null`** मूल्य, या एक वाइल्डकार्ड **`*`**। हालांकि, **कोई भी ब्राउज़र कई मूल्यों का समर्थन नहीं करता**, और वाइल्डकार्ड `*` का उपयोग **सीमाओं** के अधीन है। (वाइल्डकार्ड केवल अकेले उपयोग किया जाना चाहिए, और इसका उपयोग `Access-Control-Allow-Credentials: true` के साथ नहीं किया जा सकता है।) -यह हेडर **सर्वर द्वारा जारी** किया जाता है एक क्रॉस-डोमेन संसाधन अनुरोध का प्रतिसाद देने के लिए जिसे एक वेबसाइट ने प्रारंभ किया है, जिसमें ब्राउज़र स्वचालित रूप से एक `Origin` हेडर जोड़ता है। +यह हेडर **सर्वर द्वारा जारी** किया जाता है एक वेबसाइट द्वारा प्रारंभित एक क्रॉस-डोमेन संपत्ति अनुरोध के प्रतिसाद में, जिसमें ब्राउज़र स्वचालित रूप से एक `Origin` हेडर जोड़ता है। ### `Access-Control-Allow-Credentials` हेडर -**डिफ़ॉल्ट** रूप से, क्रॉस-ऑरिजिन अनुरोध कुकीज़ या ऑथराइजेशन हेडर जैसे क्रेडेंशियल के बिना किए जाते हैं। फिर भी, जब क्रॉस-डोमेन सर्वर क्रेडेंशियल भेजते हैं, तो `Access-Control-Allow-Credentials` हेडर को **`true`** पर सेट करके उत्तर की पठनीयता की अनुमति दे सकता है। +**डिफ़ॉल्ट** रूप से, क्रॉस-मूल्य अनुरोध कुकीज़ या ऑथराइजेशन हेडर जैसे क्रेडेंशियल के बिना किए जाते हैं। फिर भी, जब क्रेडेंशियल भेजे जाते हैं तो क्रॉस-डोमेन सर्वर `Access-Control-Allow-Credentials` हेडर को **`true`** पर सेट करके प्रतिक्रिया को पढ़ने की अनुमति दे सकता है। अगर `true` पर सेट किया जाता है, तो ब्राउज़र क्रेडेंशियल (कुकीज़, ऑथराइजेशन हेडर, या TLS क्लाइंट सर्टिफिकेट) प्रेषित करेगा। ```javascript @@ -72,9 +72,15 @@ xhr.send('Arun'); ``` ### CSRF पूर्व-उड़ान अनुरोध -### पार-डोमेन संचार में पूर्व-उड़ान अनुरोध को समझना +### पार-डोमेन संचार में पूर्व-उड़ान अनुरोध की समझ -विशेष परिस्थितियों के तहत पार-डोमेन अनुरोध प्रारंभ करते समय, जैसे कि **सामान्य HTTP विधि का उपयोग न करना** (HEAD, GET, POST के अलावा कुछ भी), नए **हेडर** शामिल करना, या विशेष **Content-Type हेडर मान** का उपयोग करना, तो एक पूर्व-उड़ान अनुरोध की आवश्यकता हो सकती है। यह प्रारंभिक अनुरोध, **`OPTIONS`** विधि का उपयोग करते हुए, सर्वर को आगामी पार-स्रोत अनुरोध की इच्छाओं की सूचना देने के लिए होता है, जिसमें उपयोग करने वाली HTTP विध +विशेष परिस्थितियों के तहत पार-डोमेन अनुरोध प्रारंभ करते समय, जैसे कि **गैर-मानक HTTP विधि** (HEAD, GET, POST के अलावा कुछ भी), नए **हेडर** शामिल करना, या विशेष **Content-Type हेडर मान** का उपयोग करना, तो एक पूर्व-उड़ान अनुरोध की आवश्यकता हो सकती है। यह प्रारंभिक अनुरोध, **`OPTIONS`** विधि का उपयोग करते हुए, सर्वर को आगामी पार-स्रोत अनुरोध की इच्छाओं की सूचना देने के लिए होता है, जिसमें उपयोग करने वाली HTTP विधियाँ और हेडर शामिल हैं। + +**क्रॉस-उत्सर्जन संसाधन साझेदारी (CORS)** प्रोटोकॉल इस पूर्व-उड़ान जांच को अनिवार्य बनाता है ताकि अनुरोधित पार-स्रोत कार्रवाई की संभावना का निर्धारण कर सके, जिसमें स्वीकृत विधियाँ, हेडर और मूल्यांकन की विश्वसनीयता की जांच की जाती है। पूर्व-उड़ान अनुरोध की आवश्यकता से बचने के लिए कौन-कौन सी परिस्थितियाँ हैं, उसके लिए [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) द्वारा प्रदान की गई व्यापक गाइड का संदर्भ दें। + +यह महत्वपूर्ण है कि **पूर्व-उड़ान अनुरोध की अनुपस्थिति जवाब में प्राधिकरण हेडर ले जाने की आवश्यकता को नहीं खारिज करती**। इन हेडर्स के बिना, ब्राउज़र को पार-स्रोत अनुरोध से प्रतिक्रिया प्रसंस्करण करने में असमर्थ हो जाता है। + +`PUT` विधि का उपयोग करने और `Special-Request-Header` नामक एक कस्टम हेडर का उपयोग करने के लिए एक पूर्व-उड़ान अनुरोध का निमायत चित्रण ध्यान में रखें: ``` OPTIONS /info HTTP/1.1 Host: example2.com @@ -83,7 +89,7 @@ Origin: https://example.com Access-Control-Request-Method: POST Access-Control-Request-Headers: Authorization ``` -जवाब में, सर्वर स्वीकृत मेथड को दर्शाने वाले हेडर्स, अनुमति प्रारंभ और अन्य CORS नीति विवरण देने के लिए हो सकता है, जैसा नीचे दिखाया गया है: +जवाब में, सर्वर स्वीकृत मेथड की सूचना, अनुमति प्रारंभ, और अन्य CORS नीति विवरण दिखा सकता है, जैसा नीचे दिखाया गया है: ```markdown HTTP/1.1 204 No Content ... @@ -93,12 +99,22 @@ Access-Control-Allow-Headers: Authorization Access-Control-Allow-Credentials: true Access-Control-Max-Age: 240 ``` -* **`Access-Control-Allow-Headers`**: यह हेडर निर्दिष्ट करता है कि वास्तविक अनुरोध के दौरान कौन से हेडर्स का उपयोग किया जा सकता है। यह सर्वर द्वारा सेट किया जाता है ताकि उससे स्पष्ट हो कि क्लाइंट से अनुरोधों में कौन से हेडर्स अनुमति दी जा रही है। -* **`Access-Control-Expose-Headers`**: इस हेडर के माध्यम से, सर्वर क्लाइंट को सूचित करता है कि कौन से हेडर्स को साधारित प्रतिक्रिया के हिस्से के रूप में उजागर किया जा सकता है। -* **`Access-Control-Max-Age`**: यह हेडर दर्शाता है कि पूर्व-उड़ान अनुरोध के परिणाम को कितनी देर तक कैश किया जा सकता है। सर्वर उस सबसे अधिक समय को सेट करता है, सेकंड में, जिसके द्वारा पूर्व-उड़ान अनुरोध द्वारा वापस दी गई जानकारी का पुनः उपयोग किया जा सकता है। -* **`Access-Control-Request-Headers`**: पूर्व-उड़ान अनुरोधों में उपयोग किया जाता है, यह हेडर क्लाइंट द्वारा सेट किया जाता है ताकि सर्वर को सूचित करें कि वास्तविक अनुरोध में कौन से HTTP हेडर्स क्लाइंट उपयोग करना चाहता है। -* **`Access-Control-Request-Method`**: यह हेडर, पूर्व-उड़ान अनुरोधों में भी उपयोग किया जाता है, यह हेडर क्लाइंट द्वारा सेट किया जाता है ताकि वास्तविक अनुरोध में कौन सा HTTP विधि उपयोग किया जाएगा, इसका संकेत देने के लिए। -* **`Origin`**: यह हेडर ब्राउज़र द्वारा स्वचालित रूप से सेट किया जाता है और पार-मूल संवाद की मूल स्थान को दर्शाता है। यह सर्वर द्वारा उपयोग किया जाता है ताकि आगंतुक के आगमन अनुरोध को यह निर्धारित करने के लिए कि क्या आने वाला अनुरोध अनुमति देना चाहिए या इसे नकारना चाहिए, CORS नीति के आधार पर। +* **`Access-Control-Allow-Headers`**: यह हेडर निर्दिष्ट करता है कि वास्तविक अनुरोध के दौरान कौन से हेडर्स का उपयोग किया जा सकता है। यह सर्वर द्वारा सेट किया जाता है ताकि उससे स्पष्ट हो कि क्लाइंट से अनुरोधों में कौन से हेडर्स अनुमति दी जाती है। +* **`Access-Control-Expose-Headers`**: इस हेडर के माध्यम से, सर्वर क्लाइंट को सूचित करता है कि कौन से हेडर्स को साधारित प्रतिक्रिया के हिस्से के रूप में प्रकट किया जा सकता है। +* **`Access-Control-Max-Age`**: यह हेडर यह दर्शाता है कि पूर्व-उड़ान अनुरोध के परिणाम को कितनी देर तक कैश किया जा सकता है। सर्वर उस सबसे अधिक समय को सेट करता है, सेकंड में, जिसके द्वारा पूर्व-उड़ान अनुरोध द्वारा वापस दी गई जानकारी का पुनः उपयोग किया जा सकता है। +* **`Access-Control-Request-Headers`**: पूर्व-उड़ान अनुरोधों में उपयोग किया जाता है, यह हेडर क्लाइंट द्वारा वास्तविक अनुरोध में कौन से HTTP हेडर्स का उपयोग करना चाहता है, उसे सर्वर को सूचित करने के लिए सेट किया जाता है। +* **`Access-Control-Request-Method`**: यह हेडर, पूर्व-उड़ान अनुरोधों में भी उपयोग किया जाता है, यह हेडर क्लाइंट द्वारा वास्तविक अनुरोध में कौन सा HTTP विधि उपयोग किया जाएगा, इसे सेट करने के लिए। +* **`Origin`**: यह हेडर ब्राउज़र द्वारा स्वचालित रूप से सेट किया जाता है और पार-मूल में अनुरोध के मूल को दर्शाता है। यह सर्वर द्वारा उपयोग किया जाता है ताकि आगंतुक के आगमन को मूल्यांकन करें कि क्या आने वाला अनुरोध अनुमति दी जानी चाहिए या नहीं, CORS नीति के आधार पर। + +कृपया ध्यान दें कि सामाग्री-प्रकार और हेडर सेट करने के आधार पर आम तौर पर **GET/POST अनुरोध भेजा जाता है** (अनुरोध **सीधे** भेजा जाता है), लेकिन यदि आप **प्रतिक्रिया के हेडर्स/शरीर तक पहुंचना चाहते हैं**, तो इसमें एक _Access-Control-Allow-Origin_ हेडर शामिल होना चाहिए।\ +**इसलिए, CORS CSRF के खिलाफ सुरक्षा उपाय नहीं है (लेकिन यह सहायक हो सकता है)**. + +### **स्थानीय नेटवर्क अनुरोध पूर्व-उड़ान अनुरोध** + +1. **`Access-Control-Request-Local-Network`**: यह हेडर क्लाइंट के अनुरोध में शामिल किया जाता है ताकि संदेश दिया जा सके कि जांच एक स्थानीय नेटवर्क संसाधन की ओर है। यह सर्वर को सूचित करने के लिए एक मार्कर के रूप में काम करता है कि अनुरोध स्थानीय नेटवर्क से उत्पन्न है। +2. **`Access-Control-Allow-Local-Network`**: प्रतिक्रिया में, सर्वर इस हेडर का उपयोग करता है ताकि संबंधित संसाधन को स्थानीय नेटवर्क के बाहरी इकाइयों के साथ साझा किया जा सके। यह विभिन्न नेटवर्क सीमाओं के बाहर संसाधनों को साझा करने के लिए हरी झंडी के रूप में काम करता है, सुरक्षा प्रोटोकॉल बनाए रखते हुए। + +**स्थानीय नेटवर्क अनुरोध को अनुमति देने वाला एक वैध प्रतिक्रिया** में भी होना चाहिए जिसमें प्रतिक्रिया में हेडर `Access-Controls-Allow-Local_network: true` भी होना चाहिए: ``` HTTP/1.1 200 OK ... @@ -110,22 +126,22 @@ Content-Length: 0 ... ``` {% hint style="warning" %} -ध्यान दें कि लिनक्स **0.0.0.0** आईपी लोकलहोस्ट तक पहुंचने के लिए ये आवश्यकताओं को **बाइपास** करने के लिए काम करता है क्योंकि इस आईपी पते को "स्थानीय" नहीं माना जाता है। +ध्यान दें कि लिनक्स **0.0.0.0** आईपी इन आवश्यकताओं को दूर करने के लिए काम करता है ताकि localhost तक पहुंचा जा सके क्योंकि यह आईपी पता "स्थानीय" नहीं माना जाता है। -यदि आप **स्थानीय नेटवर्क आवश्यकताओं को बाइपास** करना चाहते हैं तो एक स्थानीय अंत पुंज का **सार्वजनिक आईपी पता** (जैसे राउटर का सार्वजनिक आईपी) उपयोग करें। क्योंकि कई अवस्थाओं में, यदि **सार्वजनिक आईपी** तक पहुंचा जा रहा है, और यह **स्थानीय नेटवर्क** से है, तो पहुंच मिल जाएगी। +यह भी संभव है कि यदि आप किसी स्थानीय अंतबिंदु (जैसे राउटर का सार्वजनिक आईपी) का सार्वजनिक आईपी पता उपयोग करते हैं तो **स्थानीय नेटवर्क आवश्यकताओं को दूर करना** संभव है। क्योंकि कई अवस्थाओं में, यदि **सार्वजनिक आईपी** तक पहुंचा जा रहा है, तो यदि यह **स्थानीय नेटवर्क** से है, पहुंच प्रदान की जाएगी। {% endhint %} -## एक्सप्लोइटेबल मिसकॉन्फ़िगरेशन +## शोधनीय गलतियाँ -यह देखा गया है कि `Access-Control-Allow-Credentials` को **`true`** पर सेट करना अधिकांश **वास्तविक हमलों** के लिए आवश्यक है। यह सेटिंग ब्राउज़र को क्रेडेंशियल भेजने और प्रतिक्रिया पढ़ने की अनुमति देती है, हमले की प्रभावकारिता बढ़ाती है। इसके बिना, ब्राउज़र को अनुरोध जारी करने की बजाय खुद से करने का लाभ कम हो जाता है, क्योंकि उपयोगकर्ता के कुकीज़ का उपयोग करना असंभव हो जाता है। +यह देखा गया है कि `Access-Control-Allow-Credentials` को **`true`** पर सेट करना अधिकांश **वास्तविक हमलों** के लिए आवश्यक है। यह सेटिंग ब्राउज़र को क्रेडेंशियल भेजने और प्रतिक्रिया पढ़ने की अनुमति देती है, हमले की प्रभावकारिता को बढ़ाती है। इसके बिना, ब्राउज़र को अनुरोध जारी करने की बजाय खुद से करने का लाभ कम हो जाता है, क्योंकि उपयोगकर्ता के कुकीज़ का उपयोग करना असंभव हो जाता है। ### अपवाद: प्रमाणीकरण के रूप में नेटवर्क स्थान का शोषण -एक अपवाद है जहां पीड़ित का नेटवर्क स्थान प्रमाणीकरण के रूप में काम करता है। इससे पीड़ित के ब्राउज़र का उपयोग प्रॉक्सी के रूप में किया जा सकता है, आईपी-आधारित प्रमाणीकरण को दुरुपयोग करने के लिए इंट्रानेट एप्लिकेशन तक पहुंचने के लिए। यह विधि DNS रिबाइंडिंग के साथ समान प्रभाव को साझा करती है, लेकिन इसे एक्सप्लॉइट करना सरल है। +एक अपवाद मौजूद है जहां पीड़ित का नेटवर्क स्थान प्रमाणीकरण के रूप में काम करता है। इससे पीड़ित का ब्राउज़र एक प्रॉक्सी के रूप में उपयोग किया जा सकता है, आईपी-आधारित प्रमाणीकरण को दौर करने के लिए इंट्रानेट एप्लिकेशन तक पहुंचने के लिए। यह विधि DNS रिबाइंडिंग के साथ समान प्रभाव को साझा करती है लेकिन इसे शोषण करना सरल है। ### `Access-Control-Allow-Origin` में `Origin` का प्रतिबिम्ब -वास्तविक दुनियावी स्थिति जहां `Origin` हेडर का मान `Access-Control-Allow-Origin` में प्रतिबिम्बित होने की संभावना सिद्धांतात्मक रूप से असंभव है क्योंकि इन हेडर्स को मिलाने पर प्रतिबंध है। हालांकि, यदि डेवलपर्स CORS को कई URL के लिए सक्षम करना चाहते हैं तो `Origin` हेडर के मान की प्रतिलिपि बनाकर `Access-Control-Allow-Origin` हेडर को डायनामिक रूप से उत्पन्न कर सकते हैं। यह दृष्टिकोण दुरुस्तिति तार्क को धोखा देने के लिए एक डोमेन का उपयोग करते हुए एक हमलावर विशेषताएँ ला सकता है। +वास्तविक दुनियावी स्थिति जहां `Origin` हेडर के मान को `Access-Control-Allow-Origin` में प्रतिबिम्बित किया जाता है सिद्धांतात असंभव है क्योंकि इन हेडर्स को मिलान करने पर प्रतिबंध है। हालांकि, यदि विकासक विभिन्न URL के लिए CORS सक्षम करना चाहते हैं तो `Access-Control-Allow-Origin` हेडर को `Origin` हेडर के मान की प्रतियोगिता द्वारा उत्पन्न कर सकते हैं। यह दृष्टिकोण दुरुपयोग ला सकता है, विशेष रूप से जब एक हमलावर एक डोमेन का उपयोग करता है जिसे वैध लगने के लिए डिज़ाइन किया गया है, असलीकरण तर्क को धोखा देता है। ```html