IDOR (Insecure Direct Object Reference) , bir uygulamanın, kullanıcının doğrudan erişmemesi gereken nesnelere (dosyalar, veritabanı kayıtları, hesaplar) referans vermesine olanak tanıyan bir güvenlik zafiyetidir. Saldırgan, doğrudan nesne referanslarını manipüle ederek yetkisiz verilere erişebilir.
IDOR Nasıl Çalışır?
IDOR, uygulamanın kullanıcı girdisine güvenerek doğrudan veritabanı sorgusu yapmasıyla oluşur. Kullanıcı kimlik doğrulaması yapılmış olsa bile, yetkilendirme (authorization) kontrolü yapılmaz.
Örnek Senaryo:
Bir e-ticaret sitesinde sipariş detayları:
text
Kullanıcı id'yi 12346 olarak değiştirirse, başka bir kullanıcının siparişini görebilir. Uygulama, "kullanıcı giriş yapmış mı?" kontrol eder, ancak "bu sipariş bu kullanıcıya mı ait?" kontrolünü yapmaz.
IDOR Türleri:
1. URL Parametreleri ile IDOR
En yaygın tür. Parametreler doğrudan URL'de bulunur.
Örnek:
text
2. JSON/XML Gövdesinde IDOR
POST/PUT isteklerinin gövdesinde bulunur.
Örnek:
json
POST /api/profil/guncelle
{
"kullanici_id": 123,
"email": "[email protected]"
}
3. Çerez veya Header'da IDOR
Session cookie veya özel header'lar ile yapılır.
Örnek:
text
Cookie: user_id=123
X-User-ID: 456
4. Blob/File IDOR
Dosya veya medya erişiminde kullanılır.
Örnek:
text
IDOR Nasıl Bulunur? (Test Teknikleri - Savunma Odaklı)
A. Manuel Keşif Teknikleri:
Parametre Analizi:
Tüm sayfalardaki id=, user=, doc=, file=, order=, account= gibi parametreleri listeleyin.
Sayısal ID'leri artırarak/azaltarak test edin:
id=1 → id=2 → id=3
id=1000 → id=999
UUID veya hash kullanılıyorsa, pattern'ini analiz edin.
GUID/UUID Testi:
Rastgele UUID oluşturmayı deneyin.
Zaman bazlı UUID ise, zaman damgasını tahmin etmeye çalışın.
V4 UUID ise, brute force imkansız olabilir (ancak zafiyet varsa yine de test edin).
Dosya Yolu Manipülasyonu:
text
/uploads/avatar_1.jpg → /uploads/avatar_2.jpg
/uploads/avatar_1.jpg → /uploads/../private/secret.pdf
/download?file=invoice_123.pdf → /download?file=invoice_124.pdf
API Endpoint'lerini Test Etme:
Tüm API uç noktalarını listeleyin.
/api/users/me → /api/users/123 (diğer kullanıcılara erişim)
/api/orders/456 → /api/orders/457
/api/admin/settings (rol kontrolü eksik olabilir)
Batch/Toplu İşlem Testi:
Birden fazla ID içeren istekleri test edin:
json
POST /api/users/batch
{
"user_ids": [123, 124, 125]
}
Oturum Yenileme Testi:
Farklı kullanıcı oturumları arasında geçiş yapın ve aynı ID'leri test edin.
Çıkış yapıp tekrar giriş yapın, aynı ID'ler hala erişilebilir mi?
B. Otomatik Test Araçları:
Burp Suite: Intruder ile ID'leri otomatik artırarak istek gönderin.
Autorize: Burp eklentisi - Yetkilendirme kontrolü yapar.
Authz: Burp eklentisi - IDOR tespiti için.
Nuclei: IDOR template'leri.
ZAP: Fuzzing ve yetkilendirme testleri.
C. Gelişmiş Test Teknikleri:
JWT ID Manipülasyonu:
JWT token'ındaki user_id veya role alanlarını değiştirin.
Token'ı yeniden imzalamayı deneyin (zayıf secret varsa).
Referans ID'ler:
İlişkili tablolardaki ID'leri test edin:
Sipariş ID'si → Kullanıcı ID'si
Ürün ID'si → Satıcı ID'si
Yorum ID'si → Makale ID'si
Zaman Tabanlı ID Tahmini:
ID'ler sıralı ise, zaman damgasına göre tahmin edin.
Örnek: 20231225001 → 20231225002
IDOR'un Etkileri (Güvenlik Riskleri):
Veri Sızıntısı: Başka kullanıcıların özel bilgilerine erişim
Hesap Ele Geçirme: Şifre sıfırlama veya profil güncelleme
Finansal Kayıp: Başka kullanıcıların siparişlerini değiştirme veya iptal etme
Yetki Yükseltme: Admin paneline erişim
Dosya Sızıntısı: Hassas belgelere erişim
Koruma Teknikleri (Güvenli Geliştirme):
1. Yetkilendirme Kontrolü (Authorization)
Her istekte, kullanıcının erişmek istediği kaynağa yetkisi olup olmadığını kontrol edin.
Doğru Yaklaşım:
python
def get_order(order_id, current_user):
order = Order.objects.get(id=order_id)
# Yetkilendirme kontrolü
if order.user_id != current_user.id:
raise PermissionDenied("Bu siparişi görüntüleme yetkiniz yok")
return order
2. Rastgele ve Tahmin Edilemez ID'ler Kullanın
UUID v4: 128-bit rastgele
Kriptografik Hash: SHA-256 ile üretilen benzersiz ID'ler
Rastgele Sayı Üreteci: secrets modülü (Python) veya crypto (Node.js)
python
import uuid
import secrets
# Önerilen: UUIDv4
order_id = uuid.uuid4()
# Alternatif: Rastgele token
token = secrets.token_hex(32)
3. Indirect Object Reference (Dolaylı Referans)
Gerçek ID'leri gizleyin, map'leme kullanın.
python
# Doğrudan referans (güvensiz)
/download?file=secret_123.pdf
# Dolaylı referans (güvenli)
/download?ref=ABC123XYZ
# Sunucu: ABC123XYZ → secret_123.pdf (harici map)
4. Role ve Permissiyon Kontrolü
Kullanıcının rolüne göre erişim seviyesini belirleyin.
python
def check_permission(user, resource):
if user.role == 'admin':
return True
elif user.role == 'user' and resource.owner_id == user.id:
return True
else:
return False
5. Log ve İzleme
Tüm veri erişimlerini loglayın
Anormal erişim pattern'lerini tespit edin
Çok sayıda farklı ID'ye erişim denemelerini izleyin
6. API Rate Limiting
API çağrılarını sınırlayın
Brute force ID denemelerini engelleyin
IP bazlı veya kullanıcı bazlı limitler uygulayın
7. Güvenli Kodlama Standartları
ORM (Object-Relational Mapping) kullanın (SQL injection'dan korur)
Dinamik sorgu oluşturmaktan kaçının
Input validation her zaman yapın
8. Penetrasyon Testi
Yılda en az 2 kez yetkili ekip tarafından IDOR testi
Otomatik araçlarla sürekli tarama
IDOR Kontrol Listesi (Güvenlik Ekipleri İçin):
Veri Katmanı:
Tüm sorgularda WHERE user_id = current_user.id kontrolü var mı?
ORM kullanılıyor mu?
Dinamik sorgu oluşturuluyor mu?
API Katmanı:
Tüm endpoint'lerde yetkilendirme var mı?
/api/users/me vs /api/users/{id} doğru kullanılıyor mu?
Batch işlemlerde yetkilendirme kontrolü var mı?
Frontend Katmanı:
ID'ler frontend'de mi yoksa backend'de mi oluşturuluyor?
Frontend'deki ID'ler değiştirilebilir mi?
Veritabanı Tasarımı:
UUID veya rastgele ID'ler mi kullanılıyor?
Otomatik artan ID'ler mi kullanılıyor? (risk)
Log ve İzleme:
Tüm erişimler loglanıyor mu?
Anormal erişim pattern'leri izleniyor mu?
IDOR Nasıl Çalışır?
IDOR, uygulamanın kullanıcı girdisine güvenerek doğrudan veritabanı sorgusu yapmasıyla oluşur. Kullanıcı kimlik doğrulaması yapılmış olsa bile, yetkilendirme (authorization) kontrolü yapılmaz.
Örnek Senaryo:
Bir e-ticaret sitesinde sipariş detayları:
text
Kullanıcı id'yi 12346 olarak değiştirirse, başka bir kullanıcının siparişini görebilir. Uygulama, "kullanıcı giriş yapmış mı?" kontrol eder, ancak "bu sipariş bu kullanıcıya mı ait?" kontrolünü yapmaz.
IDOR Türleri:
1. URL Parametreleri ile IDOR
En yaygın tür. Parametreler doğrudan URL'de bulunur.
Örnek:
text
2. JSON/XML Gövdesinde IDOR
POST/PUT isteklerinin gövdesinde bulunur.
Örnek:
json
POST /api/profil/guncelle
{
"kullanici_id": 123,
"email": "[email protected]"
}
3. Çerez veya Header'da IDOR
Session cookie veya özel header'lar ile yapılır.
Örnek:
text
Cookie: user_id=123
X-User-ID: 456
4. Blob/File IDOR
Dosya veya medya erişiminde kullanılır.
Örnek:
text
IDOR Nasıl Bulunur? (Test Teknikleri - Savunma Odaklı)
A. Manuel Keşif Teknikleri:
Parametre Analizi:
Tüm sayfalardaki id=, user=, doc=, file=, order=, account= gibi parametreleri listeleyin.
Sayısal ID'leri artırarak/azaltarak test edin:
id=1 → id=2 → id=3
id=1000 → id=999
UUID veya hash kullanılıyorsa, pattern'ini analiz edin.
GUID/UUID Testi:
Rastgele UUID oluşturmayı deneyin.
Zaman bazlı UUID ise, zaman damgasını tahmin etmeye çalışın.
V4 UUID ise, brute force imkansız olabilir (ancak zafiyet varsa yine de test edin).
Dosya Yolu Manipülasyonu:
text
/uploads/avatar_1.jpg → /uploads/avatar_2.jpg
/uploads/avatar_1.jpg → /uploads/../private/secret.pdf
/download?file=invoice_123.pdf → /download?file=invoice_124.pdf
API Endpoint'lerini Test Etme:
Tüm API uç noktalarını listeleyin.
/api/users/me → /api/users/123 (diğer kullanıcılara erişim)
/api/orders/456 → /api/orders/457
/api/admin/settings (rol kontrolü eksik olabilir)
Batch/Toplu İşlem Testi:
Birden fazla ID içeren istekleri test edin:
json
POST /api/users/batch
{
"user_ids": [123, 124, 125]
}
Oturum Yenileme Testi:
Farklı kullanıcı oturumları arasında geçiş yapın ve aynı ID'leri test edin.
Çıkış yapıp tekrar giriş yapın, aynı ID'ler hala erişilebilir mi?
B. Otomatik Test Araçları:
Burp Suite: Intruder ile ID'leri otomatik artırarak istek gönderin.
Autorize: Burp eklentisi - Yetkilendirme kontrolü yapar.
Authz: Burp eklentisi - IDOR tespiti için.
Nuclei: IDOR template'leri.
ZAP: Fuzzing ve yetkilendirme testleri.
C. Gelişmiş Test Teknikleri:
JWT ID Manipülasyonu:
JWT token'ındaki user_id veya role alanlarını değiştirin.
Token'ı yeniden imzalamayı deneyin (zayıf secret varsa).
Referans ID'ler:
İlişkili tablolardaki ID'leri test edin:
Sipariş ID'si → Kullanıcı ID'si
Ürün ID'si → Satıcı ID'si
Yorum ID'si → Makale ID'si
Zaman Tabanlı ID Tahmini:
ID'ler sıralı ise, zaman damgasına göre tahmin edin.
Örnek: 20231225001 → 20231225002
IDOR'un Etkileri (Güvenlik Riskleri):
Veri Sızıntısı: Başka kullanıcıların özel bilgilerine erişim
Hesap Ele Geçirme: Şifre sıfırlama veya profil güncelleme
Finansal Kayıp: Başka kullanıcıların siparişlerini değiştirme veya iptal etme
Yetki Yükseltme: Admin paneline erişim
Dosya Sızıntısı: Hassas belgelere erişim
Koruma Teknikleri (Güvenli Geliştirme):
1. Yetkilendirme Kontrolü (Authorization)
Her istekte, kullanıcının erişmek istediği kaynağa yetkisi olup olmadığını kontrol edin.
Doğru Yaklaşım:
python
def get_order(order_id, current_user):
order = Order.objects.get(id=order_id)
# Yetkilendirme kontrolü
if order.user_id != current_user.id:
raise PermissionDenied("Bu siparişi görüntüleme yetkiniz yok")
return order
2. Rastgele ve Tahmin Edilemez ID'ler Kullanın
UUID v4: 128-bit rastgele
Kriptografik Hash: SHA-256 ile üretilen benzersiz ID'ler
Rastgele Sayı Üreteci: secrets modülü (Python) veya crypto (Node.js)
python
import uuid
import secrets
# Önerilen: UUIDv4
order_id = uuid.uuid4()
# Alternatif: Rastgele token
token = secrets.token_hex(32)
3. Indirect Object Reference (Dolaylı Referans)
Gerçek ID'leri gizleyin, map'leme kullanın.
python
# Doğrudan referans (güvensiz)
/download?file=secret_123.pdf
# Dolaylı referans (güvenli)
/download?ref=ABC123XYZ
# Sunucu: ABC123XYZ → secret_123.pdf (harici map)
4. Role ve Permissiyon Kontrolü
Kullanıcının rolüne göre erişim seviyesini belirleyin.
python
def check_permission(user, resource):
if user.role == 'admin':
return True
elif user.role == 'user' and resource.owner_id == user.id:
return True
else:
return False
5. Log ve İzleme
Tüm veri erişimlerini loglayın
Anormal erişim pattern'lerini tespit edin
Çok sayıda farklı ID'ye erişim denemelerini izleyin
6. API Rate Limiting
API çağrılarını sınırlayın
Brute force ID denemelerini engelleyin
IP bazlı veya kullanıcı bazlı limitler uygulayın
7. Güvenli Kodlama Standartları
ORM (Object-Relational Mapping) kullanın (SQL injection'dan korur)
Dinamik sorgu oluşturmaktan kaçının
Input validation her zaman yapın
8. Penetrasyon Testi
Yılda en az 2 kez yetkili ekip tarafından IDOR testi
Otomatik araçlarla sürekli tarama
IDOR Kontrol Listesi (Güvenlik Ekipleri İçin):
Veri Katmanı:
Tüm sorgularda WHERE user_id = current_user.id kontrolü var mı?
ORM kullanılıyor mu?
Dinamik sorgu oluşturuluyor mu?
API Katmanı:
Tüm endpoint'lerde yetkilendirme var mı?
/api/users/me vs /api/users/{id} doğru kullanılıyor mu?
Batch işlemlerde yetkilendirme kontrolü var mı?
Frontend Katmanı:
ID'ler frontend'de mi yoksa backend'de mi oluşturuluyor?
Frontend'deki ID'ler değiştirilebilir mi?
Veritabanı Tasarımı:
UUID veya rastgele ID'ler mi kullanılıyor?
Otomatik artan ID'ler mi kullanılıyor? (risk)
Log ve İzleme:
Tüm erişimler loglanıyor mu?
Anormal erişim pattern'leri izleniyor mu?
🔒 Bu içeriği görmek için giriş yapın