API Test Temelleri
API'ler (Application Programming Interfaces), yazılım sistemleri arasında iletişim ve veri paylaşımını sağlar. Modern web uygulamalarının çoğu API tabanlı mimariler kullanır, bu da API güvenlik testlerini kritik kılar.
API Test Alanları:
- Authentication & Authorization: Kimlik doğrulama ve yetkilendirme
- Input Validation: Giriş veri doğrulama
- Rate Limiting: İstek sınırlandırma
- Data Exposure: Veri sızıntısı riskleri
- Business Logic: İş mantığı açıkları
// Tipik API endpoint örneği
GET /api/users/123
Host: example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
// Response
{
"id": 123,
"name": "John Doe",
"email": "john@example.com",
"role": "user"
}
🎯 Test Stratejisi: API testlerini başlamadan önce OWASP API Security Top 10 listesini inceleyin ve sistematik bir yaklaşım benimseyin.
API Keşif (Reconnaissance)
API testine başlamadan önce hedef API hakkında mümkün olduğunca fazla bilgi toplamalısınız. Bu, saldırı yüzeyini keşfetmek için kritiktir.
Keşif Adımları:
• API endpoint'lerini tespit etme
• Desteklenen HTTP metodlarını belirleme
• Giriş/çıkış veri formatlarını analiz etme
• Rate limiting ve authentication mekanizmalarını inceleme
• API dokümantasyonunu bulma
API endpoint, API'nin belirli bir kaynak için istekleri aldığı konumdur.
Örnek: /api/books - kitapları listeler
API Dokümantasyonu Keşfi
API dokümantasyonu, geliştiricilerin API'yi nasıl kullanacağını öğrenmeleri için hazırlanır. Bu dokümantasyon genellikle kamuya açıktır ve değerli bilgiler içerir.
// Yaygın dokümantasyon endpoint'leri
/api
/swagger/index.html
/openapi.json
/docs
/api-docs
/swagger-ui
/redoc
OpenAPI/Swagger: JSON/YAML formatında makine okunabilir
Postman Collections: API test koleksiyonları
GraphQL Schema: GraphQL API şeması
Manual Docs: İnsan okunabilir dokümantasyon
Keşif Tekniği: Bir endpoint bulduğunuzda, base path'leri de kontrol edin. /api/swagger/v1/users/123 bulduysanız, /api/swagger/v1, /api/swagger ve /api yollarını da inceleyin.
Endpoint Keşfi
API endpoint'lerini keşfetmek, test sürecinin en kritik adımlarından biridir. Web uygulamasını kullanarak ve kaynak kodunu inceleyerek endpoint'leri bulabilirsiniz.
Endpoint Keşif Yöntemleri:
- Burp Scanner: Otomatik crawling ve endpoint çıkarımı
- JavaScript Analizi: JS dosyalarında API referansları
- Network Traffic: Browser Developer Tools ile trafik analizi
- Directory Bruteforce: Yaygın endpoint isimlerini deneme
- Error Messages: Hata mesajlarında endpoint ipuçları
HTTP Metod Testleri
API endpoint'leri farklı HTTP metodlarını destekleyebilir. Her metodu test etmek, ek saldırı yüzeylerini keşfetmenize yardımcı olur.
// Aynı endpoint, farklı metodlar
GET /api/tasks - Görev listesini getir
POST /api/tasks - Yeni görev oluştur
PUT /api/tasks/1 - 1 numaralı görevi güncelle
DELETE /api/tasks/1 - 1 numaralı görevi sil
PATCH /api/tasks/1 - 1 numaralı görevi kısmen güncelle
OPTIONS /api/tasks - Desteklenen metodları öğren
GET Veri okuma
POST Yeni veri oluşturma
PUT Veri güncelleme (tam)
DELETE Veri silme
PATCH: Kısmi güncelleme
OPTIONS: Metod bilgisi
Dikkat: Farklı HTTP metodlarını test ederken, kritik verileri etkilememek için düşük öncelikli nesneleri hedefleyin.
İçerik Türü Manipülasyonu
API endpoint'leri belirli veri formatlarını bekler. Content-Type header'ını değiştirerek farklı davranışları tetikleyebilir ve güvenlik açıklarını keşfedebilirsiniz.
// JSON formatında istek
POST /api/users
Content-Type: application/json
{"name": "test", "email": "test@example.com"}
// XML formatına dönüştürme
POST /api/users
Content-Type: application/xml
<user><name>test</name><email>test@example.com</email></user>
// Form data formatı
POST /api/users
Content-Type: application/x-www-form-urlencoded
name=test&email=test@example.com
İçerik Türü Saldırı Vektörleri:
• JSON → XML dönüşümünde XXE injection
• XML → JSON dönüşümünde structure injection
• Unexpected content types ile error disclosure
• Content-Type spoofing ile validation bypass
Araç Önerisi: Burp Suite'in Content Type Converter eklentisini kullanarak JSON ve XML formatları arasında otomatik dönüşüm yapabilirsiniz.
Gizli Endpoint Keşfi
Bazı API endpoint'leri dokümantasyonda yer almaz veya frontend tarafından kullanılmaz. Bu gizli endpoint'leri bulmak, önemli güvenlik açıklarını ortaya çıkarabilir.
// Bilinen endpoint:
PUT /api/user/update
// Gizli endpoint'leri test etme:
PUT /api/user/delete
PUT /api/user/create
PUT /api/user/admin
DELETE /api/user/123
GET /api/user/all
POST /api/user/login
Fuzzing Wordlists:
- Common API paths: admin, test, debug, internal
- CRUD operations: create, read, update, delete, list
- Admin functions: manage, configure, settings
- Backup/legacy: v1, old, backup, legacy
Burp Intruder ile endpoint fuzzing yaparken, sektöre özel terimleri de dahil edin. Örneğin finans uygulaması için: transaction, account, balance, transfer.
Gizli Parameter Keşfi
API'ler dokümante edilmemiş parametreleri destekleyebilir. Bu gizli parametreler, uygulamanın davranışını değiştirmek için kullanılabilir.
// Normal API isteği
GET /api/users?page=1&limit=10
// Gizli parameter testleri
GET /api/users?page=1&limit=10&debug=true
GET /api/users?page=1&limit=10&admin=1
GET /api/users?page=1&limit=10&include_deleted=true
GET /api/users?page=1&limit=10&format=xml
Yaygın Gizli Parametreler:
• debug, test, admin, internal
• format, output, include, exclude
• callback, jsonp, pretty
• version, v, api_version
• token, key, secret, auth
Mass Assignment Açıkları
Mass assignment (auto-binding), framework'lerin request parametrelerini otomatik olarak internal objelere bağlaması durumunda ortaya çıkar. Bu durum gizli parametreler yaratabilir.
// Güncellenebilen alanlar
PATCH /api/users/
{
"username": "wiener",
"email": "wiener@example.com"
}
// GET isteği ile dönen tam obje
GET /api/users/123
{
"id": 123,
"username": "wiener",
"email": "wiener@example.com",
"isAdmin": false,
"balance": 1000,
"role": "user"
}
// Mass assignment saldırısı
PATCH /api/users/
{
"username": "wiener",
"email": "wiener@example.com",
"isAdmin": true,
"balance": 999999,
"role": "admin"
}
Mass Assignment Test Adımları:
1. GET endpoint'inden tam obje yapısını öğrenin
2. Update endpoint'ine ek alanlar ekleyin
3. Invalid değerlerle response farklılığını test edin
4. Privilege escalation için kritik alanları hedefleyin
Whitelist approach: Sadece izin verilen alanların güncellenebilir olması
Blacklist approach: Hassas alanların güncelleme dışı bırakılması
Server-Side Parameter Pollution
Server-side parameter pollution, web sitesinin kullanıcı girdisini internal API'ye yeterli encoding olmadan göndermesi durumunda ortaya çıkar. Bu durum parametre manipülasyonuna olanak tanır.
// Frontend isteği
GET /userSearch?name=peter&back=/home
// Backend'e giden internal istek
GET /users/search?name=peter&publicProfile=true
// Parameter pollution saldırısı
GET /userSearch?name=peter%26admin=true&back=/home
// Sonuç internal istek
GET /users/search?name=peter&admin=true&publicProfile=true
Test Karakterleri:
• & - Parameter separator
• # - Query truncation
• = - Key-value separator
• %26 - URL encoded &
• %23 - URL encoded #
Platform Davranışları:
- PHP: Son parametreyi alır
- ASP.NET: Parametreleri birleştirir
- Node.js: İlk parametreyi alır
- Python: Framework'e göre değişir
Query String Testleri
Query string'deki server-side parameter pollution testleri, URL parametrelerinde özel karakterler kullanarak internal API manipülasyonu yapmayı hedefler.
// Query truncation testi
GET /userSearch?name=peter%23foo&back=/home
// Internal: GET /users/search?name=peter#foo&publicProfile=true
// Parameter injection testi
GET /userSearch?name=peter%26email=admin@test.com&back=/home
// Internal: GET /users/search?name=peter&email=admin@test.com&publicProfile=true
// Parameter override testi
GET /userSearch?name=peter%26name=admin&back=/home
// Internal: GET /users/search?name=peter&name=admin&publicProfile=true
Test Sırası:
1. Truncation (#) - Query kesme testi
2. Invalid parameter (&foo=xyz) - Injection testi
3. Valid parameter (&email=test) - Geçerli parametre ekleme
4. Override (&name=admin) - Mevcut parametreyi ezme
REST Path Manipülasyonu
RESTful API'ler parameter isimlerini ve değerlerini URL path'inde saklar. Bu durumda path traversal teknikleri kullanarak API manipülasyonu yapılabilir.
// REST API yapısı
GET /api/users/123
// /api = root endpoint
// /users = resource
// /123 = parameter (user ID)
// Frontend isteği
GET /edit_profile.php?name=peter
// Internal: GET /api/private/users/peter
// Path traversal saldırısı
GET /edit_profile.php?name=peter%2f..%2fadmin
// Internal: GET /api/private/users/peter/../admin
// Normalized: GET /api/private/users/admin
Path Traversal Payload'ları:
• ../ - Directory traversal
• %2f..%2f - URL encoded traversal
• ....// - Double encoding bypass
• %252f - Double URL encoding
Yapısal Veri Format Testleri
Saldırganlar JSON, XML gibi yapısal veri formatlarında parameter manipülasyonu yaparak server-side işlemleri etkileyebilir. Bu testler, input validation açıklarını hedefler.
// Normal form data isteği
POST /myaccount
name=peter
// Internal JSON request
PATCH /users/7312/update
{"name":"peter"}
// JSON injection saldırısı
POST /myaccount
name=peter","access_level":"administrator
// Sonuç internal request
PATCH /users/7312/update
{"name":"peter","access_level":"administrator"}
// Client-side JSON injection
POST /myaccount
{"name": "peter\",\"access_level\":\"administrator"}
Yapısal Injection Vektörleri:
• JSON structure breaking
• XML entity injection
• YAML deserialization
• CSV injection
• Template injection
Yapısal format injection sadece request'lerde değil, response'larda da oluşabilir. User input güvenli şekilde veritabanında saklanıp, sonra JSON response'a encoding olmadan eklenebilir.
Korunma Yöntemleri
API güvenlik açıklarından korunmak için geliştirme aşamasından itibaren güvenlik odaklı yaklaşım benimsenmelidir. İşte en etkili korunma stratejileri:
Temel Güvenlik Prensipleri:
• Input Validation & Sanitization
• Output Encoding
• Parameterized Queries
• Least Privilege Principle
• Defense in Depth
// Güvenli parameter handling
function sanitizeInput(input) {
// Whitelist approach
const allowedChars = /^[a-zA-Z0-9_-]+$/;
if (!allowedChars.test(input)) {
throw new Error('Invalid input format');
}
return input;
}
// Güvenli API design
app.put('/api/users/:id', authenticate, authorize, (req, res) => {
const allowedFields = ['name', 'email'];
const updates = {};
allowedFields.forEach(field => {
if (req.body[field]) {
updates[field] = sanitize(req.body[field]);
}
});
updateUser(req.params.id, updates);
});
API Güvenlik Kontrolleri:
- Authentication: Güçlü kimlik doğrulama
- Authorization: Seviye bazlı yetkilendirme
- Rate Limiting: İstek sınırlandırma
- Input Validation: Veri doğrulama
- Error Handling: Güvenli hata yönetimi
- Logging: Güvenlik olaylarını kaydetme
✓ Dokümantasyon güvenliği - Hassas API'lerin gizlenmesi
✓ Güncel dokümantasyon - Test sürecini destekleme
✓ HTTP metod kısıtlaması - İzin verilen metodların belirlenmesi
✓ Content-Type validation - Beklenen format kontrolü
✓ Generic error messages - Bilgi sızıntısını önleme