Selam millet, BlueTornado yazıyor.
Modern uygulamaların yüzeyi çoğu zaman HTML formlarından çok JSON API'lerdir. OWASP API Security Top 10, bu yüzeyi hedefleyen riskleri listeler. Bu rehberde 2023 sürümüne odaklanarak özellikle BOLA ve BFLA'yı, labda test yaklaşımını ve savunma kontrollerini anlatıyoruz. İcat istatistik veya uydurma CVE yok; resmi OWASP dokümanına bağlı kalıyoruz.
Konuda Anlatılacaklar
- API güvenliği neden ayrı ele alınır?
- OWASP API Top 10 2023 özeti
- BOLA (object) ve BFLA (function) derinlemesine
- Lab: basit API ile A/B hesap testi
- Korunma: authn/authz, rate limit, şema
- İleri seviye: GraphQL, mass assignment, envanter
- Kaynakça ve yasal uyarı
1) API Güvenliği Nedir?
API'ler makine-okur, otomasyona açıktır, mobil/SPA/partner entegrasyonlarını besler. UI'da gizlenen bir düğme API'de hâlâ duruyor olabilir. Kimlik doğrulama (authentication) ile yetkilendirme (authorization) karıştırılmamalıdır: "Token var" yetki demek değildir.
2) OWASP API Top 10 2023 Özeti
Resmi liste (kısa Türkçe karşılıklarıyla):
- API1:2023 Broken Object Level Authorization (BOLA)
- API2:2023 Broken Authentication
- API3:2023 Broken Object Property Level Authorization
- API4:2023 Unrestricted Resource Consumption
- API5:2023 Broken Function Level Authorization (BFLA)
- API6:2023 Unrestricted Access to Sensitive Business Flows
- API7:2023 Server Side Request Forgery
- API8:2023 Security Misconfiguration
- API9:2023 Improper Inventory Management
- API10:2023 Unsafe Consumption of APIs
Detay için OWASP API Security Project sayfasına bakın. Sürüm yılını raporlarınızda belirtin.
[center][/center]
3) BOLA Nedir?
Broken Object Level Authorization, web'deki IDOR'un API dilindeki adıdır. Kullanıcı, erişmemesi gereken nesneye kimlik (id) ile ulaşır.
# Tehlikeli
GET /api/v1/users/214/orders
# Authorization yalnızca "login oldu mu?" seviyesinde# Doğru yön
order = repo.get(order_id)
if order.owner_id != current_user.id:
raise Forbidden()4) BFLA Nedir?
Broken Function Level Authorization, işlev düzeyinde yetki eksikliğidir. Özellikle admin uçlarının gizlenerek "güvende" sanılması.
DELETE /api/v1/admin/users/214
POST /api/v1/admin/settings/maintenance
# UI'da admin menüsü yok ama endpoint açık# Rol kontrolü
if "admin" not in current_user.roles:
raise Forbidden()BOLA nesne sahipliğine, BFLA ise role/işleve bakar; ikisi birlikte test edilmelidir.
5) Lab: Mini API Testi
Kendi bilgisayarınızda iki kullanıcı oluşturabileceğiniz bir lab API'si kullanın (Juice Shop API, crAPI, veya kendi Flask iskeletiniz).
# A kullanıcısı token
TOKEN_A=...
TOKEN_B=...
# A kendi kaynağını okur
curl -s -H "Authorization: Bearer $TOKEN_A" http://127.0.0.1:8000/api/orders/1
# A, B'nin order id'sini dener
curl -s -o /tmp/out -w "%{http_code}" -H "Authorization: Bearer $TOKEN_A" \
http://127.0.0.1:8000/api/orders/2
# 403/404 beklenir; 200 + B verisi = BOLA# BFLA denemesi
curl -s -o /tmp/out -w "%{http_code}" -H "Authorization: Bearer $TOKEN_A" \
-X DELETE http://127.0.0.1:8000/api/admin/users/2
# 403 beklenir[center][/center]
6) Kavram Referansı ve Korunma
Object property level (API3): Kullanıcı nesneyi görebilir ama
is_adminsalary# Allowlist serialize
return {"id": o.id, "item": o.item, "status": o.status}
# role, internal_notes yokResource consumption (API4): Rate limit, pagination tavanı, max page size, maliyetli aramalar için kota.
# Örnek (nginx / API gateway)
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;Inventory (API9): Eski
/v1# OpenAPI'de tanımlı olmayan yolu reddet (gateway politikası)Authn (API2): Credential stuffing'e karşı rate limit + MFA; JWT için bir önceki konudaki kurallar.
7) Uygulamalı Kontrol Listesi
- Her endpoint için: kim çağırabilir, hangi nesneler?
- A/B hesap otomasyon testi CI'da
- Admin prefix'leri ayrı authz middleware
- Response'ta fazla alan sızıntısı var mı?
- Rate limit ve payload size limit
- WAF/gateway + uygulama içi kontrol (defense in depth)
- Log: authz deny olayları
# Pseudo test
def test_bola_forbidden(client, user_a, order_of_b):
r = client.get(f"/api/orders/{order_of_b.id}", headers=auth(user_a))
assert r.status_code in (403, 404)[center][/center]
8) İleri Seviye
GraphQL: Tek endpoint; field-level authz, query depth/cost limit, introspection'ı production'da kapatma.
BFLA keşfi: OpenAPI / JS bundle içinde
/adminroleinternalUnsafe consumption (API10): Üçüncü parti API yanıtına güvenerek komut/SQL birleştirmeyin; şema doğrulayın.
# Rapor
Bulgu: BOLA (API1:2023) / CWE-639
Endpoint: GET /api/orders/{id}
Kanıt: Kullanıcı A, B siparişini 200 ile okudu
Öneri: object-level authz + otomatik test9) Sonuç
API güvenliği, UI güvenlik varsayımlarını taşımaz. BOLA ve BFLA en sık atlanan yetki hatalarıdır; rate limit, şema ve envanter ile tamamlayın. OWASP API Top 10'u ekip içinde ortak dil yapın.
Ek: Partner API ve Versiyonlama Notları
Dışarıya açılan partner API'lerinde ek olarak:
- İstemci kimliği başına ayrı kimlik bilgisi ve scope
- IP allowlist (mümkünse) + mTLS (yüksek güvenlikli B2B)
- Değişiklik yönetimi: breaking change için yeni versiyon
- Eski versiyonun kapatılma tarihi (inventory ile bağlantılı)
# Scope örneği
Authorization: Bearer ...
# token içinde scope: "orders:read"
# orders:write gerektiren endpoint'te reddedin# Sayfalama tavanı
GET /api/orders?limit=1000 -> 400 Bad Request (max 50)[center][/center]
API Top 10 maddelerini sprint Definition of Done listesine tek satırlık kontroller olarak eklemek, "sonra bakarız" riskini azaltır.
Kaynakça
- OWASP API Security Top 10 2023
- API1 BOLA
- API5 BFLA
- OWASP REST Security Cheat Sheet
- CWE-285 Improper Authorization
Yasal Uyarı
API testleri yalnızca kendi sistemleriniz veya yazılı pentest yetkisi kapsamında yapılmalıdır. İzinsiz API tarama ve veri erişimi TCK 243-245 kapsamında suç olabilir. Eğitim amaçlıdır.
Yasal uyarı: Bu içerik eğitim amaçlıdır. Yalnızca kendi sistemlerinizde veya yazılı izin aldığınız hedeflerde uygulayın (TCK 243-245).