May 13, 2025

Тестим graphql Часть1

В этой статье не будет теоретической части о GraphQL и его основах — сразу перейдём к практике.

Поиск Endpoints

Первым шагом является поиск GraphQL endpoints. Для этого можно использовать любой подходящий фаззер. Я воспользуюсь Kiterunner.

Как видно, было обнаружено два эндпоинта: /graphql и /graphiql.

Также эндпоинты можно найти в JS файлах и GitHub репозиториях

Если эндпоинты найти не удалось, это может означать, что GraphQL не используется. Однако, если GraphQL всё же применяется, но стандартные пути недоступны, endpoint можно определить, перехватив трафик в Burp Suite — иногда он может иметь нестандартное имя. Тоесть, просто найти где идет запрос к graphql. Если нашли несколько эндпоинтов - тестируем каждый отдельно.

Теперь давайте подробнее рассмотрим эндпоинт /graphql.

На данном этапе ничего необычного — перед нами стандартный GraphQL-эндпоинт, принимающий POST-запросы.

1. Тут уже можно посмотреть, может есть какие-то интересные заголовки или какие-то интересные атрибуты в куки

2. Так же смотрим, есть ли какие-то интересные параметрры по типу debug

3. В надежде на стек-трейс кидаем какой-то кривой запрос, например:

query { dsf { sdfsdf } }

4. Если в ответе видим какие-то стрек трейс ошибки, мы можем увидеть текущего пользователя/фрейморвки/фрагмент выходного кода и т.д.. Так же смотрим, может есть что в консольке интересного. Часто стек трейс могут падать именно в консоль

Теперь перейдём к определению используемых движков и технологий. Для этого воспользуемся инструментом Graphw00f.

Как видно, используется движок Graphene на Python. Инструмент также предоставил ссылку на документацию, с которой стоит ознакомиться в первую очередь — это может дать полезную и потенциально важную информацию о реализации GraphQL на целевом сервере.

Теперь давайте изучим поведение эндпоинта более подробно. Для этого отправим базовый запрос через Postman.

Как мы видим, интроспекция включена, что значительно упрощает анализ схемы GraphQL.

Для удобства взаимодействия с GraphQL также можно использовать расширение InQL для Burp Suite. Оно позволяет автоматически извлекать доступные типы, запросы и мутации, а также формировать интерактивные запросы — это может быть полезно тем, кто предпочитает работать в Burp.

Расширение InQL доступно в BApp Store

Однако для более наглядной визуализации схемы я рекомендую воспользоваться инструментом GraphQL Voyager. Он позволяет представить структуру GraphQL API в виде диаграммы, что значительно упрощает понимание связей между типами и сущностями.

Для этого необходимо выполнить интроспективный запрос, результат которого затем можно загрузить в Voyager.

После выполнения интроспективного запроса копируем полученный JSON-ответ и загружаем его в GraphQL Voyager. Это позволит визуализировать схему API, увидеть все типы, связи между ними, а также получить общее представление о структуре бэкенда.

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

Давайте теперь прогоним по сканерам уязвимостей. graphql-cop:

И через BatchQL:

Эти инструменты дают нам много информации. Как например, возможный CSRF. Если. например, graphql используеться для удаления аккаунта, и меры безопасности против csrf не соблюдаються (samesite/csrf token и т.д..), то мы можем эксплуатировать csrf

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

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

Подробное описание работы Clairvoyance выходит за рамки этой статьи. Если вы хотите глубже разобраться в принципах его работы, рекомендуем ознакомиться с видео по теме: ссылка на YouTube.

Для примера я протестировал инструмент Clairvoyance на случайном сайте, использующем GraphQL-движок Apollo. Как и ожидалось, интроспекция на этом сайте была отключена — стандартная практика для повышения безопасности. В результате работы Clairvoyance мне удалось восстановить схему API, которую я затем визуализировал для удобства анализа.

Хотя восстановленная схема не является полной заменой данных, полученных через интроспекцию, она предоставляет достаточно информации для дальнейшего тестирования. Для достижения более точных результатов рекомендую использовать обширные словари запросов, специально предназначенные для GraphQL. Такие словари можно найти, например, здесь: GraphQL Wordlist.

Кроме того, для более эффективной отладки и анализа советую проксировать запросы через Burp Suite. Это позволяет отслеживать взаимодействие с сервером в реальном времени, включая ответы и возможные ошибки. Например, если сервер или WAF блокирует запросы, вы сразу заметите это в Burp Suite и сможете уже решить, что делать дальше

Теперь давайте рассмотрим интересный эндпоинт graphiql

GraphQL часто предоставляют встроенную среду разработки (IDE) прямо на веб-приложении. Это графический интерфейс, с помощью которого можно отправлять запросы к API. Наиболее распространённые GraphQL IDE — это GraphiQL, GraphQL Playground и Altair Client. Эти интерфейсы обычно включают:

  • окно для написания запросов;
  • окно для отправки запросов;
  • окно для просмотра ответов;
  • раздел с документацией GraphQL. (она базируеться на интроспекции)

Такие IDE могут быть защищены авторизацией. Пробуем её обойти, это может дать очень интересные результаты.

В целом, про графический интерфейс что-то ещё нельзя сказать. Графические интерфесы это не что-то очень особенное, что может дать хакеру какую-то супер ценную информацию

Ищем graphql на субдоменах

Часто на субдоменах по типу

  • staging.site.com
  • dev.site.com
  • test.api.site.com

Есть graphql ендпоинты, но с включенной интроспекцией, и возможно, каким-то дополнительным функционалом. Для хакера такое может быть на вес золота. Это может раскрыть кучу потенциальных уязвимостей или каких то важной технической информации

Эксплуатация метаполя __type

Даже, если интроспекция выключена, это ведь не значит,что она на 100 процентов заблокирована

Большинство систем блокирует интроспекционные запросы, содержащие слово __schema. Но если этого слова нету, запросы пропускаються фаерволом

В 2022 иследователи обнаружили, что Amazon AppSync блокирует все запросы по методике, какая описанна выше. После репорта, команда Amazon тут же фиксанула дыру и обновила документации

Чтобы проверить такой метод обхода, кидаем canary запрос

{ __type(name:"Query") { name } } Если ответ не ошибка - интроспекция по сути не заблокирована. Но с ее получением все-равно возникнут трудности

НАШИ ПРОЕКТЫ

Канал - ИСПОВЕДЬ ПЕНТЕСТЕРА

Наш Чат - t.me/+YgxPPcFtalUyZDYy