GraphQL - आम कमजोरियाँ और उनका शोषण कैसे करें

नमस्ते! तुम कैसे हो? , बिलाल रिज़वान यहाँ और मुझे उम्मीद है कि हर कोई संकट के इस समय में सुरक्षित है और नई चीज़ों को सीखने और अपने कौशल का विस्तार करने के लिए अपने संगरोध समय का पूरा उपयोग कर रहा है।

यह पोस्ट किस बारे में है? आप में से बहुत से लोगों ने अब देखा होगा कि ग्राफ़िकल का उपयोग बहुत सारे वेब अनुप्रयोगों में किया जा रहा है, आप में से कुछ ने तुरंत ही पहचान लिया होगा कि इसके ग्राफकल और शायद आप इसके साथ क्या करने की कोशिश कर रहे हैं, कुछ ने महसूस नहीं किया होगा कि अनुरोध कुछ कहा जाता है। रेखांकन अनुरोध। इस पोस्ट में मैं ग्राफ़िकल के उपयोग में आम गलतफहमी को उजागर करने की कोशिश करूँगा और उनका कैसे फायदा उठाया जा सकता है।

उन लोगों के लिए जो यह नहीं जानते हैं कि ग्रेफेल इसका अनुरोध क्या है।

ग्राफकॉल नमूना अनुरोध

इसमें कुछ घुंघराले कोष्ठक और \ n वर्ण हैं। अगर आपको ऐसा कुछ दिखाई देता है, तो इसकी संभावना सबसे ज्यादा है। पहले समझ में आता है कि क्या वास्तव में यह पता चल रहा है कि ग्राफकोल बेहतर फार्म कारनामों में मदद करेगा।

GraphQL क्या है?

अच्छी तरह से रखा गया ग्राफिकल REST और SOAP की तरह एक वैकल्पिक एपीआई मानक है। यह मूल रूप से एपीआई के लिए एक क्वेरी भाषा है जिसका उपयोग एपीआई के साथ बातचीत करने और एपीआई के माध्यम से बैकएंड से डेटा प्राप्त करने के लिए किया जाता है। यह सब कुछ कर सकता है REST API एक बहुत अधिक कुशल और नियंत्रित तरीके से कर सकता है। ग्राफकॉल बहुत सी समस्याओं का हल करता है, जबकि REST का उपयोग करते हुए अधिक डेटा प्राप्त करना चाहिए जैसे कि हर कॉल के लिए एक नया समापन बिंदु होना चाहिए।

निम्न उदाहरण को ग्राफकैल और आरईएसटी एपीआई के बीच अंतर को स्पष्ट करना चाहिए।

REST API में हम आमतौर पर / यूजर्स / उपयोगकर्ता डेटा प्राप्त करने के लिए समापन बिंदु। दूसरे, एक / उपयोगकर्ता / होने की संभावना है / पोस्ट एंडपॉइंट जो उपयोगकर्ता के लिए सभी पोस्ट लौटाता है। तीसरा समापन बिंदु तब / उपयोगकर्ताओं / होगा / अनुसरणकर्ता जो प्रति उपयोगकर्ता अनुयायियों की सूची लौटाते हैं

अन्य एपीआई कार्यक्षमता

हालांकि ग्राफकॉइन में केवल एक एंडपॉइंट है जहां हम एक क्वेरी भेजते हैं जिसमें ठोस डेटा आवश्यकताएं शामिल होती हैं जो सर्वर तब डेटा आवश्यकताओं के साथ प्रतिक्रिया करता है। मान लीजिए कि हम सिस्टम से उपयोगकर्ता आईडी प्राप्त करना चाहते हैं, तो हम इस तरह से इसके लिए एक प्रश्न बना सकते हैं

फेट आई.डी.

अब क्या होगा अगर हम यूजर ईमेल भी चाहते हैं? REST API के विपरीत हम केवल यह निर्दिष्ट कर सकते हैं कि अनुरोध में एक ही एंडपॉइंट पर एक नई लाइन में सर्वर को भेजा जा रहा है और बस इतना आसान है

अगर हम नाम भी चाहते हैं तो क्या होगा? मुझे यकीन है कि अब आप इसका पता लगाने में सक्षम हैं।

और यह ग्राफिकल का सौंदर्यीकरण है जिसे आप केवल वही बता सकते हैं जो आप एक दानेदार फैशन में चाहते हैं। अब जब कि आप जानते हैं कि ग्राफ़कॉक क्या है सब चल रहा है।

GraphQL में आम गलतफहमी

यहाँ समझने की बात यह है कि किसी अन्य REST API की तरह ग्राफकलाइन कई हमलों की चपेट में है, वही REST एपीआई पर होने वाले हमलों के लिए खतरा हो सकता है। मैं उनमें से कुछ को नीचे सूचीबद्ध करूँगा लेकिन सबसे दिलचस्प बात और इस पूरी पोस्ट को बनाने का कारण कुख्यात आत्मनिरीक्षण क्वेरी बग है।

आत्मनिरीक्षण क्वेरी: सरल शब्दों में कहें तो यह एक ऐसा तरीका है जो सर्वर को उसके ग्राफक्यूएल बैक-एंड स्कीमा के लिए क्वेरी करता है और बैक-एंड में उपलब्ध एपीआई कॉल की संपूर्ण प्रलेखन और सूची प्राप्त करता है। यह मूल रूप से आंतरिक रूप से उपयोग करने के लिए है।

आत्मनिरीक्षण क्वेरी को केवल आंतरिक रूप से अनुमति दी जानी चाहिए और आम जनता को अनुमति नहीं दी जानी चाहिए। अगर हम किसी सर्वर पर उपलब्ध पूरे बैक-एंड एपीआई डॉक्यूमेंट और कॉल को प्राप्त कर सकते हैं, तो यह बहुत खतरनाक हो सकता है, कई मामले हैं, अगर हम कुछ एपीआई कॉल पर अपने हाथों को प्राप्त कर सकते हैं, जिसका मतलब केवल आंतरिक रूप से उपयोग करने के लिए हो सकता है, तो हम सक्षम करने के लिए कॉल पाते हैं। डिबगिंग या शायद एक एपीआई कॉल उपयोगकर्ताओं को हटाने के लिए इतना नुकसान है कि अगर पूरे बैक-एंड को लाया जा सकता है तो यह किया जा सकता है।

आइए देखें कि यह कैसे किया जाता है।

GraphQL आत्मनिरीक्षण मिसकॉन्फ़िगरेशन के लिए एक सर्वर का परीक्षण करने के लिए: 1) सर्वर पर भेजे जा रहे HTTP अनुरोध को इंटरसेप्ट करें) अपनी पोस्ट सामग्री / क्वेरी को जेनेरिक आत्मनिरीक्षण क्वेरी से बदलें पूरे बैकेंड स्कीमा को लाने के लिए 3। रसदार एपीआई कॉल को इकट्ठा करने के लिए स्कीमा की कल्पना करें। 4) किसी भी संभावित GraphQL कॉल को बुलाओ जो आपको दिलचस्प लग सकता है और दूर हटो!

मान लीजिए कि आपका लक्ष्य वेब ऐप एक ग्राफकॉल कॉल कर रहा है, तो आप केवल निम्नानुसार अपनी क्वेरी को ग्राफ़कॉक इंट्रोस्पेक्शन क्वेरी के साथ बदल सकते हैं।

मूल एपीआई

मूल एपीआई कॉल

ग्राफकॉल इंट्रोस्पेक्शन क्वेरी बैकिंग बैक-एंड स्कीमा

निम्नलिखित प्रश्न के साथ बस POST सामग्री बदलें:

{"क्वेरी": "\ n क्वेरी इंट्रोस्पेनेव्यू {\ r \ n __schema {\ r \ n क्वेरी टाइप {name} \ r \ n \ n उत्परिवर्तन {नाम} \ r \ n सदस्यता टाइप {name} \ r \ n प्रकार {\ r \ _ n ... FullType \ r \ n} \ r \ n निर्देश {\ r \ n नाम \ r \ n वर्णन \ r \ n स्थान \ r \ n args {\ r \ n ... InputValue \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n \ r \ n खंड __Type पर पूर्ण टाइप करें {\ r \ n तरह \ r \ n नाम \ r \ n विवरण \ r \ n फ़ील्ड (शामिल किए गए) : सत्य) {\ r \ n नाम \ r \ n विवरण \ r \ n args {\ r \ n ... इनपुटवील्यू \ r \ n} \ r \ n प्रकार {\ r \ n ... टाइप करें \ r \ n n} \ r \ n isDeprecated \ r \ n deprecationReason \ r \ n} \ r \ n inputFields {\ r \ n ... InputValue \ r \ n} \ r \ n \ इंटरफेस \ {r \ n ... TypeRef \ r \ n} \ r \ n enumValues ​​(शामिल किए गए: सत्य) {\ r \ n नाम \ r \ n वर्णन \ r \ n \ n अलग किया गया \ r \ n deprecationReason / r \ n} \ r \ n संभव है \ {r \ n n ... TypeRef \ r \ n} \ r \ n} \ r \ n \ n \ n खंड __InputValue पर \ _ r \ n नाम \ r \ n विवरण \ r \ n प्रकार {... टाइपफ़र} \ _ r \ n defaultValue \ r \ n} \ r \ n \ r \ n खंड __Type पर टाइप करें {\ r \ n \ _ \ _ \ _ \ n \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ नाम का शब्द क्यों हो \ n टाइप करें {\ r \ n तरह \ r \ n नाम \ r \ n टाइप करें {\ r \ n \ _ \ _ \ _ \ n \ {a \ n \ n तरह \ r \ n नाम \ r \ n टाइप करें {\ r \ n तरह \ r \ n नाम \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n "," चर ": null}

अब जब आप ऐसा करेंगे तो प्रतिक्रिया काफी बड़ी और समझने में कठिन हो सकती है। स्कीमा को समझने का सबसे अच्छा तरीका यह कल्पना करना है। जो कि पूरे रिस्पांस बॉडी को कॉपी करके किया जा सकता है और इस वेबसाइट https://apis.guru/graphql-voyager/ का उपयोग करके चेंज स्कीमा बटन पर क्लिक करें और आत्मनिरीक्षण टैब में जाएं और फिर इंट्रोस्पेक्शन क्वेरी पेस्ट करें

स्कीमा पेस्ट करने के बाद वहाँ प्रदर्शन और वसीला पर क्लिक करें जिसे आप पूरे बैक-एंड और एपीआई कॉल के दृश्य के साथ प्रस्तुत करेंगे।

GraphQL का बैकेंड स्कीमा

अब चूंकि हमारे पास पूरी एपीआई कॉल सूची है, हम उस पर जा सकते हैं और आसानी से यह पता लगाने की कोशिश कर सकते हैं कि क्या कोई संवेदनशील एपीआई कॉल है जिसका दुरुपयोग किया जा सकता है। यह ग्राफ़िकल बैक-एंड में पाया जाने वाला सबसे प्रचलित प्रकार का बग है जो काफी महत्वपूर्ण परिदृश्यों को जन्म दे सकता है।

मुझे लगता है कि इस बिंदु तक आप इस बग के सही प्रभाव में पूरी तरह से समन्वयित नहीं हो सकते हैं, ताकि आप उन लोगों के लिए एक उदाहरण ले सकें, जो पहले से ही जानते हैं कि ग्राफिकल स्कीमा और क्राफ्ट ग्राफ़कॉल प्रश्नों को कैसे देखना है, जो आगे पढ़ना नहीं होगा। काफी उपयोगी है, लेकिन जिन लोगों ने स्कीमा प्राप्त कर लिया है, उन्होंने कल्पना की कि यह कुछ संवेदनशील दिख रहा है और इसका फायदा उठाना चाहते हैं या बस आत्मनिरीक्षण के सही प्रभाव को समझना चाहते हैं, फिर आगे पढ़ें।

GraphQL सीखना क्वेरी का गठन: GraphQL में 3 बुनियादी प्रकार के प्रश्न या घटक हैं
REST API में GET अनुरोध के समान क्वेरी, डेटा लाने के लिए क्वेरीज़ का उपयोग किया जाता है।
म्यूटेशन डेटा बनाने, संपादित करने और हटाने के लिए उपयोग किया जाता है।
सदस्यता वास्तविक समय संचार के लिए उपयोग किया जाता है। हम इस पर ध्यान केंद्रित नहीं करेंगे।

रेखांकन प्रश्नों के सभी लाइन ब्रेक और घुंघराले कोष्ठक के साथ एक जोंस प्रारूप में लिखे गए हैं। एक उदाहरण लेते हैं और एक वेब एप्लिकेशन का उपयोग करते हैं जिसमें 2 विशेषताएं हैं 1) उपयोगकर्ताओं को सूचीबद्ध करें 2) उपयोगकर्ताओं को जोड़ें हम तब एप्लिकेशन में बग ढूंढने के लिए आत्मनिरीक्षण क्वेरी का उपयोग करेंगे और यह आमतौर पर वेब ऐप्स में पाया जाता है।

उपयोगकर्ताओं को सूचीबद्ध करने के लिए GraphQL कॉल

ऊपर दी गई तस्वीर वह है जो आप सामान्य रूप से देख रहे हैं, इसे बेहतर बनाने के लिए आप JSON ब्यूटिफायर जैसे burp प्लगइन का उपयोग कर सकते हैं या ग्राफक्लाइन रेडर के रूप में जाना जाने वाला GraphQL के लिए बेहतर है। आपके द्वारा स्थापित करने के बाद आपके पास JSON ब्यूटिफिशर की तरह एक टैब होगा जहां कभी ग्राफ़कॉल होता है

अब उपरोक्त को बहुत बेहतर तरीके से देखा जा सकता है

सक्षम छवियों से आप आसानी से ग्राफकॉल क्वेरी संरचना को समझने में सक्षम होना चाहिए

क्वेरी { { }}

इतना ही आसान। कि कैसे काम करता है। Thats पहला फ़ंक्शन वेबसाइट प्रदान करता है ऐप हमें उपयोगकर्ताओं को जोड़ने की सुविधा देता है जो इसे आज़माता है।

अब जबकि हम इन कॉल को burp के माध्यम से देख पा रहे हैं और सामने के छोर पर एक बटन पर क्लिक करके उन्हें जनरेट कर रहे हैं, तो हम कुछ अधिक रसीले कैसे पा सकते हैं? अच्छी तरह से आत्मनिरीक्षण क्वेरी का प्रयास करें।

आत्मनिरीक्षण क्वेरी का उपयोग करके प्रतिक्रिया डेटा को कॉपी करें और इसे वायेजर में पेस्ट करें

आत्मनिरीक्षण प्रश्न

चूंकि यह एक परीक्षण ऐप है स्कीमा बहुत छोटा है, लेकिन छवि को बारीकी से देखें यह एक बहुत ही मूल और बुनियादी उदाहरण है कि आप आत्मनिरीक्षण का उपयोग करके संवेदनशील सामान कैसे पा सकते हैं जैसा कि आप तस्वीर में देख सकते हैं कि उपयोगकर्ता फ़ंक्शन में कई फ़ील्ड हैं जो हम हैं आईडी, ईमेल, नाम जैसे पहले से ही परिचित हैं, लेकिन एक मिनट प्रतीक्षा करें ... यह क्या है इसे लाने का प्रयास करें।

वाह!! हमने केवल बैक-एंड से पासवर्ड प्राप्त किए हैं। हम ऐसा क्यों कर पा रहे थे? क्योंकि बैकएंड में एक पासवर्ड फ़ील्ड था और हम उपयोग कर सकते थे कि ग्राफ़िकल कॉल में यह केवल आत्मनिरीक्षण के माध्यम से संभव था।

- - - - - -

अब ऑनलाइन ग्राफकॉल विज़ुअलाइज़ेशन के साथ एक छोटी सी समस्या है। यह उत्परिवर्तन नहीं दिखाता है, क्या आपने उसे देखा है? अच्छी तरह से तो तुम एक गहरी नजर है। मैं एक के लिए हाजिर नहीं था कि जल्दी से मुझे यह जानने के लिए एक लंबा समय लगा और मुझे आश्चर्य है कि मैंने कितने कीड़े पास किए। दुख की बात है कि इसके बारे में कुछ भी नहीं किया जा सकता है

अब सवाल यह है कि हम संपूर्ण संपूर्ण स्कीमा को कैसे सूचीबद्ध करेंगे? म्यूटेशन के साथ? वैसे मैंने कुछ गोलगप्पे खाए और यह द ग्रेफेल्ड खेल का मैदान यहाँ डाउनलोड करता है

अब यहाँ ग्रेफेल प्लेग्राउंड के बारे में बहुत अच्छी बात है कि यह वास्तव में आत्मनिरीक्षण क्वेरी का उपयोग करता है और आपके लिए इससे एक दस्तावेज बनाता है।

आपको बस इतना करना है कि ग्राफिकल एंडपॉइंट के यूआरएल में एप्लीकेशन पेस्ट डाउनलोड करें और साथ में आपके पास मौजूद कोई भी कुकीज़!

न ही आम तौर पर आप केवल उत्परिवर्तनों और इसके मापदंडों के साथ यहां सभी स्कीमा देख सकते हैं

लेकिन मैं इसके बारे में भी कल्पना करना चाहूंगा या कम से कम हमें पता होना चाहिए कि अब आप क्या करेंगे, डॉक्स टैब पर क्लिक करें और स्कीमा को एसडीएल प्रारूप में डाउनलोड करें।

एक बार जब आपके पास स्कीमा सिर https://app.graphqleditor.com/ पर आ जाता है, तो साइन इन करें और आपके द्वारा डाउनलोड किए जाने के बाद आपके द्वारा डाउनलोड की गई एसडीएल फाइल को पेस्ट करने का विकल्प दिया जाएगा ताकि स्कीमा आपको म्यूटेशन कॉल के साथ-साथ आपके लिए विज़ुअलाइज़ हो जाए। ।

अब क्या तुम उस सुंदर को देखोगे?

ठीक से म्यूटेशन भाग को देखकर हम देखते हैं कि एक और फ़ंक्शन डिलीट फ़ंक्शन के सामने के छोर पर उपलब्ध नहीं है और यह दिखाता है कि यह आईडी का एक भी तर्क लेता है इसे आज़माएं। उपयोगकर्ता 1 हटा दें।

विज़ुअलाइज़ेशन का उपयोग करके इस तरह से तर्क पास करना

सरल है ना? यदि नहीं तो ऊपर दिए गए म्यूटेशन भाग को फिर से पढ़ने की कोशिश करें और मुझे यकीन है कि आप इसे प्राप्त कर लेंगे। DelUser क्वेरी चलाने के बाद उपयोगकर्ताओं को फिर से सूचीबद्ध करने देता है।

DelUser ग्राफकॉल कॉल

और जैसा कि हम देख सकते हैं कि उपयोगकर्ता 1 हटा दिया गया है। यह केवल उन चीजों का एक सरल उदाहरण है, जो आत्मनिरीक्षण का उपयोग करके पाया जा सकता है

ग्राफकल में अन्य कीड़े:

वैसे ही जैसे किसी अन्य REST API GraphQL उदाहरण के लिए सभी API बग्स के लिए असुरक्षित है 1) IDORs जहाँ आपको कभी भी आईडी दिखाई देती है, आपको पता है कि इस बग का क्या करना है, यह ग्राफक्यूएल से संबंधित नहीं है, लेकिन एक प्राधिकरण बग 2 है) BruteThis OTP देखें ? या MFA कोड की जाँच करें दर 3 सीमा के लिए) SQL इंजेक्शन हाँ, आप इसे सही पढ़ते हैं, GraphQL का मतलब यह नहीं है कि ऐप में मूल कीड़े नहीं हैं इसलिए हमेशा इसके लिए जांच करें। लेकिन मैंने देखा है कि ग्राफकॉइन एपीआई का एक हिस्सा अब मोंगोडीबी से जुड़ा हुआ है, इसलिए आपको अपने स्वयं के एसक्यूएल इंजेक्शन को परिचित करने की आवश्यकता है। (हाँ यह एक बात है) 4) CSRF 5) डॉस के लिए नेस्टेड ग्राफ़िकल प्रश्न (https://voidsec.com/graphql-security-overview-and-testing-tips/)

और किसी भी अन्य एपीआई बग जिसे आप इमेज कर सकते हैं मौजूद है।

इस ज्ञान का उपयोग करके मैं एक वेब ऐप में उपयोगकर्ता PII को देख पा रहा था जिसे केवल देखने के लिए अनुमति दी गई थी और मैंने इसके साथ एक छोटा सा इनाम दिया था

इसके बारे में अच्छी तरह से thats, अगर वहाँ कुछ भी याद किया है या टाइप गलत है मुझे https://twitter.com/th3_ininstinin पर हिट करने के लिए स्वतंत्र महसूस