Обходим авторизацию/аутенификацию в graphql
Важно понимать, что в graphql оффициально нету такого как аутенификация и авторизация. Graphql идет больше как замена rest api с гибким получением данных. Поэтому разработчикам нужно использовать всякие левые библиотеки, чтобы внедрить авторизацию/аутенификацию
Если у вас есть схема интроспекции - просто смотрим, какие запросы нам не доступны и в ответ кидают ошибку / нетипичный статус код (например, 403). Ну и анализируем интересные запросы и замечаем их. Замечаем запросы на авторизацию/аутенификацию
Вот короткая таблица с такими ошибками. По этим ошибкам можем понять, как имплементирована авторизация/аутенификация. Но и не забываем гуглить такие ошибки. Ну и гуглим любые аномалии
Важно: разработчики могут ставить кастомные ошибки
Ну и так же внимательно наблюдаем за mutation запросами. Они самые интересные. К ним перейдем попозже
In-Band: API сам рулит логином, регистрацией и доступом (RBAC). Ищи мутации типа login или signup, где шлются логин/пароль и возвращается токен. Это жирная мишень для атак.
Out-of-Band: API не парится с аутентификацией, а берет готовые токены (например, JWT в Authorization) от внешнего сервиса (шлюз, Auth0)
- После того, как нашли запрос где вход в аккаунт, будем брутить. Но это больше будет не как брутфорс, а как password spraying. Что и как работает не будем углубляться, но если есть rate limit, их можно обойти, посылая 1 запрос. Будем использовать для этого CrackQL. Этот инструмент по сути лучший какой есть на гитхабе. Его можно так же использовать для обхода OTP и всякого такого, где нужна грубая сила
Вот так примерно выглядит стандартное использование этого инструмента:
-t - наш конечный эндпоинт. ну тут все понятно
ну и есть другие второстепенные параметры
Ну и давайте разберемся: Есть, например, вот такой запрос:
Для того чтобы инструменту он подошёл, перекрафтим.
Что мы сделали? Дело в том, что слоаврь для брута нужен в формате csv. Мы указали {{столбец (из словаря)|тип данных}}.
После успешного входа, нам выдаеться accessToken и refreshToken.