diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 4413efa5e..eff450d0f 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -27,11 +27,11 @@ GraphQL को **REST API के लिए एक प्रभावी वि ### फिंगरप्रिंट -उपकरण [**graphw00f**](https://github.com/dolevf/graphw00f) यह पहचानने में सक्षम है कि सर्वर में कौन सा GraphQL इंजन उपयोग किया जा रहा है और फिर सुरक्षा ऑडिटर के लिए कुछ सहायक जानकारी प्रिंट करता है। +उपकरण [**graphw00f**](https://github.com/dolevf/graphw00f) यह पहचानने में सक्षम है कि किसी सर्वर में कौन सा GraphQL इंजन उपयोग किया जा रहा है और फिर सुरक्षा ऑडिटर के लिए कुछ सहायक जानकारी प्रिंट करता है। #### यूनिवर्सल क्वेरीज़ -यह जांचने के लिए कि क्या एक URL एक GraphQL सेवा है, एक **यूनिवर्सल क्वेरी**, `query{__typename}`, भेजी जा सकती है। यदि प्रतिक्रिया में `{"data": {"__typename": "Query"}}` शामिल है, तो यह पुष्टि करता है कि URL एक GraphQL एंडपॉइंट होस्ट करता है। यह विधि GraphQL के `__typename` फ़ील्ड पर निर्भर करती है, जो क्वेरी की गई वस्तु के प्रकार को प्रकट करती है। +यह जांचने के लिए कि क्या एक URL एक GraphQL सेवा है, एक **यूनिवर्सल क्वेरी**, `query{__typename}`, भेजी जा सकती है। यदि प्रतिक्रिया में `{"data": {"__typename": "Query"}}` शामिल है, तो यह पुष्टि करता है कि URL एक GraphQL एंडपॉइंट होस्ट करता है। यह विधि GraphQL के `__typename` फ़ील्ड पर निर्भर करती है, जो क्वेरी किए गए ऑब्जेक्ट के प्रकार को प्रकट करती है। ```javascript query{__typename} ``` @@ -45,7 +45,7 @@ Schema जानकारी खोजने के लिए introspection क ```bash query={__schema{types{name,fields{name}}}} ``` -इस क्वेरी के साथ आप सभी प्रकारों के नाम पाएंगे जो उपयोग किए जा रहे हैं: +इस क्वेरी के साथ आप सभी प्रकारों के नाम पाएंगे जो उपयोग में हैं: ![](<../../images/image (1036).png>) ```bash @@ -172,15 +172,15 @@ name अब जब हम जानते हैं कि डेटाबेस के अंदर किस प्रकार की जानकारी सहेजी गई है, तो चलिए **कुछ मान निकालने** की कोशिश करते हैं। -इंट्रोस्पेक्शन में आप **कौन सा ऑब्जेक्ट आप सीधे क्वेरी कर सकते हैं** यह जान सकते हैं (क्योंकि आप केवल इसलिए क्वेरी नहीं कर सकते कि एक ऑब्जेक्ट मौजूद है)। निम्नलिखित छवि में आप देख सकते हैं कि "_queryType_" को "_Query_" कहा जाता है और "_Query_" ऑब्जेक्ट के फ़ील्ड में से एक "_flags_" है, जो एक ऑब्जेक्ट का प्रकार भी है। इसलिए आप फ्लैग ऑब्जेक्ट को क्वेरी कर सकते हैं। +इंट्रोस्पेक्शन में आप **यह पता लगा सकते हैं कि आप किस ऑब्जेक्ट के लिए सीधे क्वेरी कर सकते हैं** (क्योंकि आप केवल इसलिए क्वेरी नहीं कर सकते कि ऑब्जेक्ट मौजूद है)। निम्नलिखित छवि में आप देख सकते हैं कि "_queryType_" को "_Query_" कहा जाता है और "_Query_" ऑब्जेक्ट के फ़ील्ड में से एक "_flags_" है, जो एक ऑब्जेक्ट का प्रकार भी है। इसलिए आप फ्लैग ऑब्जेक्ट के लिए क्वेरी कर सकते हैं। ![](<../../images/Screenshot from 2021-03-13 18-17-48.png>) -ध्यान दें कि क्वेरी का प्रकार "_flags_" है "_Flags_", और इस ऑब्जेक्ट को नीचे परिभाषित किया गया है: +ध्यान दें कि क्वेरी का प्रकार "_flags_" है "_Flags_" और यह ऑब्जेक्ट नीचे परिभाषित है: ![](<../../images/Screenshot from 2021-03-13 18-22-57 (1).png>) -आप देख सकते हैं कि "_Flags_" ऑब्जेक्ट **name** और **value** से मिलकर बने हैं। फिर आप क्वेरी के साथ सभी फ्लैग के नाम और मान प्राप्त कर सकते हैं: +आप देख सकते हैं कि "_Flags_" ऑब्जेक्ट **name** और **value** से मिलकर बने हैं। फिर आप क्वेरी के साथ फ्लैग के सभी नाम और मान प्राप्त कर सकते हैं: ```javascript query={flags{name, value}} ``` @@ -201,10 +201,10 @@ query = { hiddenFlags } ![](<../../images/image (1042).png>) -ऐसा लगता है कि यह किसी तरह "_**uid**_" तर्क का उपयोग करके खोज करेगा, जो _**Int**_ प्रकार का है।\ +ऐसा लगता है कि यह किसी तरह "_**uid**_" तर्क का उपयोग करके खोज करेगा जो _**Int**_ प्रकार का है।\ खैर, हम पहले से ही जानते थे कि, [Basic Enumeration](graphql.md#basic-enumeration) अनुभाग में एक क्वेरी प्रस्तावित की गई थी जो हमें सभी आवश्यक जानकारी दिखा रही थी: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}` -यदि आप प्रदान की गई छवि को पढ़ते हैं जब मैं उस क्वेरी को चलाता हूँ, तो आप देखेंगे कि "_**user**_" के पास **arg** "_**uid**_" _Int_ प्रकार का था। +यदि आप प्रदान की गई छवि को पढ़ते हैं जब मैं उस क्वेरी को चलाता हूँ तो आप देखेंगे कि "_**user**_" के पास _Int_ प्रकार का **arg** "_**uid**_" था। तो, कुछ हल्की _**uid**_ ब्रूटफोर्स करते हुए मैंने पाया कि _**uid**=**1**_ पर एक उपयोगकर्ता नाम और पासवर्ड प्राप्त हुआ:\ `query={user(uid:1){user,password}}` @@ -217,13 +217,13 @@ query = { hiddenFlags } और **enumeration phase** के दौरान मैंने खोजा कि "_**dbuser**_" ऑब्जेक्ट के पास "_**user**_" और "_**password**_" के रूप में फ़ील्ड थे। -**Query string dump trick (धन्यवाद @BinaryShadow\_)** +**Query string dump trick (thanks to @BinaryShadow\_)** -यदि आप एक स्ट्रिंग प्रकार द्वारा खोज सकते हैं, जैसे: `query={theusers(description: ""){username,password}}` और आप **खाली स्ट्रिंग** के लिए **खोजते हैं** तो यह **सभी डेटा डंप करेगा**। (_इस उदाहरण को ट्यूटोरियल के उदाहरण से संबंधित नहीं माना जाता है, इस उदाहरण के लिए मान लें कि आप "**theusers**" को एक स्ट्रिंग फ़ील्ड "**description**" द्वारा खोज सकते हैं_)। +यदि आप एक स्ट्रिंग प्रकार द्वारा खोज सकते हैं, जैसे: `query={theusers(description: ""){username,password}}` और आप **खाली स्ट्रिंग** के लिए **खोजते हैं** तो यह **सभी डेटा डंप करेगा**। (_इस उदाहरण को ट्यूटोरियल के उदाहरण से संबंधित नहीं माना जाता है, इस उदाहरण के लिए मान लें कि आप "**theusers**" को "**description**" नामक स्ट्रिंग फ़ील्ड द्वारा खोज सकते हैं_)। -### खोज +### Searching -इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियों** की पहचान उनके **ईमेल** और **नाम** से होती है; **फिल्मों** की पहचान उनके **नाम** और **रेटिंग** से होती है। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और भी फिल्में रख सकती हैं, जो डेटाबेस के भीतर संबंधों को इंगित करती हैं। +इस सेटअप में, एक **database** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** द्वारा पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** द्वारा। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्में भी रख सकती हैं, जो डेटाबेस के भीतर संबंधों को इंगित करती हैं। आप **नाम** द्वारा व्यक्तियों की **खोज** कर सकते हैं और उनके ईमेल प्राप्त कर सकते हैं: ```javascript @@ -285,11 +285,11 @@ name **म्यूटेशन सर्वर-साइड में परिवर्तन करने के लिए उपयोग किए जाते हैं।** -**इंट्रोस्पेक्शन** में आप **घोषित** **म्यूटेशन** पा सकते हैं। निम्नलिखित चित्र में "_MutationType_" को "_Mutation_" कहा जाता है और "_Mutation_" ऑब्जेक्ट में म्यूटेशन के नाम होते हैं (जैसे कि इस मामले में "_addPerson_"): +**इंट्रोस्पेक्शन** में आप **घोषित** **म्यूटेशन** पा सकते हैं। निम्नलिखित छवि में "_MutationType_" को "_Mutation_" कहा जाता है और "_Mutation_" ऑब्जेक्ट में म्यूटेशन के नाम होते हैं (जैसे कि इस मामले में "_addPerson_"): ![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>) -इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियों** की पहचान उनके **ईमेल** और **नाम** से होती है; **फिल्मों** की पहचान उनके **नाम** और **रेटिंग** से होती है। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त बन सकती हैं और फिल्में भी रख सकती हैं, जो डेटाबेस के भीतर संबंधों को दर्शाती हैं। +इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** से पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** से। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्मों का भी होना दर्शाता है कि डेटाबेस के भीतर संबंध हैं। डेटाबेस के भीतर **नई** फिल्मों को **बनाने** के लिए एक म्यूटेशन इस प्रकार हो सकता है (इस उदाहरण में म्यूटेशन को `addMovie` कहा जाता है): ```javascript @@ -304,7 +304,7 @@ rating ``` **नोट करें कि कैसे दोनों मान और डेटा के प्रकार को क्वेरी में दर्शाया गया है।** -इसके अतिरिक्त, डेटाबेस एक **म्यूटेशन** ऑपरेशन का समर्थन करता है, जिसका नाम `addPerson` है, जो **व्यक्तियों** के निर्माण की अनुमति देता है साथ ही उनके मौजूदा **दोस्तों** और **फिल्मों** के साथ संबंध बनाने की भी। यह महत्वपूर्ण है कि दोस्तों और फिल्मों को नए बनाए गए व्यक्ति से लिंक करने से पहले डेटाबेस में पहले से मौजूद होना चाहिए। +इसके अतिरिक्त, डेटाबेस एक **mutation** ऑपरेशन का समर्थन करता है, जिसका नाम `addPerson` है, जो **persons** के निर्माण की अनुमति देता है साथ ही उनके मौजूदा **friends** और **movies** के साथ संबंध बनाने की भी। यह महत्वपूर्ण है कि दोस्तों और फिल्मों को नए बनाए गए व्यक्ति से जोड़ने से पहले डेटाबेस में पहले से मौजूद होना चाहिए। ```javascript mutation { addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) { @@ -334,7 +334,7 @@ releaseYear ``` ### Directive Overloading -जैसा कि [**इस रिपोर्ट में वर्णित एक कमजोरियों में**](https://www.landh.tech/blog/20240304-google-hack-50000/) में समझाया गया है, एक निर्देश ओवरलोडिंग का मतलब है कि एक निर्देश को लाखों बार कॉल करना ताकि सर्वर ऑपरेशनों को बर्बाद करे जब तक कि इसे DoS करना संभव न हो। +जैसा कि [**इस रिपोर्ट में वर्णित एक कमजोरियों में**](https://www.landh.tech/blog/20240304-google-hack-50000/) में समझाया गया है, एक directive overloading का मतलब है कि एक directive को लाखों बार कॉल करना ताकि सर्वर ऑपरेशनों को बर्बाद करे जब तक कि इसे DoS करना संभव न हो। ### Batching brute-force in 1 API request @@ -351,15 +351,15 @@ GraphQL API के माध्यम से **विभिन्न क्र ## GraphQL Without Introspection -越来越多的**graphql端点正在禁用自省**。然而,当收到意外请求时,graphql抛出的错误足以让像[**clairvoyance**](https://github.com/nikitastupin/clairvoyance)这样的工具重建大部分架构。 +越来越多的 **graphql 端点正在禁用 introspection**。然而,当收到意外请求时,graphql 抛出的错误足以让像 [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) 这样的工具重建大部分架构。 -此外,Burp Suite扩展[**GraphQuail**](https://github.com/forcesunseen/graphquail)扩展**观察通过Burp的GraphQL API请求**并**构建**一个内部GraphQL**架构**,每当它看到新的查询时。它还可以为GraphiQL和Voyager公开架构。当它收到自省查询时,扩展返回一个假响应。因此,GraphQuail显示所有可用于API的查询、参数和字段。有关更多信息,请[**查看此处**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。 +此外,Burp Suite 扩展 [**GraphQuail**](https://github.com/forcesunseen/graphquail) 扩展 **观察通过 Burp 的 GraphQL API 请求** 并 **构建** 一个内部 GraphQL **架构**,每当它看到新的查询时。它还可以为 GraphiQL 和 Voyager 暴露架构。当它收到 introspection 查询时,扩展返回一个假响应。因此,GraphQuail 显示所有可用于 API 的查询、参数和字段。有关更多信息,请 [**查看此处**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。 -一个很好的**单词列表**可以在这里发现[**GraphQL实体**](https://github.com/Escape-Technologies/graphql-wordlist?)。 +一个不错的 **wordlist** 来发现 [**GraphQL 实体可以在这里找到**](https://github.com/Escape-Technologies/graphql-wordlist?)。 ### Bypassing GraphQL introspection defences -API中的自省查询限制可以通过在`__schema`关键字后插入**特殊字符**来绕过。此方法利用了开发人员在正则表达式模式中的常见疏忽,这些模式旨在通过关注`__schema`关键字来阻止自省。通过添加像**空格、新行和逗号**这样的字符,GraphQL会忽略这些字符,但在正则表达式中可能没有考虑到,因此可以绕过限制。例如,带有换行符的自省查询在`__schema`之后可能会绕过此类防御: +API 中对 introspection 查询的限制可以通过在 `__schema` 关键字后插入 **特殊字符** 来绕过。此方法利用了开发人员在正则表达式模式中的常见疏忽,这些模式旨在通过关注 `__schema` 关键字来阻止 introspection。通过添加像 **空格、换行符和逗号** 这样的字符,GraphQL 会忽略这些字符,但正则表达式可能没有考虑到,因此可以绕过限制。例如,带有换行符的 introspection 查询在 `__schema` 之后可能会绕过此类防御: ```bash # Example with newline to bypass { @@ -397,7 +397,7 @@ ws.send(JSON.stringify(graphqlMsg)) ``` ### **खुली GraphQL संरचनाओं का पता लगाना** -जब अंतर्दृष्टि अक्षम होती है, तो JavaScript पुस्तकालयों में प्रीलोडेड क्वेरीज़ के लिए वेबसाइट के स्रोत कोड की जांच करना एक उपयोगी रणनीति है। ये क्वेरीज़ डेवलपर टूल्स में `Sources` टैब का उपयोग करके पाई जा सकती हैं, जो API के स्कीमा के बारे में जानकारी प्रदान करती हैं और संभावित रूप से **खुली संवेदनशील क्वेरीज़** को उजागर करती हैं। डेवलपर टूल्स में खोजने के लिए कमांड हैं: +जब अंतर्दृष्टि अक्षम होती है, तो JavaScript पुस्तकालयों में प्रीलोडेड क्वेरीज़ के लिए वेबसाइट के स्रोत कोड की जांच करना एक उपयोगी रणनीति है। इन क्वेरीज़ को डेवलपर टूल्स में `Sources` टैब का उपयोग करके पाया जा सकता है, जो API के स्कीमा के बारे में जानकारी प्रदान करता है और संभावित रूप से **खुली संवेदनशील क्वेरीज़** को उजागर करता है। डेवलपर टूल्स में खोजने के लिए कमांड हैं: ```javascript Inspect/Sources/"Search all files" file:* mutation @@ -427,13 +427,13 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ध्यान दें कि आमतौर पर **क्वेरी** **अनुरोध** को **GET** **अनुरोध** के रूप में भेजना भी संभव है और CSRF टोकन को GET अनुरोध में मान्य नहीं किया जा सकता है। -इसके अलावा, [**XS-Search**](../../pentesting-web/xs-search/index.html) **हमले** का दुरुपयोग करके GraphQL एंडपॉइंट से सामग्री को उपयोगकर्ता के क्रेडेंशियल्स का दुरुपयोग करके निकालना संभव हो सकता है। +इसके अलावा, [**XS-Search**](../../pentesting-web/xs-search/index.html) **हमले** का दुरुपयोग करके GraphQL अंत बिंदु से सामग्री को उपयोगकर्ता के क्रेडेंशियल्स का दुरुपयोग करके निकालना संभव हो सकता है। -अधिक जानकारी के लिए **यहां मूल पोस्ट देखें** [**यहां**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)। +अधिक जानकारी के लिए **यहां** [**मूल पोस्ट देखें**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)। ## GraphQL में क्रॉस-साइट वेबसॉकेट हाइजैकिंग -GraphQL का दुरुपयोग करते हुए CRSF कमजोरियों के समान, यह भी संभव है कि **क्रॉस-साइट वेबसॉकेट हाइजैकिंग का प्रदर्शन किया जाए ताकि GraphQL के साथ असुरक्षित कुकीज़ के साथ प्रमाणीकरण का दुरुपयोग किया जा सके** और उपयोगकर्ता को GraphQL में अप्रत्याशित क्रियाएँ करने के लिए मजबूर किया जा सके। +GraphQL का दुरुपयोग करते हुए CRSF कमजोरियों के समान, **क्रॉस-साइट वेबसॉकेट हाइजैकिंग** करना भी संभव है ताकि GraphQL के साथ असुरक्षित कुकीज़ के साथ प्रमाणीकरण का दुरुपयोग किया जा सके और उपयोगकर्ता को GraphQL में अप्रत्याशित क्रियाएँ करने के लिए मजबूर किया जा सके। अधिक जानकारी के लिए देखें: @@ -443,7 +443,7 @@ GraphQL का दुरुपयोग करते हुए CRSF कमजो ## GraphQL में प्राधिकरण -एंडपॉइंट पर परिभाषित कई GraphQL कार्य केवल अनुरोधकर्ता की प्रमाणीकरण की जांच कर सकते हैं लेकिन प्राधिकरण की नहीं। +अंत बिंदु पर परिभाषित कई GraphQL कार्य केवल अनुरोधकर्ता की प्रमाणीकरण की जांच कर सकते हैं लेकिन प्राधिकरण की नहीं। क्वेरी इनपुट वेरिएबल को संशोधित करने से संवेदनशील खाता विवरण [लीक](https://hackerone.com/reports/792927) हो सकते हैं। @@ -469,7 +469,7 @@ GraphQL में, उपनाम एक शक्तिशाली विश GraphQL उपनामों की विस्तृत समझ के लिए, निम्नलिखित संसाधन की सिफारिश की जाती है: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases)। -हालांकि उपनामों का प्राथमिक उद्देश्य कई API कॉल की आवश्यकता को कम करना है, एक अनपेक्षित उपयोग का मामला पहचाना गया है जहां उपनामों का उपयोग GraphQL एंडपॉइंट पर ब्रूट फोर्स हमलों को निष्पादित करने के लिए किया जा सकता है। यह संभव है क्योंकि कुछ एंडपॉइंट्स को दर सीमित करने वालों द्वारा सुरक्षित किया गया है जो HTTP अनुरोधों की **संख्या** को सीमित करके ब्रूट फोर्स हमलों को रोकने के लिए डिज़ाइन किए गए हैं। हालाँकि, ये दर सीमित करने वाले प्रत्येक अनुरोध के भीतर संचालन की संख्या को ध्यान में नहीं रख सकते हैं। चूंकि उपनाम एक ही HTTP अनुरोध में कई क्वेरी शामिल करने की अनुमति देते हैं, वे ऐसी दर सीमित करने वाली उपायों को बायपास कर सकते हैं। +हालांकि उपनामों का प्राथमिक उद्देश्य कई API कॉल की आवश्यकता को कम करना है, एक अनपेक्षित उपयोग का मामला पहचाना गया है जहां उपनामों का उपयोग GraphQL एंडपॉइंट पर ब्रूट फोर्स हमलों को निष्पादित करने के लिए किया जा सकता है। यह संभव है क्योंकि कुछ एंडपॉइंट्स को दर सीमित करने वालों द्वारा सुरक्षित किया गया है जो ब्रूट फोर्स हमलों को रोकने के लिए **HTTP अनुरोधों की संख्या** को सीमित करते हैं। हालाँकि, ये दर सीमित करने वाले प्रत्येक अनुरोध के भीतर संचालन की संख्या को ध्यान में नहीं रख सकते हैं। चूंकि उपनाम एक ही HTTP अनुरोध में कई क्वेरी शामिल करने की अनुमति देते हैं, वे ऐसी दर सीमित करने वाली उपायों को बायपास कर सकते हैं। नीचे दिए गए उदाहरण पर विचार करें, जो दिखाता है कि कैसे उपनामित क्वेरी का उपयोग स्टोर डिस्काउंट कोड की वैधता की पुष्टि करने के लिए किया जा सकता है। यह विधि दर सीमित करने को बायपास कर सकती है क्योंकि यह कई क्वेरी को एक HTTP अनुरोध में संकलित करती है, संभावित रूप से कई डिस्काउंट कोड की एक साथ पुष्टि करने की अनुमति देती है। ```bash @@ -490,7 +490,7 @@ valid ### Alias Overloading -**Alias Overloading** एक GraphQL कमजोरी है जहाँ हमलावर एक ही फ़ील्ड के लिए कई उपनामों के साथ एक क्वेरी को ओवरलोड करते हैं, जिससे बैकएंड रिसोल्वर उस फ़ील्ड को बार-बार निष्पादित करता है। इससे सर्वर संसाधनों पर दबाव पड़ सकता है, जिससे **Denial of Service (DoS)** हो सकता है। उदाहरण के लिए, नीचे दिए गए क्वेरी में, एक ही फ़ील्ड (`expensiveField`) को उपनामों का उपयोग करके 1,000 बार अनुरोध किया गया है, जिससे बैकएंड को इसे 1,000 बार गणना करने के लिए मजबूर किया जाता है, जो CPU या मेमोरी को संभावित रूप से समाप्त कर सकता है: +**Alias Overloading** एक GraphQL कमजोरी है जहाँ हमलावर एक ही फ़ील्ड के लिए कई उपनामों के साथ एक क्वेरी को ओवरलोड करते हैं, जिससे बैकएंड रिसोल्वर उस फ़ील्ड को बार-बार निष्पादित करता है। इससे सर्वर संसाधनों पर दबाव पड़ सकता है, जिससे **Denial of Service (DoS)** हो सकता है। उदाहरण के लिए, नीचे दी गई क्वेरी में, एक ही फ़ील्ड (`expensiveField`) को उपनामों का उपयोग करके 1,000 बार अनुरोध किया गया है, जिससे बैकएंड को इसे 1,000 बार गणना करने के लिए मजबूर किया जाता है, जो संभावित रूप से CPU या मेमोरी को समाप्त कर सकता है: ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "Content-Type: application/json" \ @@ -501,7 +501,7 @@ curl -X POST -H "Content-Type: application/json" \ ### **एरे-आधारित क्वेरी बैचिंग** -**एरे-आधारित क्वेरी बैचिंग** एक कमजोरियों है जहाँ एक GraphQL API एकल अनुरोध में कई क्वेरियों को बैच करने की अनुमति देती है, जिससे एक हमलावर को एक साथ बड़ी संख्या में क्वेरियाँ भेजने की अनुमति मिलती है। यह सभी बैच की गई क्वेरियों को समानांतर में निष्पादित करके बैकएंड को अभिभूत कर सकता है, अत्यधिक संसाधनों (CPU, मेमोरी, डेटाबेस कनेक्शन) का उपभोग कर सकता है और संभावित रूप से **सेवा से इनकार (DoS)** का कारण बन सकता है। यदि बैच में क्वेरियों की संख्या पर कोई सीमा नहीं है, तो एक हमलावर इसका लाभ उठाकर सेवा की उपलब्धता को कम कर सकता है। +**एरे-आधारित क्वेरी बैचिंग** एक कमजोरियों है जहाँ एक GraphQL API एकल अनुरोध में कई क्वेरियों को बैच करने की अनुमति देती है, जिससे एक हमलावर को एक साथ बड़ी संख्या में क्वेरियाँ भेजने की अनुमति मिलती है। यह सभी बैच की गई क्वेरियों को समानांतर में निष्पादित करके बैकएंड को अभिभूत कर सकता है, अत्यधिक संसाधनों (CPU, मेमोरी, डेटाबेस कनेक्शन) का उपभोग कर सकता है और संभावित रूप से **सेवा से इनकार (DoS)** की स्थिति पैदा कर सकता है। यदि बैच में क्वेरियों की संख्या पर कोई सीमा नहीं है, तो एक हमलावर इसका लाभ उठाकर सेवा की उपलब्धता को कम कर सकता है। ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -509,11 +509,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \ -d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \ 'https://example.com/graphql' ``` -इस उदाहरण में, 10 विभिन्न क्वेरीज़ को एक अनुरोध में समाहित किया गया है, जिससे सर्वर को सभी को एक साथ निष्पादित करने के लिए मजबूर किया जाता है। यदि बड़े बैच आकार या गणनात्मक रूप से महंगे क्वेरीज़ के साथ इसका शोषण किया जाए, तो यह सर्वर को ओवरलोड कर सकता है। +इस उदाहरण में, 10 विभिन्न क्वेरीज़ को एक अनुरोध में समाहित किया गया है, जिससे सर्वर को सभी को एक साथ निष्पादित करने के लिए मजबूर किया जाता है। यदि इसे बड़े बैच आकार या गणनात्मक रूप से महंगे क्वेरीज़ के साथ शोषित किया जाए, तो यह सर्वर को ओवरलोड कर सकता है। ### **निर्देश ओवरलोडिंग कमजोरियाँ** -**निर्देश ओवरलोडिंग** तब होती है जब एक GraphQL सर्वर अत्यधिक, दोहराए गए निर्देशों के साथ क्वेरीज़ की अनुमति देता है। यह सर्वर के पार्सर और निष्पादक को अभिभूत कर सकता है, विशेष रूप से यदि सर्वर बार-बार समान निर्देश लॉजिक को संसाधित करता है। उचित सत्यापन या सीमाओं के बिना, एक हमलावर इसे कई दोहराए गए निर्देशों के साथ एक क्वेरी तैयार करके शोषण कर सकता है, जिससे उच्च गणनात्मक या मेमोरी उपयोग उत्पन्न होता है, जो **सेवा से इनकार (DoS)** की ओर ले जाता है। +**निर्देश ओवरलोडिंग** तब होती है जब एक GraphQL सर्वर अत्यधिक, दोहराए गए निर्देशों के साथ क्वेरीज़ की अनुमति देता है। यह सर्वर के पार्सर और निष्पादक को अभिभूत कर सकता है, विशेष रूप से यदि सर्वर बार-बार समान निर्देश लॉजिक को प्रोसेस करता है। उचित सत्यापन या सीमाओं के बिना, एक हमलावर इसे कई दोहराए गए निर्देशों के साथ एक क्वेरी तैयार करके शोषित कर सकता है, जिससे उच्च गणनात्मक या मेमोरी उपयोग उत्पन्न होता है, जो **सेवा से इनकार (DoS)** की ओर ले जाता है। ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -550,16 +550,16 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso ### Vulnerability scanners -- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Graphql endpoints की सामान्य गलत कॉन्फ़िगरेशन का परीक्षण करें +- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): GraphQL एंडपॉइंट्स की सामान्य गलत कॉन्फ़िगरेशन का परीक्षण करें - [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): बैच GraphQL क्वेरी और म्यूटेशन करने पर ध्यान केंद्रित करने वाला GraphQL सुरक्षा ऑडिटिंग स्क्रिप्ट। - [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): उपयोग में लाए जा रहे graphql की फिंगरप्रिंटिंग करें -- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): टूलकिट जिसका उपयोग स्कीमाओं को प्राप्त करने और संवेदनशील डेटा की खोज करने, प्राधिकरण का परीक्षण करने, ब्रूट फोर्स स्कीमाओं का परीक्षण करने और एक दिए गए प्रकार के लिए पथ खोजने के लिए किया जा सकता है। +- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): टूलकिट जिसका उपयोग स्कीमाओं को प्राप्त करने और संवेदनशील डेटा की खोज, प्राधिकरण का परीक्षण, ब्रूट फोर्स स्कीमाओं और एक दिए गए प्रकार के लिए पथ खोजने के लिए किया जा सकता है। - [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): इसे स्टैंडअलोन के रूप में या [Burp extension](https://github.com/doyensec/inql) के रूप में उपयोग किया जा सकता है। - [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): इसे CLI क्लाइंट के रूप में भी उपयोग किया जा सकता है ताकि हमलों को स्वचालित किया जा सके - [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): टूल जो **GraphQL स्कीमा में एक दिए गए प्रकार तक पहुँचने के विभिन्न तरीकों** की सूची बनाता है। - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL के स्टैंडअलोन और CLI मोड का उत्तराधिकारी -- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): उन्नत GraphQL परीक्षण के लिए Burp extension। _**Scanner**_ InQL v5.0 का मुख्य भाग है, जहाँ आप एक GraphQL endpoint या एक स्थानीय introspection schema फ़ाइल का विश्लेषण कर सकते हैं। यह सभी संभावित क्वेरी और म्यूटेशन को स्वचालित रूप से उत्पन्न करता है, उन्हें आपके विश्लेषण के लिए एक संरचित दृश्य में व्यवस्थित करता है। _**Attacker**_ घटक आपको बैच GraphQL हमले चलाने की अनुमति देता है, जो खराब कार्यान्वित दर सीमाओं को पार करने के लिए उपयोगी हो सकता है। -- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): कुछ Graphql डेटाबेस की मदद से स्कीमा प्राप्त करने की कोशिश करें जो म्यूटेशन और पैरामीटर के नाम सुझाएंगे, भले ही introspection बंद हो। +- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): उन्नत GraphQL परीक्षण के लिए Burp extension। _**Scanner**_ InQL v5.0 का मुख्य भाग है, जहाँ आप एक GraphQL एंडपॉइंट या एक स्थानीय अंतर्दृष्टि स्कीमा फ़ाइल का विश्लेषण कर सकते हैं। यह सभी संभावित क्वेरी और म्यूटेशन को स्वचालित रूप से उत्पन्न करता है, उन्हें आपके विश्लेषण के लिए एक संरचित दृश्य में व्यवस्थित करता है। _**Attacker**_ घटक आपको बैच GraphQL हमले चलाने की अनुमति देता है, जो खराब कार्यान्वित दर सीमाओं को पार करने के लिए उपयोगी हो सकता है। +- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): कुछ Graphql डेटाबेस की मदद से स्कीमा प्राप्त करने की कोशिश करें जो म्यूटेशन और पैरामीटर के नाम सुझाएंगे, भले ही अंतर्दृष्टि अक्षम हो। ### Clients