API Security؛ وقتی پشت هر Request یک منطق پنهان است

api-security-when-there-is-hidden-logic-behind-every-request
0 دیدگاه
۱۴۰۵-۰۷-۱۶ ۱۵:۵۷:۲۲

نویسنده: SINISTER | رضا فروزان
برند: صفر و یک سایبر
سطح: متوسط تا پیشرفته
حوزه: Web & API Security
محیط تمرین: آزمایشگاه محلی و مجاز
ابزارها: Burp Suite، DevTools، curl


۱. API چیست؟

تا اینجا بیشتر با صفحات وب و Requestهای مرورگر کار کردیم.

اما بسیاری از برنامه‌های مدرن بدون API عملاً کار نمی‌کنند.

وقتی داخل یک سایت:

  • وارد حساب می‌شوی؛
  • محصولی را جست‌وجو می‌کنی؛
  • پروفایل را تغییر می‌دهی؛
  • سفارشی ثبت می‌کنی؛
  • یا اطلاعاتی را بدون Refresh صفحه دریافت می‌کنی؛

احتمال زیادی وجود دارد که مرورگر در پشت صحنه با یک API ارتباط برقرار کرده باشد.

یک معماری ساده:

Browser
   ↓
HTTP Request
   ↓
API
   ↓
Application Logic
   ↓
Database

بنابراین در تست نفوذ، API خودش یک Attack Surface مستقل است.


۲. API Endpoint چیست؟

فرض کن برنامه چنین Endpointهایی دارد:

GET    /api/products
GET    /api/products/15
POST   /api/orders
PATCH  /api/profile
DELETE /api/address/7

هر Endpoint یک نقطه ورود به منطق برنامه است.

برای هر Endpoint باید بتوانیم پاسخ این سؤال‌ها را پیدا کنیم:

  • چه کسی می‌تواند آن را فراخوانی کند؟
  • چه Methodهایی مجاز هستند؟
  • چه داده‌ای دریافت می‌کند؟
  • چه داده‌ای برمی‌گرداند؟
  • چه مجوزی لازم دارد؟
  • چه محدودیت‌هایی روی آن اعمال شده؟
  • در صورت خطا چه اطلاعاتی افشا می‌کند؟

۳. API را مثل یک Pentester ببین

یک اشتباه رایج این است که API را فقط به شکل URL ببینیم.

در واقع باید Endpoint را به‌صورت یک قرارداد امنیتی در نظر بگیریم:

Endpoint
   +
Method
   +
Authentication
   +
Authorization
   +
Input Validation
   +
Business Logic
   +
Rate Limit
   +
Response

اگر یکی از این لایه‌ها درست طراحی نشده باشد، ممکن است سطح حمله ایجاد شود.


۴. Authentication در API

اولین سؤال:

آیا API می‌داند درخواست متعلق به چه کاربری است؟

ممکن است API از:

  • Session Cookie
  • Token
  • JWT
  • API Key

استفاده کند.

برای مثال:

GET /api/profile HTTP/1.1
Host: localhost:3000
Cookie: session=...

یا:

Authorization: Bearer <token>

در تست نفوذ، نحوه احراز هویت باید مستند شود.

اما یک نکته مهم:

Authentication فقط می‌گوید چه کسی هستی.

این هنوز جواب نمی‌دهد که:

چه کاری اجازه داری انجام بدهی؟

این موضوع مربوط به Authorization است.


۵. Authorization؛ مهم‌تر از چیزی که به نظر می‌رسد

فرض کن کاربر وارد حساب خودش شده است.

او می‌تواند:

GET /api/profile

را اجرا کند.

اما آیا باید بتواند:

GET /api/admin/users

را هم اجرا کند؟

احراز هویت موفق به معنی مجوز دسترسی به همه Endpointها نیست.

پس در هر API باید این رابطه را بررسی کنیم:

Identity
   ↓
Role / Ownership
   ↓
Allowed Action
   ↓
Resource

۶. Object-Level Authorization

یکی از موضوعات مهم در API، کنترل دسترسی به Objectهاست.

فرض کن:

GET /api/orders/100

به کاربر اجازه می‌دهد سفارش خودش را مشاهده کند.

سؤال:

اگر همان کاربر شناسه دیگری را درخواست کند چه اتفاقی می‌افتد؟

در یک سیستم امن، سرور باید بررسی کند که آن Object واقعاً متعلق به کاربر است یا کاربر مجوز دسترسی به آن را دارد.

شناسه در URL نباید به‌تنهایی مجوز دسترسی باشد.

این مفهوم یکی از مهم‌ترین بخش‌های API Pentesting است.


۷. Horizontal و Vertical Access Control

Horizontal Access Control

دو کاربر در یک سطح دسترسی قرار دارند، اما نباید به منابع یکدیگر دسترسی داشته باشند.

مثلاً:

User A → Order A
User B → Order B

کاربر A نباید بتواند سفارش خصوصی B را مشاهده کند.

Vertical Access Control

سطح دسترسی کاربران متفاوت است.

مثلاً:

User
Admin
Moderator

یک User عادی نباید بتواند Endpointهای مخصوص Admin را اجرا کند.


۸. Mass Assignment چیست؟

فرض کن API برای ویرایش پروفایل چنین داده‌ای دریافت می‌کند:

{
  "name": "Ali",
  "email": "ali@example.test"
}

حالا برنامه بدون کنترل دقیق، هر فیلدی را که کاربر ارسال کند به Object داخلی منتقل کند.

اگر مدل برنامه فیلدهایی مانند:

role
isAdmin
accountStatus

داشته باشد، این طراحی می‌تواند خطرناک شود.

اصل امنیتی:

سرور باید دقیقاً مشخص کند چه فیلدهایی از کاربر قابل تغییر هستند.

نباید تصور کنیم:

«اگر UI این فیلد را نشان نمی‌دهد، کاربر نمی‌تواند آن را ارسال کند.»

UI مرز امنیتی نیست.

Authorization و Field-Level Validation باید در سمت سرور اعمال شوند.


۹. Excessive Data Exposure

گاهی API اطلاعات بیشتری از نیاز واقعی کاربر برمی‌گرداند.

مثلاً UI فقط این موارد را نمایش می‌دهد:

{
  "name": "Ali",
  "avatar": "..."
}

اما API ممکن است اطلاعات بسیار بیشتری ارسال کند.

اگر داده حساس بدون نیاز در Response قرار گرفته باشد، مشکل طراحی ایجاد می‌شود.

در تست API بررسی کن:

  • چه فیلدهایی برگردانده می‌شوند؟
  • کدام فیلدها برای کاربر لازم هستند؟
  • آیا اطلاعات داخلی یا حساس وجود دارد؟
  • آیا UI همه Response را مصرف می‌کند یا فقط بخشی از آن را؟

۱۰. Rate Limiting

فرض کن یک Endpoint حساس وجود دارد:

POST /api/login

اگر برنامه هیچ محدودیتی روی تعداد درخواست‌ها نداشته باشد، ممکن است در برابر حجم بالای درخواست آسیب‌پذیر شود.

Rate Limiting می‌تواند برای مواردی مانند:

  • Login
  • Password Reset
  • OTP
  • Search
  • Expensive API Operations

اهمیت داشته باشد.

اما Rate Limit باید متناسب با عملکرد واقعی برنامه طراحی شود.

یک عدد ثابت برای همه Endpointها همیشه مناسب نیست.


۱۱. HTTP Methods

در API به Methodها توجه کن:

GET
POST
PUT
PATCH
DELETE

مثلاً:

GET /api/profile

برای دریافت اطلاعات استفاده می‌شود.

و:

PATCH /api/profile

ممکن است برای تغییر بخشی از آن باشد.

Pentester باید بررسی کند که:

  • آیا Method غیرضروری فعال است؟
  • آیا Endpoint با Method نامناسب پاسخ می‌دهد؟
  • آیا Authorization برای هر Method جداگانه بررسی می‌شود؟
  • آیا عملیات حساس فقط با Method مورد انتظار انجام می‌شود؟

۱۲. API Enumeration

در مرحله Recon، API را نیز Map کن.

منابع مفید:

  • DevTools → Network
  • Burp → HTTP History
  • JavaScript Files
  • API Documentation
  • OpenAPI/Swagger در صورت مجاز بودن
  • Responseها
  • Error Messageها

یک جدول بساز:

Endpoint Method Auth Role Resource Risk
/api/profile GET Yes User Own Low
/api/orders/{id} GET Yes User Own Medium
/api/admin/users GET Yes Admin All High

این جدول یکی از ارزشمندترین ابزارهای ذهنی Pentester است.


۱۳. سناریوی عملی امن؛ Zero API Lab

در این سناریو فقط API آزمایشگاه محلی خودت را بررسی می‌کنیم.

معماری:

┌───────────┐
│ Browser   │
└─────┬─────┘
      │
      ▼
┌──────────────┐
│ Local API    │
│ localhost    │
└─────┬────────┘
      │
      ▼
┌──────────────┐
│ Test Database│
└──────────────┘

هدف:

ساخت نقشه امنیتی API و بررسی کنترل‌های Authentication و Authorization.


۱۴. مرحله اول؛ پیدا کردن APIها

برنامه آزمایشگاهی را اجرا کن.

DevTools را باز کن:

F12 → Network

حالا چند عملیات عادی انجام بده:

  • Login
  • مشاهده Profile
  • جست‌وجو
  • مشاهده محصول
  • تغییر یک داده آزمایشی

در Network درخواست‌هایی را که به API می‌روند پیدا کن.

برای هر درخواست ثبت کن:

Endpoint
Method
Parameters
Authentication
Response

۱۵. مرحله دوم؛ انتقال درخواست به Burp Repeater

یک Request آزمایشگاهی را انتخاب کن و آن را در Burp Suite به Repeater منتقل کن.

در Repeater بدون تغییر مخرب، Request را دوباره ارسال کن.

هدف:

آیا رفتار API قابل تکرار است؟

موارد زیر را ثبت کن:

  • Status Code
  • Response Length
  • Content-Type
  • Response Body
  • Headers

۱۶. مرحله سوم؛ بررسی Authentication

در محیط آزمایشگاهی، یک Request مجاز را با Session معتبر ارسال کن.

سپس همان Request را بدون اطلاعات Authentication بررسی کن.

مثلاً:

With Authentication → Expected Response
Without Authentication → Expected Denial

اگر Endpoint خصوصی بدون Authentication اطلاعات خصوصی برگرداند، نیازمند بررسی جدی است.


۱۷. مرحله چهارم؛ بررسی Authorization با دو حساب آزمایشی

اگر آزمایشگاه اجازه ساخت دو حساب دارد:

Test User A
Test User B

ایجاد کن.

با User A یک Resource متعلق به خودش بساز.

مثلاً:

Order A

سپس با User B بررسی کن که آیا همان Resource طبق سیاست برنامه قابل دسترسی است یا خیر.

این آزمایش فقط با داده‌های ساختگی حساب‌های آزمایشگاهی انجام شود.

هدف:

User B → Order A → Expected: DENY

اگر برنامه اجازه دسترسی بدهد، نتیجه را مستند کن و برای تأیید علت، کنترل Authorization سمت سرور را بررسی کن.


۱۸. مرحله پنجم؛ بررسی Field-Level Authorization

یک Request ویرایش پروفایل خودت را در Repeater بررسی کن.

مثلاً:

{
  "name": "Test User",
  "email": "test@example.local"
}

فقط در آزمایشگاه، بررسی کن که سرور چه فیلدهایی را واقعاً اجازه تغییر می‌دهد.

اگر API مستندات یا Schema دارد، آن را با رفتار واقعی مقایسه کن.

اصل:

Client Input
     ↓
Server Validation
     ↓
Allowed Fields
     ↓
Database

نه:

Client Input
     ↓
Database

۱۹. مرحله ششم؛ بررسی Response

یک Response واقعی API را بخوان.

سؤال‌ها:

  • آیا اطلاعات اضافی وجود دارد؟
  • آیا Internal IDها نمایش داده می‌شوند؟
  • آیا اطلاعات حساس در Response قرار گرفته؟
  • آیا Error Message بیش از حد جزئیات دارد؟
  • آیا Stack Trace نمایش داده می‌شود؟

هر مورد را با Context ارزیابی کن.


۲۰. مرحله هفتم؛ بررسی Rate Limit

برای یک Endpoint آزمایشگاهی و کم‌خطر، تعداد محدودی درخواست ارسال کن.

هدف، ایجاد فشار روی سرور نیست.

فقط بررسی کن آیا برنامه:

  • محدودیت درخواست دارد؟
  • پاسخ مناسبی هنگام عبور از حد می‌دهد؟
  • Header مربوط به محدودیت ارائه می‌کند؟
  • برای Endpointهای حساس سیاست جداگانه دارد؟

هیچ تست حجمی یا DoS انجام نده.


۲۱. API Security Checklist

Discovery

  • API Endpointها را شناسایی کردم.

  • Methodهای هر Endpoint را ثبت کردم.

  • پارامترها را مستند کردم.

Authentication

  • Endpointهای خصوصی Authentication دارند.

  • Session/Token رفتار قابل انتظار دارد.

  • Logout باعث پایان Session می‌شود.

Authorization

  • User فقط Resource خودش را می‌بیند.

  • Roleها به‌درستی محدود شده‌اند.

  • Endpointهای Admin برای User عادی قابل استفاده نیستند.

  • Fieldهای حساس سمت سرور کنترل می‌شوند.

Input

  • ورودی‌ها اعتبارسنجی می‌شوند.

  • Mass Assignment کنترل شده است.

  • نوع و محدوده داده‌ها مشخص است.

Response

  • داده اضافی افشا نمی‌شود.

  • Errorها اطلاعات حساس ندارند.

  • Response با نیاز واقعی Client متناسب است.

Availability

  • Endpointهای حساس Rate Limit دارند.

  • عملیات پرهزینه محدود شده‌اند.


۲۲. گزارش‌نویسی

برای هر Finding این ساختار را استفاده کن:

Title

مثلاً:

Broken Object-Level Authorization در Endpoint آزمایشگاهی سفارش

Description

توضیح بده چه اتفاقی رخ می‌دهد.

Affected Endpoint

GET /api/orders/{id}

Preconditions

چه سطح دسترسی یا شرایطی برای مشاهده رفتار لازم است؟

Evidence

Request و Response مربوط به آزمایش.

Impact

اگر این رفتار در محیط واقعی وجود داشته باشد، چه اثری می‌تواند داشته باشد؟

Remediation

راهکار اصلاحی مشخص و قابل اجرا.

Severity

با توجه به Impact و شرایط واقعی تعیین شود.


۲۳. اشتباهات رایج هنگام تست API

اشتباه اول

فقط Endpointهایی را بررسی کنیم که UI به ما نشان می‌دهد.

اشتباه دوم

تصور کنیم UI مرز امنیتی است.

اشتباه سوم

Authentication را با Authorization اشتباه بگیریم.

اشتباه چهارم

فقط Status Code را بررسی کنیم.

اشتباه پنجم

Response را بدون بررسی داده‌های حساس رها کنیم.

اشتباه ششم

برای پیدا کردن Rate Limit تست حجمی انجام دهیم.

اشتباه هفتم

بدون مجوز API واقعی یک سازمان را تست کنیم.


۲۴. طرز فکر حرفه‌ای

وقتی یک API می‌بینی، این زنجیره را در ذهن داشته باش:

Who?
 ↓
Authentication

What can they access?
 ↓
Authorization

What can they change?
 ↓
Field-Level Controls

What can they send?
 ↓
Input Validation

What can they receive?
 ↓
Response Security

How often can they call?
 ↓
Rate Limiting

اگر بتوانی برای هر Endpoint این شش سؤال را پاسخ بدهی، عملاً داری API را مثل یک Pentester تحلیل می‌کنی.


جمع‌بندی

API فقط یک URL نیست.

هر Endpoint یک دروازه به منطق برنامه است.

امنیت API یعنی بررسی هم‌زمان:

Authentication + Authorization + Input Validation + Business Logic + Response Security + Rate Limiting

در این قسمت یاد گرفتیم که یک Pentester باید API را Map کند، جریان Authentication را بفهمد، مالکیت Resourceها را بررسی کند، Fieldهای قابل تغییر را شناسایی کند و Responseها را از نظر افشای اطلاعات تحلیل کند.

به خاطر داشته باش:

اگر UI چیزی را نشان نمی‌دهد، به این معنی نیست که API آن را قبول نمی‌کند.

و مهم‌تر:

امنیت واقعی باید در سمت سرور enforce شود؛ نه در ظاهر برنامه.


قسمت بعدی

قسمت ۱۵ — Business Logic & Race Conditions

این بار وارد بخشی می‌شویم که همیشه با یک Payload قابل مشاهده نیست:

منطق خودِ برنامه.

جایی که ممکن است تک‌تک Requestها کاملاً معتبر باشند، اما ترکیب یا ترتیب آن‌ها باعث ایجاد یک رفتار غیرمجاز شود.

صفر و یک سایبر | آموزش فارسی امنیت سایبری و هک قانونمند

تمام تمرین‌ها را فقط روی آزمایشگاه محلی، سیستم شخصی یا اهدافی که مجوز صریح تست آن‌ها را داری انجام بده.

دسته بندی‌ها:

آنچه در این مقاله میخوانید

دیدگاه شما

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *