GraphQL
परिचय
GraphQL को REST API के लिए एक कुशल विकल्प के रूप में हाइलाइट किया गया है, जो बैकएंड से डेटा क्वेरी करने के लिए एक सरल दृष्टिकोण प्रदान करता है। REST के विपरीत, जो अक्सर डेटा एकत्र करने के लिए विभिन्न एंडपॉइंट पर अनेक अनुरोधों की आवश्यकता होती है, GraphQL एक एकल अनुरोध के माध्यम से सभी आवश्यक जानकारी को प्राप्त करने की सुविधा प्रदान करता है। यह सुविधा डेवलपर्स को उनकी डेटा लाने की प्रक्रिया की जटिलता को कम करके लाभ पहुंचाती है।
GraphQL और सुरक्षा
नई तकनीकों के आगमन के साथ, जैसे कि GraphQL, नई सुरक्षा संवर्धन भी सामने आते हैं। एक महत्वपूर्ण बिंदु यह है कि GraphQL डिफ़ॉल्ट रूप से प्रमाणीकरण तंत्र शामिल नहीं करता है। ऐसे सुरक्षा उपायों को लागू करना डेवलपर्स की जिम्मेदारी है। सही प्रमाणीकरण के बिना, GraphQL एंडपॉइंट संवेदनशील जानकारी को अप्रमाणित उपयोगकर्ताओं को उजागर कर सकते हैं, जो एक महत्वपूर्ण सुरक्षा जोखिम पैदा करता है।
निर्देशिका ब्रूट फोर्स हमले और GraphQL
उद्घाटित GraphQL उदाहरणों की पहचान के लिए, निर्देशिका ब्रूट फोर्स हमलों में विशेष पथों को शामिल करना सुझावित है। ये पथ हैं:
/graphql
/graphiql
/graphql.php
/graphql/console
/api
/api/graphql
/graphql/api
/graphql/graphql
खुले GraphQL उदाहरणों की पहचान, समर्थित क्वेरीज की जांच करने की अनुमति देती है। यह एंडपॉइंट के माध्यम से पहुंची जा सकने वाली डेटा को समझने के लिए महत्वपूर्ण है। GraphQL का इंट्रोस्पेक्शन सिस्टम इसे सुविधाजनक बनाता है जिसमें स्कीमा द्वारा समर्थित क्वेरीज का विवरण दिया जाता है। इसके लिए अधिक जानकारी के लिए, GraphQL इंट्रोस्पेक्शन पर दस्तावेज़ीकरण पर जाएं: GraphQL: एपीआई के लिए एक क्वेरी भाषा।
फिंगरप्रिंट
उपकरण graphw00f सर्वर में कौन सा GraphQL इंजन उपयोग किया जा रहा है यह पता लगाने में सक्षम है और फिर सुरक्षा महानिरीक्षक के लिए कुछ सहायक जानकारी प्रिंट करता है।
सार्वभौमिक क्वेरीज
यदि एक URL एक GraphQL सेवा है या नहीं यह जांचने के लिए, एक सार्वभौमिक क्वेरी, query{__typename}
, भेजी जा सकती है। यदि प्रतिक्रिया में {"data": {"__typename": "Query"}}
शामिल है, तो यह पुष्टि करता है कि URL में एक GraphQL एंडपॉइंट होस्ट किया जा रहा है। यह विधि GraphQL के __typename
फ़ील्ड पर निर्भर करती है, जो पूछे गए ऑब्जेक्ट के प्रकार को प्रकट करता है।
मूल जांच
Graphql आम तौर पर GET, POST (x-www-form-urlencoded) और POST(json) का समर्थन करता है। हालांकि सुरक्षा के लिए CSRF हमलों को रोकने के लिए केवल json को अनुमति देना सुझाया जाता है।
आत्म-जांच
स्कीमा सूचना खोजने के लिए इंट्रोस्पेक्शन का उपयोग करने के लिए, __schema
फील्ड क्वेरी करें। यह फ़ील्ड सभी क्वेरी के मूल प्रकार पर उपलब्ध है।
इस क्वेरी के साथ आपको उपयोग किए जा रहे सभी प्रकारों का नाम मिलेगा:
इस क्वेरी के साथ आप सभी प्रकार, उसके फ़ील्ड, और उसके तर्क (और तर्क के प्रकार) को निकाल सकते हैं। यह जानने के लिए बहुत उपयोगी होगा कि डेटाबेस को कैसे क्वेरी करें।
त्रुटियाँ
यह देखना दिलचस्प है कि क्या त्रुटियाँ दिखाई जाएंगी क्योंकि ये उपयोगी जानकारी के साथ सहायक होंगी।
इंट्रोस्पेक्शन के माध्यम से डेटाबेस स्कीम की जांच करें
यदि इंट्रोस्पेक्शन सक्षम है लेकिन उपरोक्त क्वेरी नहीं चलती है, तो क्वेरी संरचना से onOperation
, onFragment
, और onField
निर्देशिकाओं को हटाने का प्रयास करें।
इनलाइन इंट्रोस्पेक्शन क्वेरी:
आखिरी कोड लाइन एक graphql क्वेरी है जो graphql से सभी मेटा-जानकारी को डंप करेगी (ऑब्ज
नोट करें कि यदि क्वेरी करने का ऑब्जेक्ट एक मौलिक प्रकार जैसे कि स्ट्रिंग है जैसे निम्नलिखित उदाहरण में
आप इसे बस क्वेरी कर सकते हैं:
एक और उदाहरण में "Query" प्रकार के अंदर 2 ऑब्जेक्ट थे: "user" और "users"। यदि इन ऑब्जेक्ट्स को खोजने के लिए कोई आर्ग्यमेंट की आवश्यकता नहीं है, तो आप चाहें तो उन से सभी जानकारी प्राप्त कर सकते हैं जिसे आप चाहते हैं। इस उदाहरण से इंटरनेट से आप सहेजे गए उपयोगकर्ता नाम और पासवर्ड निकाल सकते हैं:
हालांकि, इस उदाहरण में यदि आप ऐसा करने की कोशिश करते हैं तो आपको यह त्रुटि मिलती है:
लगता है कि किसी प्रकार से यह "uid" आर्ग्यमेंट का उपयोग करके खोजेगा जिसका प्रकार Int है। जैसे ही आप उस क्वेरी को चलाने के लिए दिया गया उस छवि को पढ़ते हैं, आप देखेंगे कि "user" में "uid" नामक arg था जिसका प्रकार Int था।
इसलिए, कुछ हल्के uid ब्रूटफोर्स करके मैंने पाया कि uid=1 में एक उपयोगकर्ता नाम और पासवर्ड प्राप्त हुआ था:
query={user(uid:1){user,password}}
ध्यान दें कि मैंने खोज किया कि मैं "user" और "password" पैरामीटर के लिए पूछ सकता हूँ क्योंकि अगर मैं कुछ ऐसा खोजने की कोशिश करता हूँ जो मौजूद नहीं है (query={user(uid:1){noExists}}
) तो मुझे यह त्रुटि मिलती है:
और जाँच चरण के दौरान मुझे पता चला कि "dbuser" ऑब्ज
आप व्यक्तियों को नाम द्वारा खोज सकते हैं और उनकी सब्सक्राइब की गई फिल्में प्राप्त कर सकते हैं:
नोट करें कि इसमें इंसान के subscribedMovies
का name
प्राप्त करने के लिए संकेतित किया गया है।
आप एक साथ **कई ऑब्ज
या फिर अलायस का उपयोग करके कई विभिन्न वस्तुओं के संबंध:
म्युटेशन
म्युटेशन सर्वर-साइड में परिवर्तन करने के लिए उपयोग किए जाते हैं।
इंट्रोस्पेक्शन में आप घोषित म्युटेशन ढूंढ सकते हैं। निम्नलिखित छवि में "म्युटेशनटाइप" को "म्युटेशन" कहा जाता है और "म्युटेशन" ऑब्जेक्ट में म्युटेशन के नाम होते हैं (जैसे इस मामले में "व्यक्ति जोड़ें" को):
इस सेटअप में, एक डेटाबेस में व्यक्ति और फिल्में होती हैं। व्यक्ति अपने ईमेल और नाम से पहचानी जाती हैं; फिल्में अपने नाम और रेटिंग से। व्यक्ति एक-दूसरे के साथ दोस्त बन सकते हैं और उनके पास फिल्में भी हो सकती हैं, जो डेटाबेस के भीतर संबंधों को दर्शाती हैं।
डेटाबेस में नई फिल्में बनाने के लिए एक म्युटेशन निम्नलिखित तरह से हो सकता है (इस उदाहरण में म्युटेशन को addMovie
कहा गया है):
ध्यान दें कि क्वेरी में डेटा के मान और प्रकार दोनों दिखाए गए हैं।
इसके अतिरिक्त, डेटाबेस एक परिवर्तन ऑपरेशन को समर्थन करता है, जिसे addPerson
नामक किया गया है, जो व्यक्तियों के निर्माण की अनुमति देता है साथ ही उनके मौजूदा दोस्तों और फिल्मों के संबंधों को बनाने के लिए। महत्वपूर्ण है कि दोस्त और फिल्में डेटाबेस में पहले से मौजूद होनी चाहिए इन्हें नवनिर्मित व्यक्ति से जोड़ने से पहले।
एपीआई अनुरोध में बैचिंग ब्रूट-फोर्स
यह जानकारी https://lab.wallarm.com/graphql-batching-attack/ से ली गई है। विभिन्न क्रेडेंशियल्स के साथ कई क्वेरी एक साथ भेजकर प्रमाणीकरण करना GraphQL एपीआई के माध्यम से। यह एक क्लासिक ब्रूट फोर्स हमला है, लेकिन अब GraphQL बैचिंग की सुविधा के कारण एक HTTP अनुरोध में एक से अधिक लॉगिन/पासवर्ड पेयर भेजना संभव है। यह दृष्टिकोण बाहरी दर निगरानी एप्लिकेशनों को धोखा देगा कि सब कुछ ठीक है और कोई ब्रूट-फोर्सिंग बॉट पासवर्ड को अनुमान लगाने की कोशिश नहीं कर रहा है।
नीचे आप एक एप्लिकेशन प्रमाणीकरण अनुरोध का सबसे सरल प्रदर्शन देख सकते हैं, तीन विभिन्न ईमेल/पासवर्ड पेयर एक साथ। स्पष्ट है कि इसी तरह एक ही अनुरोध में हजारों भेजना संभव है:
हम जवाब स्क्रीनशॉट से देख सकते हैं कि पहला और तीसरा अनुरोध null लौटाए और त्रुटि खंड में संबंधित जानकारी को प्रकट किया। दूसरा म्युटेशन सही प्रमाणीकरण डेटा रखता था और प्रतिक्रिया में सही प्रमाणीकरण सत्र टोकन है।
इंट्रोस्पेक्शन के बिना GraphQL
अधिकांश graphql एंडपॉइंट्स इंट्रोस्पेक्शन को अक्षम कर रहे हैं। हालांकि, जब एक अप्रत्याशित अनुरोध प्राप्त होता है, तो graphql द्वारा फेंकी गई त्रुटियाँ clairvoyance जैसे उपकरणों के लिए पर्याप्त हैं ताकि वे स्कीमा का अधिकांश हिस्सा पुनर्रचित कर सकें।
इसके अतिरिक्त, Burp Suite एक्सटेंशन GraphQuail एक्सटेंशन Burp के माध्यम से जा रहे GraphQL एपीआई अनुरोधों को ध्यान से देखता है और प्रत्येक नए क्वेरी के साथ एक आंतरिक GraphQL स्कीमा बनाता है। यह ग्राफ़िक्स को GraphiQL और Voyager के लिए उजागर कर सकता है। एक्सटेंशन एक नकली प्रतिक्रिया लौटाता है जब इंट्रोस्पेक्शन क्वेरी प्राप्त होती है। इसके परिणामस्वरूप, GraphQuail सभी क्वेरी, तर्क और फ़ील्ड्स को प्रदर्शित करता है जो एपीआई के भीतर उपयोग के लिए उपलब्ध हैं। अधिक जानकारी के लिए यह जांचें।
एक अच्छी वर्डलिस्ट यहाँ से पाई जा सकती है।
GraphQL इंट्रोस्पेक्शन रोकने की रक्षा को छलना
GraphQL इंट्रोस्पेक्शन रक्षा को छलना
एपीआई में इंट्रोस्पेक्शन क्वेरी पर प्रतिबंधों को छलने के लिए, __schema
की शब्दकोश के बाद एक विशेष वर्ण डालना प्रभावी साबित होता है। यह विधि रेगेक्स पैटर्न में सामान्य डेवलपर लापरवाहियों का शोषण करती है जो इंट्रोस्पेक्शन को ब्लॉक करने के लिए __schema
की शब्दकोश पर ध्यान केंद्रित करते हैं। जैसे कि अंतरिक्ष, नए लाइन्स, और कमा, जो GraphQL नजरअंदाज करता है लेकिन रेगेक्स में ध्यान नहीं दिया जा सकता है, प्रतिबंधों को टाल दिया जा सकता है। उदाहरण के लिए, __schema
के बाद एक न्यूलाइन के साथ एक इंट्रोस्पेक्शन क्वेरी ऐसे रक्षाओं को छल सकती है:
अगर असफल हो तो विकल्पी अनुरोध विधियों का विचार करें, जैसे कि GET अनुरोध या POST with x-www-form-urlencoded
, क्योंकि प्रतिबंध केवल POST अनुरोधों पर लागू हो सकते हैं।
उजागर GraphQL संरचनाएँ खोजना
जब अंतर्निहितीकरण अक्षम होता है, तो जावास्क्रिप्ट लाइब्रेरी में पूर्व-लोड क्वेरीज के लिए वेबसाइट के स्रोत को जांचना एक उपयुक्त रणनीति है। इन क्वेरीज को डेवलपर टूल्स में Sources
टैब का उपयोग करके पाया जा सकता है, जो API की स्कीमा में अंतर्निहित और संभावित रूप से उजागर संवेदनशील क्वेरीज को प्रकट कर सकता है। डेवलपर टूल्स में खोज करने के लिए निम्नलिखित कमांड हैं:
GraphQL में CSRF
यदि आपको CSRF क्या है इसका पता नहीं है तो निम्नलिखित पृष्ठ को पढ़ें:
pageCSRF (Cross Site Request Forgery)वहां आपको कई GraphQL endpoints मिलेंगे जो CSRF टोकन के बिना कॉन्फ़िगर किए गए हैं।
ध्यान दें कि GraphQL अनुरोध आम तौर पर Content-Type application/json
का उपयोग करके POST अनुरोधों के माध्यम से भेजे जाते हैं।
हालांकि, अधिकांश GraphQL endpoints भी form-urlencoded
POST requests का समर्थन करते हैं:
इसलिए, जैसे ही पिछले जैसे CSRF अनुरोध प्रीफ्लाइट अनुरोध के बिना भेजे जाते हैं, GraphQL में CSRF का दुरुपयोग करके परिवर्तन करना संभव है।
हालांकि, ध्यान दें कि Chrome के samesite
ध्वज का नया डिफ़ॉल्ट कुकी मान Lax
है। इसका मतलब है कि कुकी केवल तीसरे पक्ष वेब से GET अनुरोधों में भेजी जाएगी।
ध्यान दें कि यह सामान्यत: संभावना है कि क्वेरी अनुरोध को भी GET अनुरोध के रूप में भेजा जा सकता है और CSRF टोकन को GET अनुरोध में सत्यापित नहीं किया जा सकता है।
इसके अलावा, XS-Search हमला का दुरुपयोग करके GraphQL एंडपॉइंट से सामग्री को उद्धारण करना संभव हो सकता है उपयोगकर्ता के प्रमाणों का दुरुपयोग करके।
अधिक जानकारी के लिए यहाँ मूल पोस्ट देखें।
GraphQL में अधिकृति
एंडपॉइंट पर परिभाषित कई GraphQL फ़ंक्शन श्रोता की प्रमाणीकरण की जांच कर सकते हैं लेकिन अधिकृति की नहीं।
क्वेरी इनपुट वेरिएबल को संवेदनशील खाता विवरणों की ओर ले जाने का कारण बन सकता है लीक।
म्युटेशन अकाउंट ले जाने तक भी जा सकता है जब अन्य खाता डेटा को संशोधित करने की कोशिश की जाती है।
GraphQL में अधिकृति को छलकरना
क्वेरीज़ को चेनिंग करके एक कमजोर प्रमाणीकरण प्रणाली को छलकर सकते हैं।
नीचे दिए गए उदाहरण में आप देख सकते हैं कि ऑपरेशन "forgotPassword" है और इसके साथ केवल forgotPassword क्वेरी को कार्यान्वित करना चाहिए। इसे छलकरने के लिए आप एक क्वेरी को जोड़ सकते हैं, इस मामले में हम "register" और एक उपयोगकर्ता चरण को जोड़ते हैं ताकि सिस्टम उसे एक नए उपयोगकर्ता के रूप में पंजीकृत कर सके।
GraphQL में उपयोग करके अलायसेस का उपयोग करके दर सीमाएं छलकरना
GraphQL में, अलायसेस एक शक्तिशाली सुविधा है जो एपीआई अनुरोध करते समय संपत्तियों को स्पष्ट रूप से नामकरण करने की अनुमति देती है। यह क्षमता विशेष रूप से एक ही अनुरोध में एक ही प्रकार के वस्तुओं के अनुसंधान के लिए उपयोगी है। अलायसेस का उपयोग उन ग्रेफ़क्यूएल वस्तुओं की सीमा को पार करने के लिए किया जा सकता है जिनके पास एक ही नाम वाली कई संपत्तियाँ नहीं हो सकती।
GraphQL अलायसेस के विस्तृत समझने के लिए, निम्नलिखित संसाधन की सिफारिश की जाती है: अलायसेस।
जबकि अलायसेस का मुख्य उद्देश्य अनेक एपीआई कॉल की आवश्यकता को कम करना है, एक अनजाने उपयोग मामला पहचाना गया है जहाँ अलायसेस का उपयोग करके ग्राफ़क्यूएल एंडपॉइंट पर ब्रूट फ़ोर्स हमले को क्रियान्वित किया जा सकता है। यह संभव है क्योंकि कुछ एंडपॉइंट्स को एचटीटीपी अनुरोधों की संख्या को प्रतिबंधित करके ब्रूट फ़ोर्स हमलों को रोकने के लिए रेट लिमिटर से संरक्षित किया गया है। हालांकि, ये रेट लिमिटर्स शायद प्रत्येक अनुरोध के भीतर कार्रवाईयों की संख्या को ध्यान में न रखें। जैसा कि अलायसेस एक ही एचटीटीपी अनुरोध में कई क्वेरीज़ को शामिल करने की अनुमति देते हैं, वे ऐसी रेट सीमाएं चक्कू लगाने की उपायुक्तता को दूर कर सकते हैं।
नीचे प्रदान किए गए उदाहरण को ध्यान से देखें, जो दिखाता है कि कैसे अलायस्ड क्वेरीज़ का उपयोग करके स्टोर डिस्काउंट कोड की वैधता की जा सकती है। यह विधि दर सीमाएं छलने के लिए हो सकती है क्योंकि यह कई क्वेरीज़ को एक ही एचटीटीपी अनुरोध में संकलित करती है, संभावना से एक साथ कई डिस्काउंट कोड की पुष्टि करने की अनुमति देती है।
उपकरण
सुरक्षा दोष स्कैनर
https://github.com/gsmith257-cyber/GraphCrawler: टूलकिट जिसका उपयोग स्कीमा पकड़ने और संवेदनशील डेटा की खोज करने, अधिकृति का परीक्षण करने, ब्रूट फोर्स स्कीमा, और दिए गए प्रकार के लिए पथ खोजने के लिए किया जा सकता है।
https://blog.doyensec.com/2020/03/26/graphql-scanner.html: स्वतंत्र रूप से या Burp एक्सटेंशन के रूप में उपयोग किया जा सकता है।
https://github.com/swisskyrepo/GraphQLmap: CLI क्लाइंट के रूप में भी उपयोग किया जा सकता है और हमले को स्वचालित करने के लिए।
https://gitlab.com/dee-see/graphql-path-enum: एक टूल जो एक दिए गए प्रकार तक पहुंचने के विभिन्न तरीके सूचीबद्ध करता है।
https://github.com/doyensec/inql: उन्नत GraphQL परीक्षण के लिए बर्प एक्सटेंशन। स्कैनर InQL v5.0 का मूल है, जहां आप एक GraphQL एंडप्वाइंट या स्थानीय आंतरज्ञान स्कीमा फ़ाइल का विश्लेषण कर सकते हैं। यह सभी संभावित क्वेरी और म्युटेशन को स्वचालित रूप से उत्पन्न करता है, उन्हें आपके विश्लेषण के लिए एक संरचित दृश्य में संगठित करता है। हमलावर घटक आपको बैच GraphQL हमलों को चलाने देता है, जो गलती से लागू किए गए दर सीमाओं को घेरने के लिए उपयोगी हो सकता है।
क्लाइंट
https://github.com/graphql/graphiql: GUI क्लाइंट
https://altair.sirmuel.design/: GUI क्लाइंट
स्वचालित परीक्षण
AutoGraphQL को समझाने वाला वीडियो: https://www.youtube.com/watch?v=JJmufWfVvyU
संदर्भ
Last updated