TTPS · روش‌ها و تکنیک‌ها حوزه‌ی تست

API Testing — تست امنیت ای‌پی‌آی

API Security Testing

تست نفوذ API یعنی سنجش مستقیم اندپوینت‌ها بدون واسطه‌ی رابط کاربری؛ جایی که مجوزدهی در سطح شیء و ویژگی — نه تزریق — غالب‌ترین دسته‌ی یافته است.

تیم فنی پی‌هانتر

تست نفوذ API چیست و چرا با تست وب کلاسیک فرق دارد؟

در یک برنامه‌ی وب کلاسیک، رابط کاربری هم نقشه‌ی راه است و هم محدودکننده. در API چنین نقشه‌ای وجود ندارد: سطح حمله مجموعه‌ای از اندپوینت است که فقط از سه راه کشف می‌شود — مستندسازی رسمی (OpenAPI، WSDL، مجموعه‌ی Postman)، ترافیک واقعی کلاینت، و شناسایی روی جاوااسکریپت باندل‌شده و نسخه‌های قدیمی مسیرها.

سه تفاوت ساختاری که روش کار را عوض می‌کنند:

  • هر اندپوینت یک تصمیم مجوزدهی مستقل است. در UI پنهان کردن یک دکمه ظاهراً مسئله را حل می‌کند؛ در API چیزی برای پنهان کردن نیست.
  • احراز هویت معمولاً توکن‌محور است — JWT، توکن Bearer یا کلید API — با همه‌ی مسائل اعتبارسنجی امضا، انقضا و دامنه‌ی اعتبار.

مرجع درست کدام است؟ WSTG تنها یک آزمون API دارد

این را باید صریح گفت: بخش تست API در راهنمای آزمون OWASP، یعنی WSTG-APIT، در نسخه‌ی پایدار v4.2 تنها یک آزمون دارد و آن هم GraphQL است. WSTG v4.2 متدولوژی جامعی برای REST نیست؛ ادعای «تست کامل API بر اساس WSTG» یا به بخش‌های عمومی راهنما اشاره دارد یا دقیق نیست.

مرجع درست، OWASP API Security Top 10 نسخه‌ی ۲۰۲۳ است:

شناسهعنوان
API1:2023Broken Object Level Authorization — مجوزدهی شکسته در سطح شیء (BOLA)
API2:2023Broken Authentication — احراز هویت شکسته
API3:2023Broken Object Property Level Authorization — مجوزدهی شکسته در سطح ویژگی (BOPLA)
API4:2023Unrestricted Resource Consumption — مصرف نامحدود منابع
API5:2023Broken Function Level Authorization — مجوزدهی شکسته در سطح عملیات (BFLA)
API6:2023Unrestricted Access to Sensitive Business Flows — دسترسی نامحدود به جریان‌های حساس کسب‌وکار
API7:2023Server Side Request Forgery — SSRF
API8:2023Security Misconfiguration — پیکربندی نادرست امنیتی
API9:2023Improper Inventory Management — مدیریت نادرست فهرست دارایی‌ها
API10:2023Unsafe Consumption of APIs — مصرف ناامن APIهای دیگران

ترکیب عملی در متدولوژی تست نفوذ: پوشش آزمون از WSTG برای لایه‌های عمومی، و دسته‌بندی ریسک از API Security Top 10.

غالب‌ترین دسته: مجوزدهی در سطح شیء، ویژگی و عملیات

سه رتبه از پنج رتبه‌ی نخست فهرست ۲۰۲۳ درباره‌ی مجوزدهی است: تزریق را می‌توان ساختاری حل کرد، اما مجوزدهی نیاز به تصمیم دارد و تصمیم فراموش می‌شود.

  • BOLA همان چیزی است که در وب IDOR می‌نامیم: کاربر شناسه‌ی شیء را عوض می‌کند و برنامه مالکیت را بررسی نمی‌کند.
  • BFLA یعنی دسترسی به یک عملیات غیرمجاز — اجرای DELETE روی منبعی که فقط GET آن مجاز بود، یا رسیدن مستقیم به مسیرهای مدیریتی.
  • BOPLA در نسخه‌ی ۲۰۲۳ دو دسته‌ی جداگانه‌ی نسخه‌ی قبل را ادغام کرده است: افشای بیش‌ازحد داده (پاسخ فیلدهایی را برمی‌گرداند که UI صرفاً نمایششان نمی‌دهد) و تخصیص انبوه یا Mass Assignment (کلاینت فیلدهایی می‌فرستد که نباید قابل نوشتن باشند).
PATCH /api/v1/users/me HTTP/1.1
Content-Type: application/json

{"displayName":"ali","role":"admin"}

HTTP/1.1 200 OK
{"id":42,"displayName":"ali","role":"admin"}

روش کشف، روش دو حسابی است: دو حساب هم‌سطح بسازید، جریان‌های کاری را با هر دو اجرا کنید، سپس شناسه‌ها و بدنه‌های حساب دوم را در نشست حساب اول بازپخش کنید. هیچ اسکنری این را قابل اتکا پیدا نمی‌کند، چون نمی‌داند کاربر A باید به رکورد B دسترسی داشته باشد یا نه.

مصرف منابع، محدودسازی نرخ و جریان‌های حساس

API4:2023 درباره‌ی نبودِ سقف است، نه فقط «تعداد درخواست در دقیقه»:

  • پارامترهای صفحه‌بندی بدون سقف — ?limit=1000000 که پایگاه‌داده و حافظه را می‌بلعد.
  • هزینه‌ی مالی مستقیم: ارسال پیامک، ایمیل و فراخوانی سرویس ثالث پولی — جایی که نبود سقف به هزینه‌ی واقعی تبدیل می‌شود.
  • محدودسازی نرخ تک‌بُعدی: سقف مبتنی بر IP که با X-Forwarded-For دور می‌خورد، یا سقف مبتنی بر حساب که با ساخت حساب جدید بی‌اثر می‌شود.

لایه‌ی بعدی API6:2023 است: جریان‌هایی که هر درخواستشان مشروع است اما خودکارسازی‌شان کسب‌وکار را می‌شکند — مثل شرایط رقابتی، با اسکنر پیدا نمی‌شود.

GraphQL و gRPC

GraphQL تنها آزمون بخش WSTG-APIT است و مسائل خاص خودش را دارد:

  • Introspection: اگر فعال باشد، کل شِما با یک کوئری در دسترس است. در محیط عملیاتی باید خاموش باشد، اما خاموش کردنش «کاهش سطح افشا» است، نه کنترل دسترسی.
  • Batching: ارسال چند عملیات در یک درخواست، سقف‌های مبتنی بر شمارش درخواست را دور می‌زند و آزمون‌های حدس رمز یا کد یک‌بارمصرف را ارزان می‌کند.
  • تودرتویی عمیق: روابط دوطرفه اجازه می‌دهند کوئری‌ای ساخته شود که به‌صورت نمایی رشد کند؛ بدون سقف عمق و سقف پیچیدگی، این یک مسیر ساده‌ی اختلال سرویس است.
  • مجوزدهی در سطح فیلد: رایج‌ترین اشتباه، بررسی مجوز فقط روی گره‌ی ریشه است؛ فیلد تودرتویی مثل user { email } از کنار آن رد می‌شود.
POST /graphql HTTP/1.1
Content-Type: application/json

{"query":"{ __schema { types { name } } }"}

gRPC جنس دیگری دارد: پیام‌های Protocol Buffers روی HTTP/2. محتوا باینری است، پس پروکسی رهگیر بدون فایل‌های .proto یا فعال بودن Server Reflection فقط بایت می‌بیند. روال عملی: ابتدا تعریف سرویس را به‌دست آورید، پیام‌ها را بازسازی کنید، بعد همان پرسش‌های مجوزدهی را بپرسید. برای اشکال‌زدایی فریم HTTP/2، Wireshark واقعاً به کار می‌آید.

ابزارها و روش عملی اجرا

سه ابزار نقش روشنی دارند:

  • Burp Suite: اسکنر آن تعریف API را مستقیماً می‌پذیرد — OpenAPI (JSON یا YAML)، WSDL برای SOAP، مجموعه‌ی Postman با قالب صادراتی v2.1.0، و GraphQL از راه introspection. محدودیت‌های مستندشده: ارجاع بیرونی در OpenAPI/WSDL پشتیبانی نمی‌شود، آدرس سرور باید مطلق باشد، محیط‌ها و اسکریپت‌های Postman پشتیبانی نمی‌شوند، و بدنه‌های file، formdata و graphql خارج از پوشش‌اند (جزئیات).
  • Postman: ابزار توسعه و QA است، نه ابزار امنیتی، و تشخیص آسیب‌پذیری ندارد؛ نقشش تولید ترافیک قابل رهگیری و ساختن همان مجموعه‌ای است که به اسکنر می‌دهید.
  • mitmproxy: رهگیری اسکریپت‌پذیر و بدون رابط گرافیکی، با افزونه‌های پایتون برای بازنویسی خودکار درخواست/پاسخ و کار روی ترافیک اپلیکیشن موبایل. اسکنر و معادل Repeater ندارد؛ مکمل پروکسی اصلی است، نه جایگزین.

اشتباهات رایج و نگاشت به استانداردها

باور غلط رایج

«API ما مستند نیست و لینکی به آن نداریم، پس امن است.» عدم مستندسازی کنترل امنیتی نیست؛ در فهرست ۲۰۲۳ دقیقاً به‌عنوان API9:2023 مدیریت نادرست فهرست دارایی‌ها ثبت شده است. اندپوینت‌های مستندنشده و نسخه‌های فراموش‌شده از جاوااسکریپت باندل‌شده، تاریخچه‌ی مخازن، خطاهای پرجزئیات و آرشیوهای عمومی وب بیرون می‌آیند — و چون فراموش شده‌اند، معمولاً وصله‌نشده و بدون محدودسازی نرخ‌اند.

باور غلط دوم: «اسکنر خودکار API را پوشش می‌دهد.» اسکنر برای تزریق، هدرها و CVEهای شناخته‌شده مفید است، اما BOLA و BFLA و منطق کسب‌وکار خارج از توان ساختاری اوست — همان نکته‌ای که در امنیت برنامه‌ی وب تکرار می‌شود: ابزار پوشش می‌دهد، انسان تصمیم را می‌سنجد.

نگاشت: در OWASP Top 10:2025 بیشتر یافته‌های API زیر A01 کنترل دسترسی شکسته و A02 پیکربندی نادرست می‌نشینند. شناسه‌های CWE پرکاربرد: CWE-639 (دور زدن مجوزدهی با کلید تحت کنترل کاربر)، CWE-862 (نبود مجوزدهی)، CWE-915 (تغییر کنترل‌نشده‌ی ویژگی‌های شیء — پایه‌ی تخصیص انبوه) و CWE-770 (تخصیص منابع بدون سقف).

پرسش‌های متداول

آیا WSTG برای تست API کافی است؟

خیر. بخش API در WSTG نسخه‌ی پایدار v4.2، یعنی WSTG-APIT، تنها یک آزمون دارد و آن هم GraphQL است. برای دسته‌بندی ریسک API باید از OWASP API Security Top 10 نسخه‌ی ۲۰۲۳ استفاده کرد و بخش‌های عمومی WSTG (نشست، اعتبارسنجی ورودی، رمزنگاری، مدیریت خطا) را در کنار آن به کار گرفت.

تفاوت BOLA و IDOR چیست؟

عملاً یک مفهوم‌اند. BOLA نامی است که OWASP در فهرست API Security Top 10 نسخه‌ی ۲۰۲۳ برای رتبه‌ی نخست انتخاب کرده و IDOR نام سنتی همان مسئله در ادبیات وب است. اگر گزارش شما درباره‌ی API است، اصطلاح BOLA دقیق‌تر و قابل ارجاع‌تر است.

غیرفعال کردن introspection در GraphQL کافی است؟

نه. خاموش کردن introspection فقط کشف شِما را سخت‌تر می‌کند؛ نام فیلدها و جهش‌ها از جاوااسکریپت کلاینت، مستندات داخلی و آزمون‌وخطا هم به‌دست می‌آید. کنترل‌های واقعی عبارت‌اند از مجوزدهی در سطح فیلد، سقف عمق و پیچیدگی کوئری، و محدودسازی نرخ که Batching را هم پوشش دهد.

آیا Postman ابزار تست امنیت API است؟

خیر. Postman ابزار توسعه و QA است و تشخیص آسیب‌پذیری ندارد؛ کاربردش تولید ترافیک و مجموعه‌ای است که به اسکنر داده می‌شود.

پیشگیری / رفع

به‌کارگیری و بهترین‌روش‌ها، به ترتیب اثربخشی:

  1. مجوزدهی را در لایه‌ی داده اعمال کنید، نه در کنترلر. شرط مالکیت باید جزئی از خود پرس‌وجو باشد (WHERE id = ? AND tenant_id = ?) تا «فراموش کردن بررسی» عملاً ممکن نباشد.
  2. قرارداد ورودی و خروجی را صریح تعریف کنید. برای نوشتن فقط فیلدهای مجاز را بپذیرید (DTO یا فهرست سفید)؛ برای خواندن، پاسخ را از یک نمای صریح بسازید، نه از سریال‌سازی مستقیم مدل پایگاه‌داده.
  3. مجوزدهی سطح عملیات را متمرکز کنید: رد پیش‌فرض، و تعریف اعلانیِ نقش لازم برای هر مسیر و متد — نه پراکنده در بدنه‌ی هر تابع.
  4. سقف بگذارید: حداکثر limit صفحه‌بندی و اندازه‌ی بدنه، سقف عمق و پیچیدگی GraphQL، خاموش کردن introspection در محیط عملیاتی، و محدودسازی نرخ هم‌زمان بر اساس حساب و IP.
  5. فهرست دارایی را زنده نگه دارید: تعریف OpenAPI به‌روز، حذف واقعی نسخه‌های بازنشسته و جداسازی محیط تست از عملیاتی — پاسخ به API9:2023.
  6. APIهای بیرونی را داده‌ی نامعتمد بدانید: پاسخ سرویس ثالث اعتبارسنجی شود، تغییر مسیر خودکار دنبال نشود، و درخواست‌های خروجی با فهرست سفید محدود شوند تا مسیر SSRF بسته بماند.

و یک آزمون منفی خودکار در CI برای هر اندپوینتِ شناسه‌گیر (اجرا با نشست کاربر دیگر، انتظار 403) این کنترل‌ها را زنده نگه می‌دارد. تست نفوذ وب و API همین موارد را با چند حساب هم‌سطح می‌آزماید؛ و اگر می‌خواهید تیم توسعه این الگوها را از ابتدا رعایت کند، دوره‌ی سازمانی توسعه‌ی امن ارزان‌تر از کشف پس از انتشار است.

→ بازگشت به دانشنامه
PUT IT TO THE TEST

امنیت سامانه‌ی شما را
به مهاجمان واگذار نکنید

تیم پی‌هانتر با دیدِ یک مهاجم واقعی، این آسیب‌پذیری‌ها و ده‌ها مورد دیگر را روی دارایی‌های شما می‌سنجد.