IDOR (Insecure Direct Object References) Zafiyeti Nedir ve Nasıl Önlenir?

Selamlar ben Nisa bugün sizlerle IDOR zafiyetini öğreneceğiz ve IDOR zafiyeti ile ilgili Lablar’lar çözeceğiz
IDOR Zafiyeti Nedir?
Insecure Direct Object Reference (IDOR), saldırganların bir web uygulamasında URL’ler veya parametrelerde kullanılan tanımlayıcıları (identifier) manipüle ederek nesnelere yetkisiz şekilde erişebilmesi veya bu nesneleri değiştirebilmesi sonucu ortaya çıkan bir güvenlik açığıdır. Bu zafiyet, uygulamanın belirli verilere erişim için gerekli yetki kontrollerini düzgün şekilde yapmamasından kaynaklanır.
Size IDOR ile ilgili birkaç örnek göstermek isterim.
URL Parametresi ile Başka Kullanıcının Profiline Erişim
Kullanıcı Girişi:
GET /profile?user_id=123
Saldırganın yaptığı değişiklik:
GET /profile?user_id=124
Sonuç:
Uygulama yetki kontrolü yapmadığı durumda saldırgan diğer kullanıcıların profillerini görüntüleyebilir.
API Üzerinden Yetkisiz Veri Okuma
API İsteği:
GET /api/orders/456
Saldırganın Yaptığı Değişiklik:
GET /api/orders/457
Sonuç:
Saldırgan başkasına ait verileri görebilir.
POST Body Üzerinden Profil Güncelleme (Gizli Alan Manipülasyonu)
Kullanıcı Profili:
Saldırganın Değişikliği:
Belge Erişimi (Dosya IDOR)
Kullanıcı İsteği:
GET /invoice/download?id=9001
Saldırganın İsteği:
GET /invoice/download?id=9002
Sonuç:
Kullanıcıya ait belgeler indirilebiliyor.
IDOR ile Şifre Sızıntısı
GET /api/user/details?user_id=321
Sonuç:
API cevabından passwrd_hash, reset_token vb. gibi cevap geliyorsa;
Hesap ele geçirilebilir.
IDOR Zafiyeti İle İlgili Lab Çözümleri
Lab-1
Kullandığım Lab:
Insecure direct object references
Lab çözerken Burp Suite Community uygulamasını kullanacağız.
- Burp Suite Community uygulamasından Proxy → HTTP History geliyoruz ve hedef üstünde yaptığımız tüm işlemlerin arşivleri burada gözüküyor.

Hedefimize bağlandıktan sonra ilk olarak Live Chat kısmına geliyoruz ve rastgele bir mesaj yazıp sisteme yolluyoruz sonrasında ise View transcript diyoruz.

Burp Suite’te /download-tarnscrip/2.txt request’e geliyor.
Sonrasında Send to Repeater diyoruz.

Ardından GET /download-transcript/2.txt kısmını /download-transcript/1.txt olarak değiştiriyor ve ardından Send diyoruz.

Response’ta my password is 7rxuiapohfsu85xcft89 diyor ve bu Carlos’un şifresi ardından. LAb’a geri dönüyor ve My Account’a geliyoruz.

Son olarak
Username: Carlos
Password: 7rxuiapohfsu85xcft89

Carlos’un hesabına giriş yapıyor ve başarıyla bitiriyoruz.
Lab2
Kullandığım Lab User ID controlled by request parameter

Burp Suit açık bir şekilde Lab’a geçiş yapıyoruz.

Bize açıklamada verilen wiener:peter ile giriş yapıyoruz.

Hesaba giriş yaptıktan sonra Burp Suit geçmişinden.

Get **/my-**account?id=wiener request’e geliyor.
Sonrasında Send to Repeater diyoruz.

GET /my-account?id=wiener kısmını
GET /my-account?id=carlos olarak değiştiriyoruz ve ardından Send diyoruz.

Çıktı olarak ise bize API Key veriyor onu kopyalıyoruz ve hedef sitedeki Submit solution kısmına yapıştıryoruz.

İkinci Lab’ımızı da başarıyla çözdük.
Lab-3
Kullandığım Lab Neighbour

İlk olarak Burp Suit ile hedef siteye keşfe çıkıyoruz.

Bizi bir Login sayfası karşılıyor. Alt kısımda ise Don’t have an account? Use the guest account (CTRL+U) ile bizi sayfa kaynak koduna yönlendiriyor.
![]()
Kaynak kodunda ise bize login olabilceğimiz guest:guest ile bilgisi veriliyor sıra login olup Burp Suit’ten arşive bakmak kalıyor.

Burp Suit’te ise GET /profil.php?user=guest request’e geliyor.
Ordan sonra Send to Repeater diyoruz.

Burda ise GET /profile.php?user=guest’i GET /profile.php?user=admin olarak değiştiriyoruz. Ardından Send diyoruz.

Bize flag çıktısı veriliyor artık sadece flag kontrolü kalıyor flag’i kopyalıyoruz ve Try Hack Me ’de flag kısmına yapıştırıyoruz.

Üçüncü Lab’mızı da başarıyla bitiriyoruz.
Lab-4
Kullandığım Lab Corridor

Bu Lab diğer lablardan biraz farklı bu labda Burp Suit kullanmayacağız. Şimdi ise hedef sisteme gidiyoruz.

Bizi böyle bir sayfa karşılıyor ve burda CTRL+U yaparak sayfa kaynak kodlarına bakıcaz.

Kaynak kodlarında ise bizi bazı hashler karşılıyor. Bu hashleri CrackStation kullanarak hangi Encoding olduğuna bakacağız.

Burada type kısmına bakacağız bize md5 olarak vermiş. Sonraki adımımız ise CyberChef’den 0 md5 çevrildiğinde çıkan hash’i kullanacağız.
Burada sıfır kullanmamızın nedeni ise web/app tarafında diziler (array’ler) 1’den değil 0’dan başlar.

Burada cfcd208495d565ef66e7dff9f98764da çıktısını alıyoruz. Bu çıktıyı kopyalıyoruz.
![]()
Sitenin URL’sine **http://10.48.179.189/cfcd208495d565ef66e7dff9f98764da** yapıştıryoruz bu URL bize flag’i verecektir.

Başarılı bir şekilde flag’e ulaştık sadece bunu kontrol etmek kaldı ve hemen lab’ın sayfasına gidip deniyoruz.

Ve Lab başarılı bir şekilde sonuçlandı.
IDOR Zafiyeti Nasıl Önlenir
IDOR zafiyetini önlemek için, kullanıcıların erişmeye çalıştığı her nesne için yetki kontrolü uygulanmalıdır. Çoğu web framework’ü bu kontrolleri kolaylaştıran mekanizmalar sunar. Ayrıca karmaşık tanımlayıcılar, ek bir güvenlik katmanı (defense-in-depth) olarak kullanılabilir; ancak unutulmamalıdır ki, asıl kritik olan erişim kontrolüdür.
Tanımlayıcıları URL’de veya POST gövdelerinde açık bir şekilde göstermemeye çalışın. Tanımlayıcılar yerine session (oturum) kullanarak o an kimliği doğrulanmamış kullanıcıyı belirleyin.
Artan sayısal tanımlayıcalar yerine (enumerable) daha karışık ve rastgele tanımlayıcalar kullanılmalı. Ek olarak UUID veya benzeri uzun ve rastgele değerler birincil anahtar olarak tercih edilebilir. Tanımlayıcıları şifrelemekten kaçınılmalıdır, çünkü bunu güvenli bir şekilde yapmak oldukça zordur.
.
IDOR(Insecure Direct Object References) Özet Bilgi
Insecure Direct Object Reference (IDOR), bir web uygulamasının nesnelere erişim sırasında yeterli yetkilendirme (authorization) kontrollerini uygulamaması sonucunda ortaya çıkan kritik bir erişim kontrolü zafiyetidir. Bu zafiyet, genellikle URL parametreleri, form verileri veya API isteklerinde kullanılan doğrudan nesne tanımlayıcılarının (örneğin kullanıcı ID’si, dosya ID’si, sipariş numarası) manipüle edilebilmesiyle istismar edilir.
IDOR zafiyetine sahip uygulamalarda, kimliği doğrulanmış bir kullanıcı, kendisine ait olmayan kaynaklara erişebilir, bu kaynakları görüntüleyebilir, değiştirebilir veya silebilir. Bu durum; kişisel verilerin ifşası, yetkisiz işlem gerçekleştirme ve hesap ele geçirme gibi ciddi güvenlik ihlallerine yol açabilir.
Bu zafiyetin önlenmesi için, nesneye erişim yapılan her istekte sunucu taraflı yetkilendirme kontrollerinin zorunlu olarak uygulanması gerekmektedir. Uygulama, yalnızca kullanıcının kimliğini doğrulamakla yetinmemeli, aynı zamanda ilgili kaynağa erişim yetkisine sahip olup olmadığını da doğrulamalıdır. Ek olarak, tahmin edilebilir ardışık tanımlayıcılar yerine rastgeleleştirilmiş veya UUID tabanlı tanımlayıcıların kullanılması, savunmayı güçlendiren tamamlayıcı bir önlem olarak değerlendirilebilir. Ancak bu yaklaşım, hiçbir zaman erişim kontrolünün yerine geçmemelidir.
Kaynakça
Yazımda faydalandığım kaynaklar.
