الفرق الحمراء — الهجومخبير70mL26

API Security — البوابة اللي محدش بيراقبها

BOLA و OAuth و GraphQL و REST — اللي بتقع فيه فعلاً

#BOLA#OAuth#GraphQL#REST

ليه أمن الـ API بقى الجبهة رقم واحد دلوقتي؟

إنت بتأمّن "الموقع". تمام.

طب الموبايل app؟ والـ partner integrations؟ والـ admin dashboard؟ والـ v1 القديم اللي محدش فاكره من 2019؟

كل واحد من دول API منفصل. جبهة منفصلة. ثغرات منفصلة.

- طب يا حضرتك، أنا حاطط WAF قدام كل حاجة.. مش كفاية؟

يا نجم الجيل. الـ WAF بيشوف الـ traffic، مش بيشوف منطق الـ business. الـ BOLA بيمر منه طبيعي — السيرفر هو اللي لازم يشوف إن الـ user ده مش صاحب الـ object ده.

تشبيه — شرح مبسط
الموقع القديم = بنك فيه شباك واحد للزباين. الـ API الحديث = بنك فيه ألف باب خلفي: للموبايل، للموظفين، للشركاء، لشركات تانية. تنسى تقفل باب واحد = الكارثة. أكتر من 70% من ترافيك الويب دلوقتي بقى APIs، يعني الـ "موقع" اللي بتأمّنه دلوقتي هو 30% بس من الصورة.
قصة Optus 2022 — 9.8 مليون عميل في endpoint واحد
مشغّل اتصالات أسترالي. endpoint اسمه /api/customer/{id} مفتوح من غير authentication. فيه id رقمي تسلسلي. الـ attacker كتب loop بسيط: for i in range(1, 10_000_000). اللي حصل فعلياً: 9.8 مليون رقم passport, license, address. مش 0day. مش APT. BOLA + sequential IDs + endpoint منسي. ده الـ API1 و API9 مع بعض في حادثة واحدة.

OWASP API Security Top 10 (2023)

  1. API1 — BOLA (Broken Object Level Auth): نسخة الـ IDOR للـ API. الأكثر شيوعاً وبفارق كبير.
  2. API2 — Broken Authentication: JWT ضعيف، tokens تتخمن.
  3. API3 — Broken Object Property Level Auth: اليوزر بيعدل في حقول مش مسموح له بيها (mass assignment).
  4. API4 — Unrestricted Resource Consumption: مفيش rate limit → DoS أو brute force.
  5. API5 — Broken Function Level Auth: يوزر عادي بيوصل لـ /admin/*.
  6. API6 — Unrestricted Access to Sensitive Business Flows: شراء آلاف القطع بسعر التخفيض.
  7. API7 — Server Side Request Forgery (SSRF).
  8. API8 — Security Misconfiguration: CORS مفتوح على الآخر، debug endpoints سايبة.
  9. API9 — Improper Inventory Management: APIs قديمة (v1) منسية ولسة شغالة.
  10. API10 — Unsafe Consumption of 3rd-party APIs.

BOLA — الثغرة الأكثر شيوعاً وأرخصها في الاكتشاف

HTTP
# طلب شرعي
GET /api/v1/users/1042/orders
Authorization: Bearer eyJ...

# تغيير المعرّف فقط
GET /api/v1/users/1043/orders
Authorization: Bearer eyJ...   ← نفس التوكن
# لو نجح: BOLA — السيرفر لم يفحص الملكية
الحماية
في كل endpoint لازم يكون: WHERE owner_id = current_user.id. متعتمدش على الـ ID في الـ URL لوحده. استخدم UUIDs عشان تقلل التخمين.

GraphQL — جبهة لوحدها

  • Introspection — بيكشف الـ schema كاملة (اقفله في الإنتاج).
  • Query depth attacks — استعلامات عميقة بتاكل الـ CPU.
  • Field duplication / aliasing — عشان تتخطى rate limits.
  • Batching attacks — تجرب كل الباسوردات في request واحد.
  • SQL/NoSQL injection جوه الـ resolvers نفسهم.
graphql attack
# Introspection للكشف
{ __schema { types { name fields { name } } } }

# Batching brute-force
[
  { "query": "mutation { login(u: \"admin\", p: \"a\") }" },
  { "query": "mutation { login(u: \"admin\", p: \"b\") }" },
  ...
]

أدوات: graphql-cop, InQL, clairvoyance, GraphQLmap.

OAuth 2.0 / OIDC — الغلطات اللي بتتكرر

  • Implicit flow — مات خلاص، متستخدموش.
  • Missing PKCE في الموبايل والـ SPAs.
  • redirect_uri مش محدد بدقة → سرقة الـ code.
  • State parameter ناقص → CSRF.
  • قبول tokens من أي issuer.
  • مفيش فحص لـ aud جوه الـ JWT.
الأمان الحديث
استخدم Authorization Code + PKCE دايماً، حتى للـ SPAs. خزّن الـ tokens في HttpOnly cookies، مش في localStorage.

Rate Limiting وDoS

  • على مستوى الـ user والـ IP والـ endpoint كل واحد لوحده.
  • استخدم token bucket أو sliding window.
  • بطّئ الـ login بعد 3 محاولات (exponential backoff).
  • راقب API spike anomalies في الـ SIEM.
  • الأدوات: Cloudflare Rate Limiting, AWS WAF rate-based rules, Redis-cell, envoy ratelimit.

API Discovery و Inventory

متقدرش تحمي حاجة معرفش بوجودها. الـ shadow APIs والـ zombie APIs هما أكبر خطر دلوقتي.

  • Salt Security, Noname, 42Crunch, Akamai API Security.
  • توليد OpenAPI specs تلقائياً من الـ traffic.
  • مراجعة دورية للـ deprecated endpoints.

اختبار الـ APIs

tools
# Discovery
kiterunner scan https://api.target.com -A=apiroutes-241121
arjun -u https://api.target.com/users -m GET   # parameter discovery

# Fuzzing
ffuf -u "https://api.target.com/v1/FUZZ" -w api-wordlist.txt -mc 200,401,403
postman / Insomnia / Hoppscotch

# Authn / Authz testing
ZAP API scanner
mindmap-style: Burp + Autorize plugin
graphw00f                 # GraphQL fingerprinting
clairvoyance              # GraphQL schema recovery without introspection

# Continuous
Schemathesis (property-based)
Stoplight + Spectral (lint OpenAPI)

مبادئ تصميم آمن

  1. Never trust the client — افحص كل حاجة على السيرفر، مفيش استثناء.
  2. صلاحيات على مستوى كل field، مش بس الـ object.
  3. استخدم scopes ضيقة وshort-lived tokens.
  4. versioning واضح + خطة deprecation معلنة.
  5. كل response معاه Content-Type صح + security headers.
  6. سجّل كل authn/authz failures في الـ SIEM. ده اللي هيكشف لك الهجوم.
  7. Pagination بحدود قصوى عشان متسمحش بـ dump كامل.

غلطات الـ junior في الـ API

الأخطاء اللي بتعمل breach
  • "الموبايل client بيشيك الصلاحيات" — الـ client مش معاك. أي حاجة بتعتمد على الـ client = ثغرة.
  • JWT في localStorage — أي XSS يسرّبهم. استخدم HttpOnly cookies + SameSite=Strict.
  • سيبوا /v1 شغال — الـ /v2 معمول صح، الـ /v1 لسه فيه BOLA من 2019. الـ attacker مش غبي، بيستخدم القديم.
  • CORS مفتوحAccess-Control-Allow-Origin: * مع credentials = هدية للمهاجم.
  • مفيش rate limit على /login — Password spraying في 4 ساعات على 50 ألف حساب. والـ logs مش بتاخد بالها.
  • Mass assignment — يبعت {"is_admin": true} في PUT /profile. والـ ORM بيقبلها زي ما هي.

الخلاصة الناشفة

الـ API مش "موقع بدون UI". الـ API هو الـ backend بكل صلاحياته مكشوف على الإنترنت.

كل endpoint = قرار authorization منفصل. مفيش "نسيت أحط check" — لو نسيت، يبقى دي ثغرة.

وقبل ما تأمّن الـ APIs، اعرفهم. الـ Shadow API اللي مش في الـ inventory هو اللي بياخد الشركة.

اكتبها على Confluence فوق:

API محدش فاكره = breach محدش هيسمع بيه إلا في الجرنال.