تست API یکی از ارکان اصلی امنیت در دنیای مدرن وب محسوب میشود زیرا رابطهای برنامهنویسی نرمافزار یا همان APIها وظیفه حیاتی برقراری ارتباط و تبادل داده میان سیستمهای مختلف را بر عهده دارند. اهمیت این موضوع زمانی مشخص میشود که بدانیم وجود هرگونه حفره امنیتی در این بخش میتواند منجر به افشای اطلاعات حساس، نقض یکپارچگی دادهها و از کار افتادن سرویسهای اصلی یک وبسایت گردد. از آنجایی که امروزه تمامی وبسایتهای پویا بر پایه ساختارهای API بنا شدهاند، حتی حملات سنتی مانند تزریق کد (SQL Injection) نیز به نوعی در حوزه تست و ارزیابی امنیت API قرار میگیرند. در این نوشتار تمرکز ما بر شناسایی و تحلیل APIهایی است که مستقیماً در لایه ظاهری یا فرانتاند وبسایت دیده نمیشوند و بیشتر با پروتکلهای RESTful و فرمت JSON سروکار دارند.
برای شروع فرآیند تست API، نخستین گام ضروری عملیات شناسایی یا Reconnaissance است تا بتوان تا حد امکان اطلاعات دقیقی از سطح حمله و ساختار داخلی سیستم به دست آورد. در این مرحله، شناسایی نقاط انتهایی یا Endpoints اولویت اصلی است؛ این نقاط در واقع آدرسهای مشخصی روی سرور هستند که درخواستهای مربوط به یک منبع خاص را دریافت و پردازش میکنند. برای درک بهتر، یک درخواست GET ساده را در نظر بگیرید:
GET /api/books HTTP/1.1 Host: example.com
در این مثال، نقطه انتهایی /api/books است که باعث تعامل با API برای دریافت لیست کتابها میشود. نقطه انتهایی دیگری مثل /api/books/mystery میتواند لیست کتابهای جنایی را فراخوانی کند. پس از یافتن این آدرسها، یک متخصص امنیت باید نحوه تعامل با آنها را درک کند که این شامل شناسایی دادههای ورودی، پارامترهای اجباری و اختیاری، متدهای HTTP پشتیبانی شده و همچنین مکانیسمهای احراز هویت و محدودیتهای نرخ درخواست میباشد.
یکی از منابع بسیار ارزشمند برای جمعآوری اطلاعات، مستندات رسمی خود API است که معمولاً برای تسهیل کار توسعهدهندگان تهیه میشود. این مستندات ممکن است به صورت انسانخوان برای مطالعه برنامهنویسان یا به صورت ماشینخوان مانند فایلهای JSON و XML برای اتوماسیون وظایف طراحی شده باشند. حتی اگر این مستندات به صورت عمومی در دسترس نباشند، با جستجو در مسیرهای رایج سیستم یا استفاده از ابزارهایی مانند Burp Scanner میتوان به آنها دست یافت. به عنوان مثال، اگر نقطه انتهایی /api/swagger/v1/users/123 را شناسایی کردید، باید مسیرهای پایه را بررسی کنید:
/api/swagger/v1/api/swagger/apiبررسی دقیق این فایلها به فرد اجازه میدهد تا به نقاط انتهایی مخفی و پارامترهایی که در ظاهر سایت وجود ندارند دسترسی پیدا کرده و سطح حمله را به طور دقیقتری ارزیابی نماید. استفاده از لیست کلمات رایج برای حدس زدن مسیرهای مستندات، از تکنیکهای کلیدی در این مرحله است.

پس از شناسایی نقاط انتهایی، مرحله تعامل و تحلیل رفتار API آغاز میشود که در آن از ابزارهای تخصصی برای مشاهده واکنشهای سرور استفاده میگردد. در این مرحله باید تمامی متدهای ممکن HTTP را روی هر نقطه انتهایی آزمایش کرد. برای مثال، نقطه انتهایی /api/tasks ممکن است از این متدها پشتیبانی کند:
GET /api/tasks – دریافت لیست وظایف POST /api/tasks – ایجاد یک وظیفه جدید DELETE /api/tasks/1 – حذف یک وظیفه خاص
گاهی اوقات یک آدرس که برای دریافت اطلاعات طراحی شده، ممکن است به دلیل پیکربندی اشتباه، اجازه حذف یا تغییر دادهها را نیز به مهاجم بدهد. همچنین تغییر نوع محتوا یا Content-Type در درخواستها میتواند منجر به شناسایی رفتارهای غیرمنتظره شود؛ به عنوان مثال ممکن است یک API در برابر دادههای JSON ایمن باشد اما در پردازش دادههای XML دچار خطاهای امنیتی گردد که منجر به افشای اطلاعات حساس یا دور زدن لایههای دفاعی شود.
یکی دیگر از چالشهای امنیتی مهم که در جریان تست API باید مورد توجه قرار گیرد، آسیبپذیری تخصیص انبوه یا Mass Assignment است. این مشکل زمانی رخ میدهد که فریمورکها به طور خودکار پارامترهای ارسالی کاربر را به فیلدهای داخلی یک شیء متصل میکنند. فرض کنید یک درخواست PATCH /api/users/ برای آپدیت پروفایل شامل دادههای زیر است:
{ "username": "wiener", "email": "wiener@example.com" }
اما همزمان درخواست GET /api/users/123 دادههای زیر را برمیگرداند:
{ "id": 123, "name": "John Doe", "email": "john@example.com", "isAdmin": "false" }
این نشان میدهد که فیلد isAdmin در شیء داخلی وجود دارد. اگر مهاجم فیلد "isAdmin": true را به درخواست PATCH خود اضافه کند و سرور آن را بدون اعتبارسنجی بپذیرد، کاربر به راحتی سطح دسترسی مدیریت پیدا میکند. تست این آسیبپذیری با ارسال مقادیر معتبر و نامعتبر (مثلاً قرار دادن یک رشته به جای مقدار بولین) و مشاهده تغییر رفتار برنامه صورت میگیرد.
بهترین راه تمرین این عملیات یعنی تست کردن API برای رسیدن به آسیب پذیری استفاده از آزمایشگاه های موجود هست که یکی از بهترین اونها وبسایت portswigger هست که با کلیک بر روی این لینک به آزمایشگاه های تمرینی فرستاده میشوید.
در نهایت برای جلوگیری از وقوع چنین آسیبپذیریهایی، امنیت باید از همان مراحل اولیه طراحی API در اولویت قرار گیرد. این اقدامات شامل محدود کردن متدهای HTTP تنها به موارد ضروری با استفاده از لیستهای مجاز، اعتبارسنجی دقیق نوع محتوا در هر درخواست و پاسخ، و استفاده از پیامهای خطای عمومی برای جلوگیری از افشای جزئیات فنی سیستم است که میتواند برای مهاجمان مفید باشد. همچنین باید توجه داشت که تمامی نسخههای API، از جمله نسخههای قدیمی که همچنان روی سرور فعال هستند، باید به طور کامل ایمنسازی شوند. با استفاده از لیستهای سفید برای ویژگیهای قابل تغییر توسط کاربر و مسدود کردن فیلدهای حساس، میتوان به طور موثری از حملات تخصیص انبوه جلوگیری کرد و پایداری کل سیستم را در برابر تهدیدات نوین تضمین نمود.
19%
19%