<summary><strong> AWS हैकिंग सीखें शून्य से लेकर हीरो तक</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें** तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा एक्सक्लूसिव [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) या **Twitter** 🐦 पर मुझे **फॉलो** करें [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **HackTricks** के [**github repos**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) में PRs सबमिट करके अपनी हैकिंग ट्रिक्स शेयर करें।
CORS (Cross-origin resource sharing) मानक की आवश्यकता होती है क्योंकि यह **सर्वरों को यह निर्दिष्ट करने की अनुमति देता है कि कौन उसकी संपत्तियों तक पहुँच सकता है** और बाहरी संसाधनों से कौन सी **HTTP अनुरोध विधियाँ अनुमत हैं**।
एक **समान-मूल** नीति की आवश्यकता होती है कि दोनों **सर्वर अनुरोध करने वाले** एक संसाधन और सर्वर जहाँ **संसाधन** स्थित है उसी प्रोटोकॉल ([http://),डोमेन](http://\),डोमेन) नाम (internal-web.com) और उसी **पोर्ट** (80) का उपयोग करते हैं। फिर, यदि सर्वर समान-मूल नीति को लागू करता है, तो केवल उसी डोमेन और पोर्ट से वेब पेज ही संसाधनों तक पहुँच सकेंगे।
`Access-Control-Allow-Origin` की विशिष्टता **बहु-मूलों** के लिए, या मान **`null`**, या वाइल्डकार्ड **`*`** के लिए अनुमति देती है। हालांकि, **कोई भी ब्राउज़र बहु-मूलों का समर्थन नहीं करता** और वाइल्डकार्ड `*` के उपयोग पर **प्रतिबंध** हैं।(_वाइल्डकार्ड केवल अकेले उपयोग किया जा सकता है, यह विफल हो जाएगा `Access-Control-Allow-Origin: https://*.normal-website.com` और इसे _Access-Control-Allow-Credentials: true_ के साथ उपयोग नहीं किया जा सकता_)
क्रॉस-ओरिजिन संसाधन अनुरोधों का **डिफ़ॉल्ट** व्यवहार कुकीज़ और Authorization हेडर जैसी क्रेडेंशियल्स के बिना **अनुरोधों** को **पास करने के लिए** है। हालांकि, क्रॉस-डोमेन सर्वर **प्रतिक्रिया को पढ़ने की अनुमति दे सकता है** जब क्रेडेंशियल्स **पास किए जाते हैं** उसके द्वारा CORS **`Access-Control-Allow-Credentials`** हेडर को **`true`** पर सेट करके।
**जांचें** [**इस लिंक में**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) **कि एक अनुरोध की क्या शर्तें हैं जिससे प्री-फ्लाइट अनुरोध भेजने से बचा जा सके**
क्रॉस-ओरिजिन अनुरोध से पहले **`OPTIONS`** **विधि** का उपयोग करके एक **अनुरोध** होता है, और CORS प्रोटोकॉल में क्रॉस-ओरिजिन अनुरोध की अनुमति देने से पहले यह जांचना आवश्यक होता है कि कौन सी **विधियाँ और हेडर्स की अनुमति है**। इसे **प्री-फ्लाइट जांच** कहा जाता है। सर्वर **अनुमत विधियों की सूची लौटाता है** इसके अलावा **विश्वसनीय ओरिजिन** और ब्राउज़र यह जांचता है कि क्या अनुरोध करने वाली वेबसाइट की विधि अनुमत है।
ध्यान दें कि **यदि प्री-फ्लाइट अनुरोध नहीं भेजा जाता है** क्योंकि "सामान्य अनुरोध" की शर्तें मानी जाती हैं, तो भी **प्रतिक्रिया में अधिकृत हेडर्स होने चाहिए** या **ब्राउज़र****प्रतिक्रिया को पढ़ नहीं पाएगा** अनुरोध की।
**उदाहरण के लिए**, यह एक प्री-फ्लाइट अनुरोध है जो **`PUT` विधि का उपयोग करने की मांग कर रहा है** एक **कस्टम** अनुरोध **हेडर** के साथ जिसे `Special-Request-Header` कहा जाता है:
ध्यान दें कि आमतौर पर (कंटेंट-टाइप और हेडर्स सेट पर निर्भर करते हुए) **GET/POST अनुरोध में कोई प्री-फ्लाइट अनुरोध नहीं भेजा जाता है** (अनुरोध **सीधे** भेजा जाता है), लेकिन यदि आप **प्रतिक्रिया के हेडर्स/बॉडी** तक पहुँचना चाहते हैं, तो इसमें _Access-Control-Allow-Origin_ हेडर होना चाहिए जो इसे अनुमति देता है।\
**इसलिए, CORS CSRF के खिलाफ सुरक्षा नहीं करता (लेकिन यह सहायक हो सकता है).**
ध्यान दें कि linux **0.0.0.0** IP का उपयोग करके इन आवश्यकताओं को **bypass** किया जा सकता है ताकि localhost तक पहुंचा जा सके क्योंकि उस IP पते को "स्थानीय" नहीं माना जाता है।
यह भी संभव है कि यदि आप **स्थानीय endpoint के public IP पते** का उपयोग करें (जैसे कि राउटर का public IP), तो **Local Network की आवश्यकताओं को bypass** किया जा सकता है। क्योंकि कई बार, भले ही **public IP** का उपयोग किया जा रहा हो, अगर यह **स्थानीय नेटवर्क से है**, तो पहुंच प्रदान की जाएगी।
ध्यान दें कि अधिकांश **वास्तविक हमलों के लिए `Access-Control-Allow-Credentials`** को **`true`** पर सेट किया जाना चाहिए क्योंकि इससे ब्राउज़र को क्रेडेंशियल्स भेजने और प्रतिक्रिया पढ़ने की अनुमति मिलेगी। बिना क्रेडेंशियल्स के, कई हमले अप्रासंगिक हो जाते हैं; इसका मतलब है कि आप उपयोगकर्ता के कुकीज़ पर सवारी नहीं कर सकते, इसलिए अक्सर उनके ब्राउज़र से अनुरोध करने के बजाय खुद से अनुरोध करने से कुछ भी हासिल नहीं होता है।
एक उल्लेखनीय अपवाद तब होता है जब **पीड़ित का नेटवर्क स्थान किसी प्रकार के प्रमाणीकरण के रूप में काम करता है।** आप पीड़ित के ब्राउज़र का उपयोग प्रॉक्सी के रूप में करके IP-आधारित प्रमाणीकरण को bypass कर सकते हैं और इंट्रानेट एप्लिकेशन तक पहुंच सकते हैं। प्रभाव के मामले में यह DNS rebinding के समान है, लेकिन इसका शोषण करना बहुत कम जटिल है।
वास्तविक दुनिया में यह हो नहीं सकता क्योंकि **इन 2 मानों के headers को एक साथ निषिद्ध किया गया है।**\
यह भी सच है कि बहुत से डेवलपर्स **CORS में कई URLs को अनुमति देना चाहते हैं**, लेकिन सबडोमेन वाइल्डकार्ड्स या URLs की सूचियों की अनुमति नहीं है। तब, कई डेवलपर्स **गतिशील रूप से** \*\*`Access-Control-Allow-Origin`\*\*header **उत्पन्न करते हैं**, और कई बार वे बस **Origin header के मान की प्रतिलिपि बनाते हैं।**
अन्य मामलों में, डेवलपर यह जांच सकता है कि **डोमेन** (_victimdomain.com_) **Origin header में दिखाई देता है**, तब, एक हमलावर **`attackervictimdomain.com`** नामक डोमेन का उपयोग करके गोपनीय जानकारी चुरा सकता है।
`null`**Origin** हेडर के लिए एक विशेष मान है। विनिर्देशन में इसे रीडायरेक्ट्स और स्थानीय HTML फाइलों द्वारा ट्रिगर किए जाने का उल्लेख है। कुछ एप्लिकेशन स्थानीय विकास का समर्थन करने के लिए `null` मूल को व्हाइटलिस्ट कर सकते हैं।\
यह अच्छा है क्योंकि **कई एप्लिकेशन इस मान को CORS में अनुमति देंगे** और कोई भी **वेबसाइट आसानी से सैंडबॉक्स्ड iframe का उपयोग करके null मूल प्राप्त कर सकती है**:
यदि आपने पाया कि डोमेन _victim.com_ को **whitelisted** किया गया है, तो आपको जांचना चाहिए कि _victim.com.**attacker.com**_ भी **whitelisted** है या नहीं, या, यदि आप किसी सबडोमेन को **takeover** कर सकते हैं, तो जांचें कि _**somesubdomain**.victim.com_ whitelisted है या नहीं।
अधिकांश regex जो स्ट्रिंग के अंदर डोमेन की पहचान करने के लिए इस्तेमाल होते हैं, वे alphanumeric ASCII अक्षरों और `.-` पर केंद्रित होते हैं। इसलिए, Origin हेडर में `victimdomain.com{.attacker.com` जैसा कुछ regexp द्वारा `victimdomain.com` के रूप में व्याख्या किया जाएगा, लेकिन ब्राउज़र (इस मामले में Safari इस अक्षर को डोमेन में समर्थन करता है) `attacker.com` डोमेन तक पहुंचेगा।
**इस बायपास की अधिक जानकारी और सेटिंग्स के लिए देखें:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **और** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
CORS शोषण के खिलाफ एक रक्षात्मक तंत्र जो डेवलपर्स इस्तेमाल करते हैं, वह है उन डोमेन्स को white-list करना जो जानकारी के लिए बार-बार एक्सेस की मांग करते हैं। हालांकि, यह पूरी तरह सुरक्षित नहीं है, क्योंकि यदि **whitelisted** डोमेन का **एक भी** सबडोमेन **XSS** जैसे अन्य शोषणों के लिए **संवेदनशील** है, तो यह CORS शोषण को सक्षम कर सकता है।
यदि संयोग से सब कुछ अनुकूल हो, तो हम HTTP हेडर इंजेक्शन के माध्यम से सर्वर-साइड कैश पॉइज़निंग का उपयोग करके [संग्रहित XSS](https://portswigger.net/web-security/cross-site-scripting/stored) भेद्यता बना सकते हैं।
यदि कोई एप्लिकेशन **Origin हेडर** को प्रतिबिंबित करता है बिना इसे अवैध अक्षरों के लिए जांचे, तो हमारे पास **IE/Edge उपयोगकर्ताओं के खिलाफ HTTP हेडर इंजेक्शन भेद्यता है क्योंकि Internet Explorer और Edge \r (0x0d) को मान्य HTTP हेडर समाप्ति मानते हैं**:`GET / HTTP/1.1`\
यह सीधे तौर पर भेद्य नहीं है क्योंकि हमलावर के लिए यह संभव नहीं है कि वह किसी के वेब ब्राउज़र को इस तरह का दोषपूर्ण हेडर भेजने के लिए बना सके, लेकिन मैं **Burp Suite में इस अनुरोध को मैन्युअली तैयार कर सकता हूँ और सर्वर-साइड कैश इस प्रतिक्रिया को सहेज सकता है और इसे अन्य लोगों को परोस सकता है**। मैंने जो पेलोड इस्तेमाल किया है वह पृष्ठ के चरित्र सेट को **UTF-7** में बदल देगा, जो XSS भेद्यताओं को बनाने के लिए कुख्यात रूप से उपयोगी है।
आपने कभी-कभी एक पृष्ठ देखा होगा जिसमें कस्टम HTTP हेडर में [प्रतिबिंबित XSS](https://portswigger.net/web-security/cross-site-scripting/reflected) होता है। मान लीजिए कि एक वेब पृष्ठ किसी कस्टम हेडर की सामग्री को बिना एन्कोडिंग के प्रतिबिंबित करता है:
CORS के साथ, हम Header में कोई भी मान भेज सकते हैं। अपने आप में, **यह बेकार है** क्योंकि हमारा **इंजेक्ट किया गया JavaScript प्रदर्शित नहीं किया जाएगा**। हालांकि, **अगर Vary: Origin निर्दिष्ट नहीं किया गया है** तो प्रतिक्रिया **ब्राउज़र के कैश में संग्रहीत हो सकती है और जब ब्राउज़र संबंधित URL पर नेविगेट करता है तो सीधे प्रदर्शित की जा सकती है**। मैंने एक fiddle बनाया है ताकि आप [अपनी पसंद के URL पर यह हमला आजमा सकें](https://jsfiddle.net/3gk8u8wu/3/)। चूंकि यह हमला क्लाइंट-साइड कैशिंग का उपयोग करता है, यह वास्तव में काफी विश्वसनीय है।
XSSI एक प्रकार की कमजोरी को दर्शाता है जो इस तथ्य का शोषण करती है कि, जब `script` टैग का उपयोग करके कोई संसाधन शामिल किया जाता है, तो SOP लागू नहीं होता है, क्योंकि स्क्रिप्ट्स को क्रॉस-डोमेन शामिल करने में सक्षम होना चाहिए। इस प्रकार एक हमलावर `script` टैग का उपयोग करके शामिल की गई सभी चीजों को पढ़ सकता है।
यह विशेष रूप से तब दिलचस्प होता है जब डायनामिक जावास्क्रिप्ट या JSONP की बात आती है जब प्रमाणीकरण के लिए कुकीज जैसी वातावरण-प्राधिकरण जानकारी का उपयोग होता है। कुकीज को एक अलग होस्ट से संसाधन की मांग करते समय शामिल किया जाता है। BurpSuite प्लगइन: [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp)
अनुरोध में एक **`callback`** **पैरामीटर** जोड़ने का प्रयास करें। हो सकता है कि पेज डेटा को JSONP के रूप में भेजने के लिए तैयार किया गया हो। ऐसे मामले में पेज डेटा को `Content-Type: application/javascript` के साथ वापस भेजेगा जो CORS नीति को बाइपास करेगा।
आप एक वेब-एप्लिकेशन से अनुरोध कर सकते हैं कि वह आपके लिए एक अनुरोध करे और प्रतिक्रिया वापस भेजे। इससे **`Access-Control-Allow-Origin`** बाइपास हो जाएगा लेकिन ध्यान दें कि **अंतिम पीड़ित के प्रमाणपत्र नहीं भेजे जाएंगे** क्योंकि आप **एक अलग डोमेन से संपर्क करेंगे** (जो आपके लिए अनुरोध करेगा)।
CORS-escape एक **प्रॉक्सी** प्रदान करता है जो हमारे **अनुरोध** को इसके **हेडर्स** के साथ **पास** करता है, और यह **Origin** हेडर को भी **स्पूफ** करता है (Origin = **अनुरोधित डोमेन**). इस प्रकार **CORS नीति बाइपास हो जाती है**।\
स्रोत कोड [Github पर है](https://github.com/shalvah/cors-escape), इसलिए आप **अपना खुद का होस्ट कर सकते हैं**।
प्रॉक्सी का मतलब है "आपके अनुरोध को आगे बढ़ाना", जैसा कि आपने भेजा था। हम इसे एक वैकल्पिक तरीके से हल कर सकते हैं जिसमें अभी भी किसी और के द्वारा अनुरोध करना शामिल है, लेकिन इस बार, **आपके अनुरोध को आगे बढ़ाने के बजाय, सर्वर अपना खुद का अनुरोध करता है, लेकिन जो भी पैरामीटर आपने निर्दिष्ट किए हैं उसके साथ।**
आप **CORS जांचों को बायपास कर सकते हैं** जैसे कि `e.origin === window.origin`**एक iframe बनाकर** और **उससे एक नई विंडो खोलकर**। निम्नलिखित पृष्ठ में अधिक जानकारी:
मूल रूप से आप **पीड़ित को अपने पृष्ठ पर पहुंचाते हैं**, फिर आप अपने डोमेन के **DNS (आईपी)** को बदलते हैं और इसे **पीड़ित के वेब पृष्ठ** की ओर इशारा करते हैं। आप अपने **पीड़ित को निष्पादित करते हैं** (**JS**) कुछ जब **TTL समाप्त हो जाता है** ताकि एक नया DNS अनुरोध किया जाएगा और फिर आप जानकारी एकत्र कर पाएंगे (क्योंकि आप हमेशा **उपयोगकर्ता को अपने डोमेन में बनाए रखेंगे**, वह **कोई कुकी** पीड़ित सर्वर को नहीं भेजेगा, इसलिए यह विकल्प **पीड़ित के आईपी के विशेष अधिकारों का दुरुपयोग करता है**).
यहां तक कि अगर आप **TTL को बहुत कम** सेट करते हैं (0 या 1) **ब्राउज़र में एक कैश होता है** जो आपको **इसका दुरुपयोग** करने से कई सेकंड/मिनटों के लिए **रोकेगा**.
इसलिए, यह तकनीक **स्पष्ट जांचों को बायपास करने** के लिए उपयोगी है (पीड़ित **स्पष्ट रूप से DNS अनुरोध कर रहा है** डोमेन के आईपी की जांच करने के लिए और जब बॉट को बुलाया जाता है तो वह अपना खुद का करेगा).
अगर आपको इसका दुरुपयोग करने के लिए कुछ तेज़ चाहिए तो आप [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html) जैसी सेवा का उपयोग कर सकते हैं।
अगर आप अपना खुद का DNS रिबाइंडिंग सर्वर चलाना चाहते हैं तो आप [**DNSrebinder**](https://github.com/mogwailabs/DNSrebinder)**,** का उपयोग कर सकते हैं, फिर अपने **स्थानीय पोर्ट 53/udp को उजागर करें**, एक **A रजिस्ट्री इसके लिए बनाएं** (ns.example.com), और एक **NS रजिस्ट्री बनाएं** जो **पहले बनाए गए A सबडोमेन की ओर इशारा करती है**(ns.example.com).\
तब, उस सबडोमेन का कोई भी सबडोमेन (ns.example.com), आपके होस्ट द्वारा हल किया जाएगा।
जैसा कि पिछले अनुभाग में समझाया गया था, **ब्राउज़र** डोमेन के आईपी को TTL में निर्दिष्ट समय से **अधिक समय तक कैश करते हैं**। हालांकि, इस बचाव को बायपास करने का एक तरीका है।
जैसा कि पिछले अनुभाग में समझाया गया था, **ब्राउज़र** डोमेन के आईपी को TTL में निर्दिष्ट समय से **अधिक समय तक कैश करते हैं**। हालांकि, इस बचाव को बायपास करने का एक और तरीका है।
आप **2 A रिकॉर्ड बना सकते हैं** (या **1 को 2 आईपी के साथ**, प्रदाता पर निर्भर करता है) **एक ही सबडोमेन के लिए****DNS प्रदाता** में और जब एक ब्राउज़र उन्हें चेक करता है तो वह दोनों प्राप्त करेगा।
अब, अगर **ब्राउज़र** पहले **हमलावर के आईपी पते का उपयोग करने का फैसला करता है**, तो **हमलावर****पेलोड को सेवा देने में सक्षम होगा** जो **उसी डोमेन के लिए HTTP अनुरोध करेगा**। हालांकि, अब जब हमलावर को पीड़ित का आईपी पता पता चल जाता है, **वह पीड़ित ब्राउज़र को उत्तर देना बंद कर देगा**।
जब ब्राउज़र पाता है कि **डोमेन उसे उत्तर नहीं दे रहा है**, तो वह **दूसरे दिए गए आईपी का उपयोग करेगा**, इसलिए वह **SOP को बायपास करते हुए एक अलग जगह तक पहुंचेगा**। हमलावर उसका दुरुपयोग कर सकता है **जानकारी प्राप्त करने और उसे निकालने के लिए**।
ध्यान दें कि लोकलहोस्ट तक पहुंचने के लिए आपको Windows में **127.0.0.1** को रिबाइंड करने की कोशिश करनी चाहिए और Linux में **0.0.0.0**।\
प्रदाता जैसे कि godaddy या cloudflare ने मुझे 0.0.0.0 का आईपी उपयोग करने की अनुमति नहीं दी, लेकिन AWS route53 ने मुझे एक A रिकॉर्ड बनाने की अनुमति दी जिसमें 2 आईपी होते हैं जिनमें से एक "0.0.0.0" होता है
* अगर **आंतरिक आईपी की अनुमति नहीं है**, तो वे **0.0.0.0 को मना करना भूल सकते हैं** (Linux और Mac पर काम करता है)
* अगर **आंतरिक आईपी की अनुमति नहीं है**, तो एक **CNAME का उत्तर दें****localhost** के लिए (Linux और Mac पर काम करता है)
* अगर **आंतरिक आईपी की अनुमति नहीं है** DNS उत्तरों के रूप में, आप **CNAMEs का उत्तर दे सकते हैं** आंतरिक सेवाओं के लिए जैसे कि www.corporate.internal.