Translated ['src/network-services-pentesting/pentesting-web/graphql.md']

This commit is contained in:
Translator 2025-02-05 10:26:12 +00:00
parent e8dcc1b5ad
commit 3dbf3a8572

View File

@ -158,7 +158,7 @@ name
}
}
```
इनलाइन इंट्रोस्पेक्शन क्वेरी:
इनलाइन अंतर्दृष्टि क्वेरी:
```
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
```
@ -176,7 +176,7 @@ name
![](<../../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>)
@ -201,17 +201,17 @@ 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**_" के पास _Int_ प्रकार का **arg** "_**uid**_" था।
यदि आप प्रदान की गई छवि को पढ़ते हैं जब मैं उस क्वेरी को चलाता हूँ, तो आप देखेंगे कि "_**user**_" के पास **arg** "_**uid**_" _Int_ प्रकार का था।
तो, कुछ हल्की _**uid**_ ब्रूटफोर्स करते हुए मैंने पाया कि _**uid**=**1**_ पर एक उपयोगकर्ता नाम और पासवर्ड प्राप्त हुआ:\
`query={user(uid:1){user,password}}`
![](<../../images/image (90).png>)
ध्यान दें कि मैंने **खोजा** कि मैं **पैरामीटर** "_**user**_" और "_**password**_" के लिए पूछ सकता हूँ क्योंकि यदि मैं कुछ ऐसा देखने की कोशिश करता हूँ जो मौजूद नहीं है (`query={user(uid:1){noExists}}`) तो मुझे यह त्रुटि मिलती है:
ध्यान दें कि मैंने **खोजा** कि मैं **पैरामीटर** "_**user**_" और "_**password**_" के लिए पूछ सकता हूँ क्योंकि यदि मैं कुछ ऐसा देखने की कोशिश करता हूँ जो मौजूद नहीं है (`query={user(uid:1){noExists}}`), तो मुझे यह त्रुटि मिलती है:
![](<../../images/image (707).png>)
@ -219,11 +219,11 @@ query = { hiddenFlags }
**Query string dump trick (धन्यवाद @BinaryShadow\_)**
यदि आप एक स्ट्रिंग प्रकार द्वारा खोज सकते हैं, जैसे: `query={theusers(description: ""){username,password}}` और आप **खाली स्ट्रिंग** के लिए **खोजते हैं** तो यह **सभी डेटा डंप करेगा**। (_इस उदाहरण को ट्यूटोरियल के उदाहरण से संबंधित नहीं माना गया है, इस उदाहरण के लिए मान लें कि आप "**theusers**" को "**description**" नामक स्ट्रिंग फ़ील्ड द्वारा खोज सकते हैं_)।
यदि आप एक स्ट्रिंग प्रकार द्वारा खोज सकते हैं, जैसे: `query={theusers(description: ""){username,password}}` और आप **खाली स्ट्रिंग** के लिए **खोजते हैं**, तो यह **सभी डेटा डंप करेगा**। (_इस उदाहरण को ट्यूटोरियल के उदाहरण से संबंधित नहीं माना गया है, इस उदाहरण के लिए मान लें कि आप "**theusers**" को "**description**" नामक स्ट्रिंग फ़ील्ड का उपयोग करके खोज सकते हैं_)।
### खोज
इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** शामिल हैं। **व्यक्तियों** की पहचान उनके **ईमेल** और **नाम** द्वारा की जाती है; **फिल्में** उनके **नाम** और **रेटिंग** द्वारा। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्मों का भी होना दर्शाती हैं, जो डेटाबेस के भीतर संबंधों को इंगित करती हैं
इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** शामिल हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** द्वारा पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** द्वारा। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्मों का भी संबंध रख सकती हैं, जो डेटाबेस के भीतर संबंधों को इंगित करता है
आप **नाम** द्वारा व्यक्तियों की **खोज** कर सकते हैं और उनके ईमेल प्राप्त कर सकते हैं:
```javascript
@ -289,7 +289,7 @@ name
![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>)
इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** से पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** से। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त बन सकती हैं और फिल्में भी रख सकती हैं, जो डेटाबेस के भीतर संबंधों को दर्शाती हैं
इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** से पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** से। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्मों का भी संबंध रख सकती हैं, जो डेटाबेस के भीतर संबंधों को दर्शाता है
डेटाबेस के भीतर **नई** फिल्मों को **बनाने** के लिए एक म्यूटेशन इस प्रकार हो सकता है (इस उदाहरण में म्यूटेशन को `addMovie` कहा जाता है):
```javascript
@ -351,15 +351,15 @@ GraphQL API के माध्यम से **विभिन्न क्र
## GraphQL Without Introspection
越来越多的 **graphql 端点正在禁用 introspection**。然而当收到意外请求时graphql 抛出的错误足以让像 [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) 这样的工具重建大部分架构。
越来越多的**graphql端点正在禁用自省**。然而当收到意外请求时graphql抛出的错误足以让像[**clairvoyance**](https://github.com/nikitastupin/clairvoyance)这样的工具重建大部分架构。
此外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)。
此外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)。
一个很好的 **wordlist** 来发现 [**GraphQL 实体可以在这里找到**](https://github.com/Escape-Technologies/graphql-wordlist?)。
一个很好的**单词列表**可以在这里发现[**GraphQL实体**](https://github.com/Escape-Technologies/graphql-wordlist?)。
### Bypassing GraphQL introspection defences <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
API中的 introspection 查询的限制可以通过在 `__schema` 关键字后插入 **特殊字符** 来绕过。此方法利用了开发人员在正则表达式模式中的常见疏忽,这些模式旨在通过关注 `__schema` 关键字来阻止 introspection。通过添加像 **空格、换行符和逗号** 这样的字符GraphQL 会忽略这些字符,但正则表达式可能没有考虑到,因此可以绕过限制。例如,带有换行符的 introspection 查询可能会绕过此类防御:
API中的自省查询限制可以通过在`__schema`关键字后插入**特殊字符**来绕过。此方法利用了开发人员在正则表达式模式中的常见疏忽,这些模式旨在通过关注`__schema`关键字来阻止自省。通过添加像**空格、新行和逗号**这样的字符GraphQL会忽略这些字符但在正则表达式中可能没有考虑到因此可以绕过限制。例如带有换行符的自省查询`__schema`可能会绕过此类防御:
```bash
# Example with newline to bypass
{
@ -369,9 +369,9 @@ API中的 introspection 查询的限制可以通过在 `__schema` 关键字后
```
यदि असफल रहें, तो वैकल्पिक अनुरोध विधियों पर विचार करें, जैसे **GET अनुरोध** या **POST `x-www-form-urlencoded` के साथ**, क्योंकि प्रतिबंध केवल POST अनुरोधों पर लागू हो सकते हैं।
### वेबसॉकेट्स का प्रयास करें
### WebSockets का प्रयास करें
जैसा कि [**इस वार्ता**](https://www.youtube.com/watch?v=tIo_t5uUK50) में उल्लेख किया गया है, जांचें कि क्या WebSockets के माध्यम से graphQL से कनेक्ट करना संभव हो सकता है क्योंकि यह आपको संभावित WAF को बायपास करने की अनुमति दे सकता है और वेबसॉकेट संचार को graphQL के स्कीमा को लीक करने दे सकता है:
जैसा कि [**इस वार्ता**](https://www.youtube.com/watch?v=tIo_t5uUK50) में उल्लेख किया गया है, जांचें कि क्या WebSockets के माध्यम से graphQL से कनेक्ट करना संभव हो सकता है, क्योंकि यह आपको संभावित WAF को बायपास करने की अनुमति दे सकता है और वेबसॉकेट संचार को graphQL के स्कीमा को लीक करने दे सकता है:
```javascript
ws = new WebSocket("wss://target/graphql", "graphql-ws")
ws.onopen = function start(event) {
@ -397,7 +397,7 @@ ws.send(JSON.stringify(graphqlMsg))
```
### **खुली GraphQL संरचनाओं का पता लगाना**
जब अंतर्दृष्टि अक्षम होती है, तो JavaScript पुस्तकालयों में प्रीलोडेड प्रश्नों के लिए वेबसाइट के स्रोत कोड की जांच करना एक उपयोगी रणनीति है। इन प्रश्नों को डेवलपर टूल्स में `Sources` टैब का उपयोग करके पाया जा सकता है, जो API के स्कीमा के बारे में जानकारी प्रदान करता है और संभावित रूप से **खुली संवेदनशील प्रश्नों** को उजागर करता है। डेवलपर टूल्स में खोजने के लिए आदेश हैं:
जब अंतर्दृष्टि अक्षम होती है, तो JavaScript पुस्तकालयों में प्रीलोडेड क्वेरीज़ के लिए वेबसाइट के स्रोत कोड की जांच करना एक उपयोगी रणनीति है। ये क्वेरीज़ डेवलपर टूल्स में `Sources` टैब का उपयोग करके पाई जा सकती हैं, जो API के स्कीमा के बारे में जानकारी प्रदान करती हैं और संभावित रूप से **खुली संवेदनशील क्वेरीज़** को उजागर करती हैं। डेवलपर टूल्स में खोजने के लिए कमांड हैं:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
@ -429,11 +429,11 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
इसके अलावा, [**XS-Search**](../../pentesting-web/xs-search/index.html) **हमले** का दुरुपयोग करके GraphQL अंत बिंदु से सामग्री को उपयोगकर्ता के क्रेडेंशियल्स का दुरुपयोग करके निकालना संभव हो सकता है।
अधिक जानकारी के लिए **यहां मूल पोस्ट देखें** [**original post here**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)।
अधिक जानकारी के लिए **यहां मूल पोस्ट देखें** [**यहां**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)।
## GraphQL में क्रॉस-साइट वेबसॉकेट हाइजैकिंग
## GraphQL में क्रॉस-साइट वेब सॉकेट हाइजैकिंग
GraphQL का दुरुपयोग करते हुए CRSF कमजोरियों के समान, **क्रॉस-साइट वेबसॉकेट हाइजैकिंग** करना भी संभव है ताकि GraphQL के साथ **असुरक्षित कुकीज़** के साथ प्रमाणीकरण का दुरुपयोग किया जा सके और उपयोगकर्ता को GraphQL में अप्रत्याशित क्रियाएँ करने के लिए मजबूर किया जा सके।
GraphQL का दुरुपयोग करते हुए CRSF कमजोरियों के समान, **क्रॉस-साइट वेब सॉकेट हाइजैकिंग** करना भी संभव है ताकि GraphQL के साथ **असुरक्षित कुकीज़** के साथ प्रमाणीकरण का दुरुपयोग किया जा सके और उपयोगकर्ता को GraphQL में अप्रत्याशित क्रियाएँ करने के लिए मजबूर किया जा सके।
अधिक जानकारी के लिए देखें:
@ -465,13 +465,13 @@ GraphQL का दुरुपयोग करते हुए CRSF कमजो
## GraphQL में उपनामों का उपयोग करके दर सीमाओं को बायपास करना
GraphQL में, उपनाम एक शक्तिशाली विशेषता हैं जो API अनुरोध करते समय **गुणों के नाम को स्पष्ट रूप से**ामित करने की अनुमति देती हैं। यह क्षमता एकल अनुरोध के भीतर **एक ही प्रकार** की वस्तुओं के **कई उदाहरणों** को पुनः प्राप्त करने के लिए विशेष रूप से उपयोगी है। उपनामों का उपयोग उन सीमाओं को पार करने के लिए किया जा सकता है जो GraphQL वस्तुओं को एक ही नाम के साथ कई गुण रखने से रोकती हैं।
GraphQL में, उपनाम एक शक्तिशाली विशेषता हैं जो API अनुरोध करते समय **गुणों के नाम को स्पष्ट रूप से**िर्दिष्ट करने की अनुमति देती हैं। यह क्षमता एकल अनुरोध के भीतर **एक ही प्रकार** की वस्तुओं के **कई उदाहरणों** को पुनः प्राप्त करने के लिए विशेष रूप से उपयोगी है। उपनामों का उपयोग उन सीमाओं को पार करने के लिए किया जा सकता है जो GraphQL वस्तुओं को एक ही नाम के साथ कई गुण रखने से रोकती हैं।
GraphQL उपनामों की विस्तृत समझ के लिए, निम्नलिखित संसाधन की सिफारिश की जाती है: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases)।
हालांकि उपनामों का प्राथमिक उद्देश्य कई API कॉल की आवश्यकता को कम करना है, एक अनपेक्षित उपयोग का मामला पहचाना गया है जहां उपनामों का उपयोग GraphQL एंडपॉइंट पर ब्रूट फोर्स हमलों को निष्पादित करने के लिए किया जा सकता है। यह संभव है क्योंकि कुछ एंडपॉइंट्स को दर सीमित करने वालों द्वारा सरक्षित किया गया है जो ब्रूट फोर्स हमलों को रोकने के लिए **HTTP अनुरोधों की संख्या** को सीमित करते हैं। हालाँकि, ये दर सीमित करने वाले प्रत्येक अनुरोध के भीतर संचालन की संख्या को ध्यान में नहीं रख सकते हैं। चूंकि उपनाम एक ही HTTP अनुरोध में कई क्वेरी शामिल करने की अनुमति देते हैं, वे ऐसी दर सीमित करने वाली उपायों को बायपास कर सकते हैं।
हालांकि उपनामों का प्राथमिक उद्देश्य कई API कॉल की आवश्यकता को कम करना है, एक अनपेक्षित उपयोग का मामला पहचाना गया है जहां उपनामों का उपयोग GraphQL एंडपॉइंट पर ब्रूट फोर्स हमलों को निष्पादित करने के लिए किया जा सकता है। यह संभव है क्योंकि कुछ एंडपॉइंट्स को दर सीमित करने वालों द्वारा सरक्षित किया गया है जो HTTP अनुरोधों की **संख्या** को सीमित करके ब्रूट फोर्स हमलों को रोकने के लिए डिज़ाइन किए गए हैं। हालाँकि, ये दर सीमित करने वाले प्रत्येक अनुरोध के भीतर संचालन की संख्या को ध्यान में नहीं रख सकते हैं। चूंकि उपनाम एक HTTP अनुरोध में कई क्वेरी शामिल करने की अनुमति देते हैं, वे ऐसी दर सीमित करने वाली उपायों को बायपास कर सकते हैं।
नीचे दिए गए उदाहरण पर विचार करें, जो दिखाता है कि कैसे उपनामित क्वेरी का उपयोग स्टोर डिस्काउंट कोड की वैधता की पुष्टि करने के लिए किया जा सकता है। यह विधि दर सीमित करने को बायपास कर सकती है क्योंकि यह कई क्वेर को एक HTTP अनुरोध में संकलित करती है, संभावित रूप से कई डिस्काउंट कोड की एक साथ पुष्टि करने की अनुमति देती है।
नीचे दिए गए उदाहरण पर विचार करें, जो दिखाता है कि कैसे उपनामित क्वेरी का उपयोग स्टोर डिस्काउंट कोड की वैधता की पुष्टि करने के लिए किया जा सकता है। यह विधि दर सीमित करने को बायपास कर सकती है क्योंकि यह कई क्वेरियों को एक HTTP अनुरोध में संकलित करती है, संभावित रूप से कई डिस्काउंट कोड की एक साथ पुष्टि करने की अनुमति देती है।
```bash
# Example of a request utilizing aliased queries to check for valid discount codes
query isValidDiscount($code: Int) {
@ -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" \
@ -561,10 +561,14 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): उन्नत GraphQL परीक्षण के लिए Burp extension या python स्क्रिप्ट। _**Scanner**_ InQL v5.0 का मुख्य भाग है, जहाँ आप एक GraphQL endpoint या एक स्थानीय introspection स्कीमा फ़ाइल का विश्लेषण कर सकते हैं। यह सभी संभावित क्वेरी और म्यूटेशन को स्वचालित रूप से उत्पन्न करता है, उन्हें आपके विश्लेषण के लिए एक संरचित दृश्य में व्यवस्थित करता है। _**Attacker**_ घटक आपको बैच GraphQL हमले चलाने की अनुमति देता है, जो खराब कार्यान्वित दर सीमाओं को पार करने के लिए उपयोगी हो सकता है: `python3 inql.py -t http://example.com/graphql -o output.json`
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): कुछ Graphql डेटाबेस की मदद से स्कीमा प्राप्त करने की कोशिश करें जो म्यूटेशन और पैरामीटर के नाम सुझाएंगे, भले ही introspection अक्षम हो।
### Scripts to exploit common vulnerabilities
- [https://github.com/reycotallo98/pentestScripts/tree/main/GraphQLDoS](https://github.com/reycotallo98/pentestScripts/tree/main/GraphQLDoS): कमजोर graphql वातावरण में सेवा से इनकार की कमजोरियों का शोषण करने के लिए स्क्रिप्टों का संग्रह।
### Clients
- [https://github.com/graphql/graphiql](https://github.com/graphql/graphiql): GUI क्लाइंट
- [https://altair.sirmuel.design/](https://altair.sirmuel.design/): GUI क्लाइंट
- [https://altair.sirmuel.design/](https://altair.sirmuel.design/): GUI Client
### Automatic Tests