Логотип
Главная | Статьи | GraphQL-инъекции: как ломать современные API
GraphQL-инъекции: как ломать современные API

GraphQL-инъекции: как ломать современные API

3 июля, 2025

54

Привет, хакеры и разработчики! Сегодня мы с вами погрузимся в мир GraphQL — мощного и современного инструмента для работы с API, который, как и всё в IT, может стать слабым звеном, если его неправильно настроить. Мы разберём, что такое GraphQL-инъекции, как искать уязвимости через интроспекцию, обходить авторизацию и устраивать хаос с переполнением запросов. А главное — я дам вам готовый Python-скрипт для автоматизации процесса. Погнали!

Что такое GraphQL и почему он уязвим?

GraphQL — это язык запросов для API, который позволяет клиенту запрашивать только те данные, которые ему нужны. В отличие от REST, где структура ответа жёстко задана, тут клиент сам решает, что получать. Это круто, но открывает двери для атак, если сервер не защищён.

Основные уязвимости GraphQL:

  • Интроспекция: сервер может раскрывать схему данных, включая скрытые поля и мутации.
  • Отсутствие ограничений: переполнение запросов (query batching) может положить сервер.
  • Слабая авторизация: разработчики часто забывают проверять права доступа на уровне полей.

Давай разберём каждый пункт на практике.

Уязвимость 1: Интроспекция — твой пропуск в схему данных

GraphQL по умолчанию поддерживает интроспекцию — возможность запросить всю схему API, включая типы данных, поля и мутации. Если разработчик не отключил эту фичу (а это делают далеко не все), ты можешь получить карту всей системы.

Как проверить интроспекцию?

Отправь следующий запрос на эндпоинт GraphQL (обычно это /graphql или /api):

Если сервер вернёт схему — ты в деле! Теперь ты знаешь, какие запросы (queries) и мутации (mutations) доступны. Ищи чувствительные данные, вроде userDataadminPanel или deleteUser.

Лайфхак

Если интроспекция отключена, попробуй поискать документацию или старые версии API через Wayback Machine — иногда там можно найти схему.

Уязвимость 2: Обход авторизации

GraphQL часто проверяет авторизацию только на уровне эндпоинта, а не отдельных полей. Это значит, что даже с минимальными правами ты можешь запросить данные, к которым доступ должен быть закрыт.

Пример атаки

Допустим, ты авторизован как обычный юзер. Отправляешь запрос на получение своего профиля, но добавляешь поле isAdmin, которое не должно быть доступно:


Если сервер отдаст тебе isAdmin: true — поздравляю, ты нашёл баг. Дальше можешь попытаться запросить данные других пользователей через user(id: "123").

Уязвимость 3: Переполнение запросов (Query Batching и DoS)

GraphQL позволяет отправлять несколько запросов в одном пакете. А ещё можно делать глубоко вложенные запросы, которые заставят сервер обрабатывать тонны данных. Если лимиты не настроены, это приведёт к DoS (отказу в обслуживании).

Пример атаки

Вот запрос, который запрашивает пользователей, их посты, комментарии к постам и лайки к комментариям:

Если сервер не ограничивает глубину вложенности или количество записей, он может зависнуть или упасть. А если таких запросов отправить сотню — привет, DoS.

Практика: Python-скрипт для автоматизации атак

Давай автоматизируем процесс поиска эндпоинтов GraphQL и эксплуатации уязвимостей. Вот готовый скрипт на Python с использованием библиотеки requests. Мы будем искать эндпоинты и проверять интроспекцию.

Установка зависимостей

Скрипт для перебора эндпоинтов и проверки интроспекции

Как использовать скрипт?

  1. Запусти скрипт и введи целевой URL (например, https://example.com).
  2. Скрипт проверит стандартные пути для GraphQL-эндпоинтов.
  3. Если эндпоинт найден, он отправит запрос на интроспекцию и попробует переполнение через batch-запрос.
  4. Анализируй вывод: если интроспекция работает, изучай схему; если сервер падает на batch-запросе — ты нашёл DoS.

Лайфхак

Добавь свои словари эндпоинтов или используй Burp Suite для перехвата запросов и поиска нестандартных точек входа.

Как защититься от таких атак?

Если ты разработчик, вот короткий чек-лист:

  • Отключи интроспекцию в продакшене (например, в Apollo Server используй introspection: false).
  • Установи лимиты на глубину запросов и количество записей (используй библиотеки вроде graphql-depth-limit).
  • Проверяй авторизацию на уровне каждого поля, а не только эндпоинта.

Итог

GraphQL-инъекции — это не миф, а реальная угроза для современных API. Интроспекция даёт тебе карту данных, слабая авторизация — доступ к чужим секретам, а переполнение запросов может положить сервер на лопатки. Скрипт, который я дал, — это твой стартовый инструмент для автоматизации. Но помни: используй знания только для этичного тестирования и с разрешения владельца системы.