URL'deki Tek Rakamı Değiştirdik, Başkasının Faturası Açıldı — IDOR Senaryosu
Bazı açıklar gürültülüdür; ekrana hata basar, alarm çaldırır. IDOR ise sessizdir. Hiçbir şey kırılmaz, hiçbir uyarı çıkmaz — sadece görmemeniz gereken veriyi görürsünüz. İşte anonimleştirilmiş bir senaryo.
Sahne: Sıradan Bir Fatura Sayfası
Giriş yaptıktan sonra kendi faturamızı görüntüledik. Adres çubuğunda şu vardı:
https://uygulama.ornek/fatura?id=1043
Akla ilk gelen soru güvenlikçinin refleksidir: "Ya 1044 yazarsam?"
https://uygulama.ornek/fatura?id=1044
Sayfa açıldı. Karşımızda bize ait olmayan bir müşterinin faturası vardı: adı, adresi, aldığı hizmet, tutarı. Sistem "bu kaydın sahibi sen misin?" diye hiç sormadı.
Adı: IDOR (Insecure Direct Object Reference)
Uygulama, kaydı doğrudan ID ile çekiyor ama o kaydın isteği yapan kullanıcıya ait olup olmadığını kontrol etmiyor. Kimlik doğrulama (giriş) var; yetkilendirme (bu veriye erişebilir misin?) yok. OWASP bunu "Broken Access Control" başlığı altında yıllardır listenin 1 numarasında tutuyor.
Ölçek: Otomatik Toplama
Bir saldırgan tek tek denemez; ID'leri sırayla gezen basit bir betik yazar (yalnızca yetkili testte gösterim amaçlı):
for id in $(seq 1000 2000); do curl -s -b "oturum=$COOKIE" "https://uygulama.ornek/fatura?id=$id" -o "fatura_$id.html" done
Birkaç dakika içinde binlerce faturaya ait kişisel veri diske iner. "Sızma" gibi görünmez — sunucuya göre bu, geçerli oturumla yapılan geçerli isteklerdir. Tehlikesi de buradadır.
Etki
- Toplu kişisel veri ihlali (KVKK bildirim yükümlülüğü + ceza)
- Fatura, sipariş, sağlık kaydı, mesaj — hangi veriyse
- Çoğu zaman aylarca fark edilmez, çünkü hata logu üretmez
Çözüm: Her İstekte "Sahiplik" Sorusu
Kural nettir: kaydı ID ile değil, ID + kullanıcı kimliğiyle çekin.
# YANLIŞ — sadece ID ile, sahip kontrolü yok
fatura = db.get("SELECT * FROM faturalar WHERE id = %s", id)
# DOĞRU — kayıt yalnızca isteği yapan kullanıcınınsa döner
fatura = db.get(
"SELECT * FROM faturalar WHERE id = %s AND musteri_id = %s",
(id, oturum.kullanici_id))
if not fatura:
return hata(403) # senin değilse: erişim yokTahmin edilmesi zor kimlikler (ardışık 1,2,3 yerine UUID) yardımcı olur ama tek başına yeterli değildir — asıl koruma sunucu tarafındaki yetki kontrolüdür.
Etik ve yasal not: Bir sistemde "acaba başkasının verisi geliyor mu?" diye ID değiştirmek bile — yetkiniz yoksa — izinsiz erişimdir ve suçtur. Bu testler yalnızca sözleşmeli, yetkili kapsamda yapılır.
Sonuç
IDOR, en çok "çalışıyor, o zaman güvenli" yanılgısından doğar. Uygulamanız ID'lerle veri çekiyorsa, her erişim noktasında "bu kayıt gerçekten bu kullanıcının mı?" sorusu kod içinde sorulmalıdır. REDCELL testleri bu sessiz açığı sistematik olarak avlar.
Sisteminizin güvenliğinden emin misiniz?
Ücretsiz Ön Değerlendirme →