در حال بارگذاری...
تست امنیت پیادهسازی GraphQL شامل شناسایی endpoint، introspection، injection و محدودیتهای نرخ. (WSTG-APIT-01 — رسمی WSTG v4.2)
اهداف این درس
GraphQL یک زبان پرسوجو و runtime برای API است که توسط Facebook توسعه داده شده است. برخلاف REST که endpointهای متعدد دارد، GraphQL از یک endpoint واحد استفاده میکند و به کلاینت اجازه میدهد دقیقاً مشخص کند چه دادههایی نیاز دارد.
یک زبان پرسوجو برای API و runtime برای اجرای آن پرسوجوها با استفاده از type system موجود.
| ویژگی | REST | GraphQL |
|---|---|---|
| Endpoint | متعدد | واحد (/graphql) |
| Method | GET, POST, PUT, DELETE | معمولاً POST |
| ساختار پاسخ | سرور تعیین میکند | کلاینت تعیین میکند |
| Over-fetching | محتمل | ندارد |
| Under-fetching | محتمل | ندارد |
| Versioning | نیاز به نسخهبندی | معمولاً بدون نسخه |
Query برای خواندن دادهها استفاده میشود و معادل GET در REST است.
1query {2 user(id: 1) {3 name4 email5 posts {6 title7 }8 }9}Mutation برای ایجاد، بهروزرسانی و حذف دادهها استفاده میشود.
1mutation {2 createUser(input: {3 name: "Ali"4 email: "ali@example.com"5 }) {6 id7 name8 }9}Subscription برای دریافت دادههای لحظهای از طریق WebSocket استفاده میشود.
Introspection به مهاجم اجازه میدهد schema کامل سرور را کشف کند.
1{2 __schema {3 types {4 name5 fields {6 name7 type {8 name9 }10 }11 }12 }13}اگر resolverها ورودیها را بدون اعتبارسنجی در query پایگاه داده استفاده کنند، SQL Injection ممکن است رخ دهد.
1query {2 user(name: "' OR 1=1 --") {3 id4 name5 }6}queryهای تو در تو میتوانند منابع سرور را مصرف کنند.
1query {2 users {3 friends {4 friends {5 friends {6 friends {7 name8 }9 }10 }11 }12 }13}اگر authorization فقط در سطح query بررسی شود و نه در سطح field، مهاجم میتواند به دادههای مجاز دسترسی پیدا کند.
1curl -X POST https://target.com/graphql \2 -H "Content-Type: application/json" \3 -d '{"query": "{ __schema { types { name } } }"}'هشدار
هرگز introspection را در محیط تولید فعال نگذارید. این قابلیت میتواند schema کامل برنامه را به مهاجم فاش کند.
توصیه عملی
از ابزار InQL برای تست خودکار GraphQL در Burp Suite استفاده کنید. این ابزار میتواند schema را تحلیل و queryهای تستی تولید کند.
همیشه introspection را در محیط تولید غیرفعال کنید.
محدودیت عمق و پیچیدگی query برای جلوگیری از DoS ضروری است.
Authorization باید در resolver سطح field بررسی شود.
ورودیهای GraphQL باید مثل هر ورودی دیگری اعتبارسنجی شوند.
کدام متد HTTP معمولاً برای درخواستهای GraphQL استفاده میشود؟
تفاوت اصلی GraphQL و REST در چیست؟
در REST، سرور ساختار پاسخ را تعیین میکند اما در GraphQL، کلاینت دقیقاً مشخص میکند چه دادههایی نیاز دارد. GraphQL از یک endpoint واحد استفاده میکند.
Introspection در GraphQL چیست و چرا خطرناک است؟
Introspection قابلیتی است که به کلاینت اجازه میدهد schema سرور را کشف کند. این میتواند اطلاعات حساسی مثل نوع دادهها و روابط بین آنها را فاش کند.
چگونه از حملات DoS در GraphQL جلوگیری کنیم؟
با محدود کردن عمق query، تعداد fieldها، پیچیدگی query و استفاده از محدودیت نرخ درخواست.