May 17, 2025

Обходим авторизацию/аутенификацию в graphql

Важно понимать, что в graphql оффициально нету такого как аутенификация и авторизация. Graphql идет больше как замена rest api с гибким получением данных. Поэтому разработчикам нужно использовать всякие левые библиотеки, чтобы внедрить авторизацию/аутенификацию

  1. Тестим все запросы

Если у вас есть схема интроспекции - просто смотрим, какие запросы нам не доступны и в ответ кидают ошибку / нетипичный статус код (например, 403). Ну и анализируем интересные запросы и замечаем их. Замечаем запросы на авторизацию/аутенификацию

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

Важно: разработчики могут ставить кастомные ошибки

Ну и так же внимательно наблюдаем за mutation запросами. Они самые интересные. К ним перейдем попозже

  1. Определяем, используеться in-band или out-of-band аутентификация/авторизация

In-Band: API сам рулит логином, регистрацией и доступом (RBAC). Ищи мутации типа login или signup, где шлются логин/пароль и возвращается токен. Это жирная мишень для атак.

Out-of-Band: API не парится с аутентификацией, а берет готовые токены (например, JWT в Authorization) от внешнего сервиса (шлюз, Auth0)

  1. После того, как нашли запрос где вход в аккаунт, будем брутить. Но это больше будет не как брутфорс, а как password spraying. Что и как работает не будем углубляться, но если есть rate limit, их можно обойти, посылая 1 запрос. Будем использовать для этого CrackQL. Этот инструмент по сути лучший какой есть на гитхабе. Его можно так же использовать для обхода OTP и всякого такого, где нужна грубая сила

Вот так примерно выглядит стандартное использование этого инструмента:

-t - наш конечный эндпоинт. ну тут все понятно

-q - тут уже сам запрос

-i словрь (в формате csv)

ну и есть другие второстепенные параметры

Ну и давайте разберемся: Есть, например, вот такой запрос:

Для того чтобы инструменту он подошёл, перекрафтим.

Что мы сделали? Дело в том, что слоаврь для брута нужен в формате csv. Мы указали {{столбец (из словаря)|тип данных}}.

После успешного входа, нам выдаеться accessToken и refreshToken.

Как мы видим, username operator, а password password123