GraphQL — атаки и безопасность

Опубликовано: 15 Сентября, 2022

GraphQL — это язык запросов для API, который использует структуру графа для хранения данных. Это похоже на любой другой REST API. В настоящее время реализация GraphQL очень распространена в разработке приложений. Технологические компании, такие как Facebook, Yahoo, Shopify, Twitter, также внедрили GraphQL для внутренней связи, изменения и удаления данных.

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

  1. ПОЛУЧИТЬ /API/resource_1
  2. ПОЛУЧИТЬ /API/resource_2
  3. ПОСТ/апи/ресурс_1

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

GraphQL имеет такие функции, как запросы, мутация, фрагменты и метаполя. Все эти функции делают GraphQL очень мощным и помогают извлекать, обновлять и удалять данные организованным и простым способом. Запросы гибки в использовании, и с помощью запроса мы можем запросить любой объект, включая связанные объекты и поля, связанные с этими объектами. Запросы написаны как функция, которая может возвращать одно или несколько значений, также мы можем включать аргументы.

Пример:

REQUEST:-
{
  student {
    name,
    id,
    password
  }
}

RESPONSE:-
{
  "data": {
    "student": {
      "name": "Siddhant"
      "id" : "112"
      "password" : "GFG2020"
    }
  }
}

Работа GraphQL:

Есть две основные части, которые определяют работу GraphQL:

  1. Схема
  2. Функции разрешения

Схема:

Схема в GraphQL — это модель данных, которые можно запрашивать с сервера. Он устанавливает тип действительных и авторизованных запросов, которые может делать клиент.

Взгляните на приведенную ниже нотацию схемы GraphQL:

type Employee {
  id: Int
  name: String
  posts: [Post]
}type Salary{
  id: Int
  title: String
  Amount: Int
  employee: Employee
}type Query {
  getEmployee(id: Int): Employee
  getSalary(titleContains: String): [Post]
}schema {
  query: Query
}

В приведенной выше схеме есть 3 типа, а именно: «Сотрудник», «Зарплата» и «Запрос». Здесь запрос отмечает точку входа в схему. Все запросы должны начинаться либо с getEmployee, либо с getSalary для проверки. Кроме того, объекты Employee и Salary ссылаются друг на друга.

Решающие функции:

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

getEmployee(_, args){
  return sql.raw("SELECT * FROM Employee WHERE id = %s", args.id);
}Salary(employee){
  return request(`https://YOUR_URL/${employee.id}`);
}

Примечание. Не рекомендуется писать запрос и URL-адрес непосредственно в функции разрешения.

Подход к тестированию ошибок GraphQL:

1. Самоанализ:

Самоанализ — одна из странных особенностей GraphQL. Это очень важно для самоанализа во время тестирования API. В GraphQL это дает много информации о реализации GraphQL. Существуют три наиболее распространенные ошибки, связанные с конечными точками graphql : ошибки бизнес-логики, IDORS, раскрытие информации и обход брандмауэра. API-интерфейсы GraphQL, специально расположенные в определенных конечных точках, таких как qql, graphql, console, graphilq и т. д. Самая сложная часть охоты на GraphQL — это понимание синтаксиса. После понимания реализованного синтаксиса мы можем легко перейти к тестированию API-интерфейсов GraphQL.

  1. Перехватите HTTP-запрос, который вы хотите протестировать.
  2. Замените содержимое запроса общим запросом самоанализа в запросе POST.
  3. Попробуйте один и тот же процесс на разных конечных точках
  4. Если вы получили 200 ответов OK, вы получите некоторую внутреннюю базу данных в теле ответа.
  5. Используйте расширение пакета Inql burp , чтобы понять реализацию GraphQL.

2. Недостаточное ограничение скорости:

Всегда проверяйте недостаточное ограничение скорости на конечных точках API. Возможно, удастся переборщить запрос GraphQL для получения информации с внутренних серверов. Злоумышленник может подобрать токен сброса пароля на конечной точке сброса пароля, чтобы изменить пароль жертвы. Эта небольшая атака приводит к полной уязвимости захвата учетной записи. Слабая реализация защиты, ограничивающей скорость, приводит к DDos-атакам, в результате которых сервер падает.

3. Отсутствует проверка в функционале CRUD:

В приложении Create, Read, Update и Delete это самые важные и важные функции. GraphQL кажется очень простым, когда дело доходит до использования, но несколько сложным с точки зрения реализации. Во время реализации каждой функции всегда используйте токен авторизации. Каждый токен должен быть уникальным. Чтобы проверить эту ошибку, проверьте каждую функциональность, изменив параметры запроса (например, имя пользователя, идентификатор пользователя и т. д.). Если он дает результаты УСПЕХА для манипулируемого запроса, значит, в функционале CRUD отсутствует проверка.

Инструменты для тестирования безопасности GraphQL:

  1. GraphQL путешественник
  2. Расширение пакета Inql burp
  3. GraphQL-путь-перечисление