Insecure Direct Object Reference (IDOR)

IDOR (Insecure Direct Object Reference) Nedir?

IDOR, "Insecure Direct Object Reference" kısaltmasıyla bilinen bir güvenlik zafiyetidir. Bu tür bir zafiyet, uygulamaların kullanıcıların doğrudan erişmemesi gereken nesnelere erişmesine olanak tanır. IDOR, genellikle erişim kontrolünün eksik veya hatalı uygulanmasından kaynaklanır ve bu durum, saldırganların yetkilendirilmedikleri verileri görmelerine veya değiştirmelerine izin verir.

Örneğin, bir web sitesinde kullanıcıların kendi adres bilgilerini ekleyip silebilmeleri mümkündür. Ancak, eğer bir kullanıcı başka bir kullanıcının adres bilgilerini görebiliyor veya silebiliyorsa, burada bir IDOR zafiyeti söz konusu demektir.

IDOR Zafiyetinin Etkileri

IDOR zafiyetleri, uygulamalardaki kimlik doğrulama ve yetkilendirme kontrollerinin eksikliği nedeniyle ortaya çıkar. Bu tür zafiyetler, kötü niyetli kişilerin başka kullanıcıların hassas bilgilerine erişmesine, bu bilgileri değiştirmesine veya silmesine neden olabilir. Ayrıca, yetkisiz bir kullanıcının kendi yetkilerini yükselterek admin seviyesine erişmesi de mümkündür.

Bir IDOR zafiyeti, saldırganların başka kullanıcıların verilerine yetkisiz erişimini, veri sızdırma ve ifşa etme, veri değiştirme veya silme gibi zararlı eylemler gerçekleştirmesini sağlar. Bu durum, kullanıcı verilerinin gizliliğini ve güvenliğini ciddi şekilde tehlikeye atar.

IDOR Zafiyetini Önlemek İçin Alınacak Önlemler

IDOR zafiyetlerinin önlenmesi için uygulama geliştiricileri, kimlik doğrulama ve yetkilendirme kontrollerini titizlikle uygulamalıdır. Kullanıcıların yalnızca kendi verilerine ve yetkilendirildikleri verilere erişmelerine izin verilmelidir. Bu, kullanıcı verilerinin gizliliğini ve güvenliğini korumak için kritik bir adımdır.

Örneğin, bir web uygulamasında her kullanıcı kendi profil bilgilerine erişebilir. Ancak, uygulama bu erişimi doğru bir şekilde kontrol etmezse, başka kullanıcıların profillerine erişebilirler. Bu durumda, IDOR zafiyeti söz konusu olur.

IDOR Zafiyetinin Ortaya Çıkabileceği Yerler

IDOR zafiyetleri, web uygulamalarının çeşitli bölümlerinde bulunabilir. Özellikle kullanıcı hesap bilgileri, dosya paylaşım siteleri, yorum alanları ve POST, PUT ve GET metotları ile yapılan isteklerde bu tür zafiyetler aranmalıdır. Örneğin, bir kullanıcı kendi hesabını güncellerken başka bir kullanıcının bilgilerine erişebiliyorsa, bu bir IDOR zafiyetidir.

IDOR zafiyetlerini tespit etmek ve önlemek için, geliştiriciler kullanıcıların yalnızca yetkilendirildikleri nesnelere erişmesine izin veren sağlam kimlik doğrulama ve yetkilendirme mekanizmaları uygulamalıdır. Bu şekilde, kullanıcı verilerinin güvenliği sağlanabilir ve olası güvenlik açıkları minimize edilebilir.

Vulnlab Soru Çözümleri

Bu kısımda IDOR'un nerelerde ve nasıl karşımıza çıkabileceğini göstermek için Vulnlab üzerinden bu kısımla ilgili soruları çözeceğim. Soru çözümlerinde direkt cevaba giden yolu göstereceğim için eğer kendinizi denemek istiyorsanız yazıyı okumaya devam etmeden önce Vulnlab'i Docker ile kolayca kurarak soruları çözebilirsiniz.

Invocies

Soruyu incelediğimizde bizi "yeni bir faturan var!" bildirimi ile karşılayan bir butonla karşılaşıyoruz. Ne kadar iç açıcı bir bildirim değil mi? :D

Faturamı görmek istediğimde bana "Sean Johnson" kişisine ait faturayı gösteriyor. Bu bizim faturamız olmalı fakat URL kısmını yakından incelediğimizde bu sayfanın "invoice_id" isimli bir değerle bize gösterildiğini görüyoruz. Bu kısımda IDOR zafiyeti olması muhtemel.

"invoice_id" değerini değiştirdiğimizde başka birinin faturasını karşımıza çıkarıyor. Burada IDOR zafiyeti olduğunu kanıtlamış olduk.

Ticket Sales

Bu soruda bize bilet fiyatını normalden düşük bir fiyata almamız isteniyor. İlk deneme olarak bilet sayısını eksi bir değer girdim fakat bana bunu yapamayacağımı söyleyen bir pop-up çıktı. Eğer bu mümkün olsaydı, olası bilet fiyatı bakiyeme eklenebilirdi.

Soruyu yakından incelemek için Burp Suite ile araya girdim ve bilet fiyatının request içerisinde belirlendiğini gördüm. Normalde bu gibi değerler genellikle statik olarak bir veritabanında tutulur. Ancak bazı durumlarda -örneğin bir indirim kampanyası gibi- bu değer kullanıcı arayüzünden yükselir veya düşer ve kullanıcı tarafından yapılan request ile sunucuya aktarılır. Bu gibi durumlarda veri değiştirilebilir ve gönderilebilir. (Yapmayın)

Bilet değerini sıfır olarak değiştirdim ve 1 adet bileti bakiyemde 1 kuruş harcamadan aldım. Bu sorudaki IDOR zafiyetini böylece bulmuş olduk.

Changing Password

Soruya baktığımızda bize yeni bir şifre tanımlayarak şifremizi değiştirmemiz isteniyor.

Hemen Burp Suite ile araya girip inceliyorum ve yazdığım şifrenin "user_id" değeri ile birlikte gittiğini görüyorum.

"user_id" değerini başka bir sayıyla değiştirdiğimde farklı bir kullanıcının şifresini değiştirebildiğimi fark ettim. Normalde kullanıcıya ait bu değer requestin içerisinde değil, session veya çerez (cookie) içerisinde şifreli bir şekilde tutulmalıydı. Fakat yazılımcı bunu request yoluyla kullandığı için burada bir IDOR zafiyeti çıktı.

Money Transfer Transactions

Burada başka bir kullanıcıya onun ID değerini girerek para transfer etme işlemi simüle edilmiş. Tekrardan input yerine negatif değer girerek kullanıcıdan para almaya çalıştım fakat bunun yasaklı olduğunu gördüm.

Burpsuite ile araya girdiğimde gönderen ve alan kullanıcıların id değerlerinin request içerisinde gönderildiğini farkettim. Bu değerleri tam tersi yaparak forward ettim.

Görüldüğü üzere id değeri 3 olan kullanıcının 20 dolarını cepledim. Kısa günün kazancı değil tabii ki. Bunu da yapmayın :D

Shopping Cart

Burada bize bir alışveriş sepeti ve bakiye verildiğini görüyoruz. Ürünler arasında flag isimli bir ürün var ama bakiyemizi aşıyor. Öncelikle bir adet "Thief Cat" alarak ne olduğuna bakalım. Bu soruyu çözerken "Yavuzlar Expert" yazan ürünü alabilecekken bunu yapmayacağım. Ayrıca soru içerisindeki çözüm olabilecek farklı yolları göstermeden direkt cevaba gideceğim. Lütfen cevaba bakmadan önce bir kez soruyu çözmeye çalışın.

Sepete ürün ekledikten sonra satın almaya çalıştığımızda bizden bir kod istiyor. Message Box butonu ile mesajları görüntüleyelim.

Burada gelen kodu görüntüledik.

Her satın alma eylemi yeni bir kod oluşturuyor. Eğer soruyu çözmeye çok yakın olduğunuzu düşünüyor ve kod kısmında bu fonksiyonu fark edemediyseniz lütfen bir kez daha deneyin.

Kodu girdiğimizde başarılı bir şekilde ürünü satın aldık ve bakiyemizden ürünün miktarı düştü.

Şimdi tekrardan sepete ürün ekleyelim ve satın alma işlemi için butona tıklayalım. Burada dikkat etmemiz gereken şey, butonu yeni sekmede açmak ya da butona tıklamadan önce sepet kısmını görüntüleyen başka bir sekme daha açmak. Çünkü mesaj girme sayfası her yenilendiğinde yeni kod oluşturacak ve kod oluşturma fonksiyonu sepet miktarı bakiyeyi aşmadığı sürece oluşuyor. Birazdan bakiyeyi aşan bir durum yaratacağımız için kod kısmını bypass edemeyebiliriz.

Burada kodu girmeden once "Finish Flag" urununu sepete ekliyoruz.

"Finish Flag" ürünü sepette iken oluşturulan kodu giriyoruz.

Görüldüğü üzere satın alma işlemi başarı ile tamamlandı ve bakiye eksiye düştü. Bu sorudaki IDOR zafiyetini böylelikle bulmuş olduk. Buradaki zafiyet tamamen backend kısmındaki sepet kontrol fonksiyonlarının yanlış konumlandırılması yüzünden meydana geliyor. Arka planda sepet kontrol mekanizması sadece satın alma kodu oluştururken çalışıyor ve satın alma işlemi kodu girilince yapılabiliyor. Burada satın alma işlemi sırasında da buna benzer bir kod çalışması ve satın alımı durdurması lazımdı fakat yok. Tüh :d

Last updated