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

Emre Erkıran
ParamTech
Published in
5 min readApr 18, 2023

IDOR (Insecure Direct Object Reference)

Herhangi bir web sitesi ziyaret edildiğinde ilgili site içeriğinde bulunan uygulamalara nesneler üzerinden erişim sağlanır. Bu nesneler; veritabanı, dosyalar ve dizinlere erişim gibi önemli durumları tanımlamak amacıyla kullanılır. Saldırganlar bir başka kullanıcının sahip olduğu nesne değerleri üzerinde yetkisiz erişim elde ederek, bu nesneyi taklit veya manipüle edebilmektedir. Böylelikle hedeflediği kişinin uygulama üzerindeki kimlik bilgilerini elde etmiş olurlar.

IDOR Zafiyeti Etkileri

  • Hesap devralma, çok kritik bilgilere erişim.
  • Başka bir kullanıcının verilerini değiştirme/silme, özel/kamuya açık önemli verilere erişim. (Bilet, fatura, ödeme bilgileri vb.)
  • Özel verilere erişim/ silme/ değiştirme (Adres, isim vb.)
  • Önemsiz verilere erişim.

Lab Ortamının Hazırlanması

BWAPP

bWAPP itsecgames tarafından geliştirilen ,open source ve ücretsiz bir web güvenlik zafiyetleri penetrasyon testi laboratuvarıdır. İlgili uygulamayı ayağı kaldırmanın en kolay yolu Docker Image’ını indirip Container olarak olacaktır.

https://hub.docker.com/r/raesene/bwapp/

Exploit

Attack 1 (Change Secret)

Bwapp uygulamasına “bee:bug” kullanıcısı giriş yapıp “Change Secret” kısmına gittiğimizde aşağıdaki gibi bir sayfa bizi karşılayacaktır.

Yukarıda bahsettiğimiz IDOR zafiyetinin varlığını burada bulmak için uygulamanın business logic’i anlamamız gerekmektedir. Onun için ilgili New Secret alanı doldurulup aşağıdaki gibi istek atılıp cevap alınmıştır.

İlgili istek içerisinde parametrelere yakından baktığımızda bizden secret isimli bir parameter aldığını görmüştük fakat burada onun dışında login ve action isimli 2 tane daha parametrenin olduğunu tespit edilip bunlar uygulamaya gönderilmektedir.

Senaryo

Eğer uygulama bizden aldığı secret ve login değerleri üzerinden bir işlem yapıyorsa biz ilgili istek içerisindeki login bilgisini farklı bir kullanıcı olarak verip password’unu bilmediğimiz bir kullanıcının secret bilgisini değiştirip account take over yapabiliriz. Bunun için uygulama üzerinde ek olarak aşağıdaki gibi bir kullanıcı oluşturulmuştur.

Aşağıda uygulamanın kullandığı DB’ye bağlanıp mevcut kullanıcılar ve onları secret’ların ekran görüntüsü alınmıştır. Bu ekran görüntüsünde bee kullanıcının kullandığı secret ile emre kullanıcısın kullandığı secret değerinin farklı olduğu görülmektedir.

Son durumda yukarıda anlattığım senaryo üzerinde hareket edecek olursam ilgili isteğin secret değeri değilde login değerini emre yapıp istek attığımda DB tarafında emre kullanıcısının secret değerinin değişip değişmediğini kontrol edilebilir böylece saldırının başarılı olup olmadığı anlaşılabilir.

İlgili istek son durumda aşağıdaki gibi gönderildi.

Atılan isteğin uygulama tarafında çalışıp çalışmadığını doğrulamak için tekrar uygulama DB’sine baktığımızda kurduğumuz senaryonun çalıştığını görmekteyiz.

Attack 2 (Order Tickets)

Bwapp uygulamasına “bee:bug” kullanıcısı giriş yapıp “Order Tickets” kısmına gittiğimizde aşağıdaki gibi bir sayfa bizleri karşılayacaktır.

Yukarıda bahsettiğimiz IDOR zafiyetinin varlığını burada bulmak için uygulamanın business logic’I anlamamız geremektedir. Akışı devam ettirbilmek için uygulamanın bizden isteği gibi bilet sayısı girip istek attığımızda aşağıdaki gibi bir sonuç almaktayız.

Yukarıda yapılan işlemin istek ve cevabı aşağıdaki gibidir. Burada dikkatimi çeken kısım UI tarafında bir biletin 15 EURO olduğunu söylerken bu değeri uygulama kendi yazılım katmanında değilde bu değeri kullanıcıdan almaktadır.

Senaryo

Uygulama UI’da kullanıcıdan sadece almasını isteği bilet miktarını girmesini beklemişti. İlgili istek içerisine baktığımızda uygulama kullanıcıdan sadece bilet miktarı aynı zamanda ücretinide aldığı gözlemlenmiştir. İlgili istek içerisindeki bilet miktarı değeri default olan (15 Euro) daha aşağı girildiğinde bilen alınması IDOR saldırısına sebebiyet verir.

Yukarıdaki senaryo baz alınıp aşağıdaki gibi bir istek gönderildiğinde 150 Euro değerindeki 10 bileti hiç para vermeden alabildiğimiz tespit edilmiştir.

10 bilet alındığı olması gereken cevap aşağıdaki gibi iken

miktar değiştirildiğinde 10 bilet için herhangi bir para ödenmeden alındığı tespit edilmiştir.

Çözüm Önerisi

IDOR güvenlik açıklığını kapatmak veya etkisini azaltmak için; parametrelerin doğrulanması düzgün bir şekilde uygulanmalı, tüm hassas nesneler için katı erişim kontrolü uygulanmalıdır. Başvurulan tüm nesnelerin doğrulanması yapılmalı ve web uygulama altyapısı geliştirilirken kullanılan framework’ler güncel ve tanınmış olmalıdır. Böylelikle ortaya çıkan IDOR zafiyetlerinin düzeltilmesi durumunda hızlı aksiyon almak mümkün olacaktır. IDOR zafiyetinin önüne geçilmesinde en etken rol oynayan yöntem budur.

Nesnelere erişim sırasında ise veri alışverişi hash ile şifreli şekilde yapılmalıdır. Bu hash veya kullanıcı token(jeton) bilgileri çözülmesi güçlü şifreleme algoritmaları ile desteklenmelidir. Ayrıca geliştiriciler, anahtarlar veya dosya adları gibi özel nesne referanslarını görüntülemekten kaçınmalıdır. Belirteçler, yalnızca kullanıcıyla eşleştirilecek ve herkese açık olmayacak şekilde oluşturulmalıdır.

Kaynaklar:

--

--