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

This commit is contained in:
Translator 2025-01-22 23:11:27 +00:00
parent 8c7592efe0
commit 6c1e7bb2e1

View File

@ -10,9 +10,9 @@ GraphQL **підкреслюється** як **ефективна альтер
З появою нових технологій, включаючи GraphQL, також виникають нові вразливості безпеки. Ключовим моментом є те, що **GraphQL за замовчуванням не включає механізми аутентифікації**. Відповідальність за впровадження таких заходів безпеки лежить на розробниках. Без належної аутентифікації кінцеві точки GraphQL можуть розкривати чутливу інформацію неаутентифікованим користувачам, що становить значний ризик для безпеки.
### Атаки грубої сили на каталоги та GraphQL
### Атаки методом грубої сили на каталоги та GraphQL
Для виявлення відкритих екземплярів GraphQL рекомендується включення специфічних шляхів у атаки грубої сили на каталоги. Ці шляхи:
Для виявлення відкритих екземплярів GraphQL рекомендується включення специфічних шляхів у атаки методом грубої сили на каталоги. Ці шляхи:
- `/graphql`
- `/graphiql`
@ -27,7 +27,7 @@ GraphQL **підкреслюється** як **ефективна альтер
### Відбиток
Інструмент [**graphw00f**](https://github.com/dolevf/graphw00f) здатний виявити, який движок GraphQL використовується на сервері, а потім надрукувати корисну інформацію для аудитора безпеки.
Інструмент [**graphw00f**](https://github.com/dolevf/graphw00f) здатний виявити, який движок GraphQL використовується на сервері, а потім виводить корисну інформацію для аудитора безпеки.
#### Універсальні запити <a href="#universal-queries" id="universal-queries"></a>
@ -45,7 +45,7 @@ Graphql зазвичай підтримує **GET**, **POST** (x-www-form-urlenc
```bash
query={__schema{types{name,fields{name}}}}
```
За допомогою цього запиту ви знайдете назву всіх типів, що використовуються:
За допомогою цього запиту ви знайдете назви всіх типів, що використовуються:
![](<../../images/image (1036).png>)
```bash
@ -158,15 +158,15 @@ 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}+}
```
Останній рядок коду є запитом graphql, який виведе всю метаінформацію з graphql (імена об'єктів, параметри, типи...)
Останній рядок коду - це запит graphql, який виведе всю метаінформацію з graphql (імена об'єктів, параметри, типи...)
![](<../../images/image (363).png>)
Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) для перегляду всіх опцій у графічному інтерфейсі.
Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager), щоб переглянути в графічному інтерфейсі всі опції.
### Запитування
@ -192,8 +192,8 @@ query={flags{name, value}}
```javascript
query = { hiddenFlags }
```
В іншому прикладі було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\
Якщо цим об'єктам не потрібні аргументи для пошуку, можна **отримати всю інформацію з них**, просто **попросивши** дані, які вам потрібні. У цьому прикладі з Інтернету ви могли б витягнути збережені імена користувачів та паролі:
В іншому прикладі, де було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\
Якщо цим об'єктам не потрібні жодні аргументи для пошуку, можна **отримати всю інформацію з них**, просто **попросивши** дані, які вам потрібні. У цьому прикладі з Інтернету ви могли б витягти збережені імена користувачів та паролі:
![](<../../images/image (880).png>)
@ -206,7 +206,7 @@ query = { hiddenFlags }
Якщо ви прочитаєте зображення, надане, коли я запускав цей запит, ви побачите, що "_**user**_" мав **arg** "_**uid**_" типу _Int_.
Отже, виконуючи легкий _**uid**_ брутфорс, я виявив, що при _**uid**=**1**_ було отримано ім'я користувача та пароль:\
Отже, виконуючи легкий _**uid**_ брутфорс, я виявив, що в _**uid**=**1**_ було отримано ім'я користувача та пароль:\
`query={user(uid:1){user,password}}`
![](<../../images/image (90).png>)
@ -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
@ -336,10 +336,10 @@ releaseYear
Як пояснено в [**одній з вразливостей, описаних у цьому звіті**](https://www.landh.tech/blog/20240304-google-hack-50000/), директивне перевантаження передбачає виклик директиви навіть мільйони разів, щоб змусити сервер витрачати ресурси, поки його не буде можливо вивести з ладу (DoS).
### Пакетна брутфорс-атака в 1 API запиті
### Пакетний брутфорс в 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 різними парами електронна пошта/пароль одночасно**. Очевидно, що можливо відправити тисячі в одному запиті таким же чином:
@ -353,13 +353,13 @@ releaseYear
Все більше **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 <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
Щоб обійти обмеження на запити інспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні помилки розробників у шаблонах regex, які намагаються заблокувати інспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але які можуть не бути враховані в regex, можна обійти обмеження. Наприклад, запит на інспекцію з новим рядком після `__schema` може обійти такі захисти:
Щоб обійти обмеження на запити інспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні помилки розробників у шаблонах regex, які намагаються заблокувати інспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але можуть не бути враховані в regex, обмеження можна обійти. Наприклад, запит на інспекцію з новим рядком після `__schema` може обійти такі захисти:
```bash
# Example with newline to bypass
{
@ -425,29 +425,13 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
Однак зверніть увагу, що нове значення за замовчуванням куки для прапора `samesite` у Chrome - `Lax`. Це означає, що куки будуть надсилатися лише з веб-сайту третьої сторони в GET-запитах.
Зверніть увагу, що зазвичай можливо надіслати **запит** **запиту** також як **GET** **запит**, і токен CSRF може не перевірятися в GET-запиті.
Зверніть увагу, що зазвичай можливо надіслати **запит** **запиту** також як **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).
## Викрадення WebSocket між сайтами в GraphQL
Подібно до вразливостей CRSF, зловживаючи GraphQL, також можливо виконати **викрадення WebSocket між сайтами, щоб зловживати аутентифікацією з GraphQL з незахищеними куками** і змусити користувача виконувати неочікувані дії в GraphQL.
Для отримання додаткової інформації перевірте:
{{#ref}}
../../pentesting-web/websocket-attacks.md
{{#endref}}
## Авторизація в GraphQL
Багато функцій GraphQL, визначених на кінцевій точці, можуть перевіряти лише аутентифікацію запитувача, але не авторизацію.
Модифікація змінних вхідних запитів може призвести до витоку чутливих даних облікового запису [leaked](https://hackerone.com/reports/792927).
Мутація може навіть призвести до захоплення облікового запису, намагаючись змінити дані іншого облікового запису.
## Викрад
```javascript
{
"operationName":"updateProfile",
@ -459,19 +443,19 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
[Зв'язування запитів](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) разом може обійти слабку систему аутентифікації.
У наведеному нижче прикладі ви можете побачити, що операція - "forgotPassword" і що вона повинна виконувати лише запит forgotPassword, пов'язаний з нею. Це можна обійти, додавши запит в кінець, в даному випадку ми додаємо "register" і змінну користувача, щоб система зареєструвала його як нового користувача.
У наведеному нижче прикладі ви можете побачити, що операція - "forgotPassword" і що вона повинна виконувати лише запит forgotPassword, пов'язаний з нею. Це можна обійти, додавши запит в кінець, у цьому випадку ми додаємо "register" і змінну користувача, щоб система зареєструвала його як нового користувача.
<figure><img src="../../images/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
## Обхід обмежень швидкості за допомогою псевдонімів у 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 +474,7 @@ valid
### Перевантаження псевдонімів
**Перевантаження псевдонімів** - це вразливість GraphQL, де зловмисники перевантажують запит багатьма псевдонімами для одного й того ж поля, змушуючи бекенд-резолвер виконувати це поле повторно. Це може перевантажити ресурси сервера, що призводить до **Відмови в обслуговуванні (DoS)**. Наприклад, у наведеному нижче запиті те саме поле (`expensiveField`) запитується 1,000 разів, використовуючи псевдоніми, змушуючи бекенд обчислювати його 1,000 разів, що потенційно може виснажити ЦП або пам'ять:
**Перевантаження псевдонімів** - це вразливість GraphQL, де зловмисники перевантажують запит багатьма псевдонімами для одного й того ж поля, змушуючи бекенд-резолвер виконувати це поле повторно. Це може перевантажити ресурси сервера, що призводить до **Відмови в обслуговуванні (DoS)**. Наприклад, у наведеному нижче запиті те саме поле (`expensiveField`) запитується 1,000 разів, використовуючи псевдоніми, змушуючи бекенд обчислювати його 1,000 разів, що потенційно виснажує ЦП або пам'ять:
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "Content-Type: application/json" \
@ -499,9 +483,9 @@ curl -X POST -H "Content-Type: application/json" \
```
Щоб зменшити це, реалізуйте обмеження на кількість псевдонімів, аналіз складності запитів або обмеження швидкості, щоб запобігти зловживанню ресурсами.
### **Пакетування запитів на основі масивів**
### **Пакетування запитів на основі масиву**
**Пакетування запитів на основі масивів** є вразливістю, коли GraphQL API дозволяє пакетувати кілька запитів в одному запиті, що дозволяє зловмиснику надсилати велику кількість запитів одночасно. Це може перевантажити бекенд, виконуючи всі пакетовані запити паралельно, споживаючи надмірні ресурси (ЦП, пам'ять, з'єднання з базою даних) і потенційно призводячи до **Відмови в обслуговуванні (DoS)**. Якщо немає обмеження на кількість запитів у пакеті, зловмисник може скористатися цим, щоб знизити доступність сервісу.
**Пакетування запитів на основі масиву** є вразливістю, коли GraphQL API дозволяє пакетувати кілька запитів в одному запиті, що дозволяє зловмиснику надсилати велику кількість запитів одночасно. Це може перевантажити бекенд, виконуючи всі пакетовані запити паралельно, споживаючи надмірні ресурси (ЦП, пам'ять, з'єднання з базою даних) і потенційно призводячи до **Відмови в обслуговуванні (DoS)**. Якщо немає обмеження на кількість запитів у пакеті, зловмисник може скористатися цим, щоб знизити доступність сервісу.
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -509,7 +493,7 @@ 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 різних запитів об'єднуються в один запит, змушуючи сервер виконувати їх усі одночасно. Якщо скористатися цим з більшим розміром пакета або запитами, що вимагають великих обчислень, це може перевантажити сервер.
### **Уразливість через перевантаження директив**
@ -550,10 +534,10 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
### Сканери вразливостей
- [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): Інструмент, який можна використовувати для отримання схем і пошуку чутливих даних, тестування авторизації, брутфорсу схем і знаходження шляхів до певного типу.
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Визначення графіку, що використовується
- [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](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**.