API, GraphQL, Pentest

GraphQL: Как через одну introspection-query слить всю базу

Привет, друг!

Что такое introspection и почему это дыра

GraphQL по умолчанию включает механизм introspection — это встроенная фича, которая позволяет узнать всю схему API: типы данных, поля, запросы, мутации. Изначально задумывалось для разработки, но на продакшене это превращается в золотую жилу для атакующего.

Одним запросом ты получаешь полную карту API: какие таблицы есть в базе, какие поля содержат данные, какие связи между сущностями. После этого остаётся только собрать нужные запросы и методично вытаскивать информацию.

Базовый introspection-запрос

Вот классический запрос для получения всей схемы:

Этот запрос вернёт тебе все типы данных в схеме. Ищешь там интересные объекты типа UserPaymentAdmin — и вперёд.

Пошаговая эксплуатация

Шаг 1: Разведка схемы

Первым делом узнаём, какие queries доступны:

Результат покажет все доступные запросы. Например:

Шаг 2: Изучаем типы данных

Теперь смотрим, что внутри интересных объектов:

Ответ:

Бинго! Видим поля password и creditCard — это уже интересно.

Шаг 3: Массовая выгрузка

Теперь, зная структуру, делаем запрос на выгрузку всех пользователей:

Если нет лимитов — можно вытащить всю базу за один запрос. Если есть пагинация — делаем в цикле.

Продвинутые техники

Батчинг запросов

GraphQL позволяет делать несколько запросов одновременно:

Один HTTP-запрос — три таблицы за раз.

Глубокие вложенные запросы

Если есть связи между объектами, используй их:

Один запрос — вся история покупок и платёжные данные каждого пользователя.

Обход фильтров

Иногда разработчики пытаются защититься, скрывая чувствительные поля. Но если есть связи через другие объекты, можно обойти:

Автоматизация через скрипты

Вот быстрый Python-скрипт для автоматической разведки:

Как защититься

Отключи introspection на проде

В Apollo Server:

В GraphQL-yoga:

Ограничь глубину запросов

Добавь rate limiting

Скрой чувствительные поля

Реальные кейсы

HackerOne: В 2019 году через introspection нашли уязвимость в API, которая позволяла получить данные всех отчётов о багах, включая приватные.

GitHub: До 2020 года их GraphQL API возвращал слишком много информации через introspection, что позволяло находить внутренние эндпоинты.

Shopify: Исследователи обнаружили, что через вложенные запросы можно было получить данные чужих магазинов.

Чеклист для пентеста

  • Проверь, включён ли introspection
  • Найди все queries и mutations через __schema
  • Изучи структуру интересных типов через __type
  • Попробуй batch-запросы для массовой выгрузки
  • Используй глубокие вложенные запросы для связанных данных
  • Проверь обход фильтров через связи объектов
  • Тестируй различные аргументы (limit, offset, where)
  • Ищи внутренние поля через директивы @include@skip

Инструменты

  • GraphQL Voyager — визуализация схемы
  • InQL — Burp Suite плагин для GraphQL
  • GraphQLmap — автоматический эксплойт-тул
  • Altair — клиент с автокомплитом на основе introspection
GraphQL: Как через одну introspection-query слить всю базу

На этом все. Всем хорошего дня!