
Автоматизированный инструмент для перечисления схем GraphQL и извлечения данных, который перебирает документы самоанализа (introspection), реконструирует запросы и сохраняет ответы для тестирования на проникновение и оценки безопасности API.
Graphicator — это «скрапер» / экстрактор GraphQL. Инструмент перебирает документ интроспекции, возвращаемый целевой GraphQL-конечной точкой, а затем перестраивает схему во внутреннюю форму, чтобы иметь возможность воссоздать поддерживаемые запросы. Когда такие запросы создаются, они используются для отправки запросов к конечной точке, а полученный ответ сохраняется в файл.
Ошибочные ответы не сохраняются. По умолчанию инструмент кеширует корректные ответы, а также кеширует ошибки, поэтому при повторном запуске инструмент не будет повторно выполнять те же запросы.
Используйте его с умом и только для целей, на взаимодействие с которыми у вас есть разрешение.
Мы надеемся, что инструмент автоматизирует ваши собственные тесты в качестве пентестера и даст толчок даже тем, кто ещё не занимается тестированием GraphQL.
Чтобы узнать, как проводить оценку конечных точек GraphQL: https://cybervelia.com/?p=736&preview=true
python3 -m pip install -r requirements.txt
docker run --rm -it -p8005:80 cybervelia/graphicator --target http://the-target:port/graphql --verbose
После завершения задачи инструмент упаковывает результаты в zip-архив, и этот архив становится доступен через веб-сервер на порту 8005. Чтобы остановить контейнер, нажмите CTRL+C. При остановке контейнера данные также удаляются. Вы также можете изменить порт хоста по своему усмотрению.
python3 graphicator.py [аргументы...]
Первый шаг — настроить цель. Для этого вы должны указать либо опцию --target, либо файл с помощью --file.
Установка одной цели через аргументы
python3 graphicator.py --target https://subdomain.domain:port/graphql
Установка нескольких целей
python3 graphicator.py --target https://subdomain.domain:port/graphql --target https://target2.tld/graphql
Установка целей через файл
python3 graphicator.py --file file.txt
Файл должен содержать один URL на строку, например:
http://target1.tld/graphql
http://sub.target2.tld/graphql
http://subxyz.target3.tld:8080/graphql
Вы можете подключить инструмент к любому прокси.
Подключение к настройкам Burp по умолчанию (порт 8080)
python3 graphicator.py --target target --default-burp-proxy
Подключение к вашему собственному прокси
python3 graphicator.py --target target --use-proxy
Подключение через Tor
python3 graphicator.py --target target --use-tor
python3 graphicator.py --target target --header "x-api-key:60b725f10c9c85c70d97880dfe8191b3"
python3 graphicator.py --target target --verbose
python3 graphicator.py --target target --multi
python3 graphicator.py --target target --insecure
python3 graphicator.py --target target --no-cache
python3 graphicator.py --target http://localhost:8000/graphql --verbose --multi
_____ __ _ __
/ ___/____ ___ _ ___ / / (_)____ ___ _ / /_ ___ ____
/ (_ // __// _ `// _ \ / _ \ / // __// _ `// __// _ \ / __/
\___//_/ \_,_// .__//_//_//_/ \__/ \_,_/ \__/ \___//_/
/_/
Автор: @fand0mas
[-] Целей: 1
[-] Заголовки: 'Content-Type', 'User-Agent'
[-] Подробный вывод
[-] Использование кеша: True
************************************************************
0%| | 0/1 [00:00<?, ?it/s][*] Перечисление... http://localhost:8000/graphql
[*] Извлечение... => query {getArticles { id,title,views } }
[*] Извлечение... => query {getUsers { id,username,email,password,level } }
100%|█████████████████████████████████████████████| 1/1 [00:00<00:00, 35.78it/s]
$ cat reqcache/9652f1e7c02639d8f78d1c5263093072fb4fd06c.json
{
"data": {
"getUsers": [
{
"id": 1,
"username": "theo",
"email": "[email protected]",
"password": "1234",
"level": 1
},
{
"id": 2,
"username": "john",
"email": "[email protected]",
"password": "5678",
"level": 1
}
]
}
}
$ cat reqcache-queries/9652f1e7c02639d8f78d1c5263093072fb4fd06c.query
query {getUsers { id,username,email,password,level } }
Создаются три папки:
Имя файла — это хэш, учитывающий запрос и URL.
Copyright 2023 Cybervelia Ltd
Настоящим предоставляется бесплатное разрешение любому лицу, получающему копию данного программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), на использование Программного обеспечения без ограничений, включая, без ограничений, права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешение лицам, которым предоставляется данное Программное обеспечение, делать это при соблюдении следующих условий:
Указанное выше уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ИНУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ ТО В СИЛУ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКШИЕ ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ЕГО ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
Инструмент создан и поддерживается (@fand0mas).
Вклад также приветствуется.