
أداة آلية لتعداد مخطط GraphQL واستخراج البيانات، تقوم بتكرار مستندات الاستبطان، وإعادة بناء الاستعلامات، وحفظ الردود لاختبار الاختراق وتقييم أمان API.
Graphicator هي أداة "كشط" / استخراج لـ GraphQL. تقوم الأداة بالتكرار عبر مستند الاستبطان (introspection document) الذي يعيده نقطة نهاية GraphQL المستهدفة، ثم تعيد هيكلة المخطط (schema) في شكل داخلي لتتمكن من إعادة إنشاء الاستعلامات المدعومة. عند إنشاء هذه الاستعلامات، تُستخدم لإرسال طلبات إلى نقطة النهاية وحفظ الردود المستلمة في ملف.
لا يتم حفظ الردود الخاطئة. بشكل افتراضي، تخزّن الأداة الردود الصحيحة في ذاكرة التخزين المؤقت وتخزّن الأخطاء أيضًا، وبالتالي عند إعادة تشغيل الأداة لن تعود إلى نفس الاستعلامات مرة أخرى.
استخدمها بحكمة واستخدمها فقط مع الأهداف التي لديك الإذن بالتفاعل معها.
نأمل أن تساعد الأداة في أتمتة اختباراتك كمختبر اختراق وأن تعطي دفعة حتى لمن لم يختبروا 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
عند انتهاء المهمة، تقوم الأداة بضغط النتائج ويتم توفير الملف المضغوط عبر خادم ويب يعمل على المنفذ 8005. لإيقاف الحاوية، استخدم CTRL+C. عند إيقاف الحاوية، يتم حذف البيانات أيضًا. يمكنك أيضًا تغيير منفذ المضيف حسب احتياجاتك.
python3 graphicator.py [args...]
الخطوة الأولى هي تكوين الهدف. للقيام بذلك، يجب توفير إما خيار --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
يجب أن يحتوي الملف على رابط واحد في كل سطر كما يلي:
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
_____ __ _ __
/ ___/____ ___ _ ___ / / (_)____ ___ _ / /_ ___ ____
/ (_ // __// _ `// _ \ / _ \ / // __// _ `// __// _ \ / __/
\___//_/ \_,_// .__//_//_//_/ \__/ \_,_/ \__/ \___//_/
/_/
By @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 } }
يتم إنشاء ثلاثة مجلدات:
اسم الملف هو التجزئة (hash) التي تأخذ في الاعتبار الاستعلام وعنوان URL.
حقوق الطبع والنشر 2023 شركة Cybervelia Ltd
يُمنح الإذن بموجب هذا، مجانًا، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به (الـ "برنامج")، للتعامل مع البرنامج دون قيود، بما في ذلك دون حصر حقوق الاستخدام والنسخ والتعديل والدمج والنشر والتوزيع والترخيص و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين يتم تزويدهم بالبرنامج بالقيام بذلك، مع مراعاة الشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإذن الإذن هذا في جميع النسخ أو الأجزاء الجوهرية من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال لا يكون المؤلفون أو أصحاب حقوق الطبع والنشر مسؤولين عن أي دعوى أو أضرار أو مسؤولية أخرى، سواء كانت ناشئة عن عقد أو ضرر أو غير ذلك، تنشأ عن أو تتعلق بالبرنامج أو استخدامه أو التعاملات الأخرى في البرنامج.
تم إنشاء الأداة وصيانتها بواسطة (@fand0mas).
المساهمات مرحب بها أيضًا.