OWASP TOP 10 | Vertical Privilege Escalation
Vertical Privilege Escalation Nedir?
Vertical Privilege Escalation —bir saldırgan, güvenliğini ihlal edilen mevcut bir hesapla daha fazla yönetici izni veya erişim elde etmeye çalışır. Örneğin, bir saldırgan herhangi bir ağdaki normal kullanıcı hesabını ele geçirir ve yönetici izinleri veya root yani kök erişimi elde etmeye çalışır.
Penetrasyon Testi Nedir?
Penetrasyon testi veya etik bilgisayar korsanlığı olarak da adlandırılan sızma testi, olası bir saldırganın istismar edebileceği güvenlik açıklarını bulmak için bir bilgisayar sistemini, ağı veya web uygulamasını test etme uygulamasıdır.
Hedef sitemiz CloudCity ekibine ait olan cloudcity.com domain adresidir.
Daha sonra, bize verilen kullanıcı bilgileri ile sisteme giriş yapalım.
Giriş Başarılı.
Başarılı bir şekilde oturum açtık, ürün hakkında bir fikir edinmek ve test senaryolarını daha fazla belirlemek ve güvenlik testi senaryoları geliştirmek için CloudCity'nin kullanıcı arayüzü menülerine ve işlevlerine göz atıp değerlendirmekle başlayalım.
hesap ayrıcalıkları, yalnızca CloudCity'nin izleme panosuna erişimle sınırlıdır.
Ayarlar sayfası, kullanıcı ayrıntılarını, parola kimlik bilgilerini güncellemek ve iki faktörlü kimlik doğrulamayı yapılandırmak için eylemler sunar.
bu yapılandırma seçeneklerini gözden geçirdikten sonra, kullanıcının mevcut CloudCity hesap parolasını değiştirmesine olanak tanıyan Parolanızı Değiştir özelliğini test edelim.
CloudCity parolamızı bize verilen kimlik bilgileriyle güncelleyelim.
Save Changes
CloudCity'nin Parolayı Değiştir işlevinin arka uç sunucusuyla nasıl iletişim kurduğunu anlamamız için bir uygulama web proxy'si kullanarak tarayıcı tarafından oluşturulan HTTP isteğine müdahale edelim.
Web proxy'si nedir?
HTTP proxy olarak da bilinen bir web proxy, web geliştiricilerinin makineleri ile uzak bir web uygulaması arasındaki ham HTTP ve HTTPS trafiğini görüntülemesine ve değiştirmesine olanak tanıyan bir yazılım hata ayıklama aracıdır. Bu, HTTP/HTTPS istek ve yanıt verilerini, istek değişkenlerini ve parametrelerini, başlıkları vb. içerebilir.
Değişiklikleri Kaydet düğmesini tıklattıktan sonra, tarayıcımız ve değerine sahip parametreler olarak geçen ve geçen bir POST istek oluşturur. oldPassword newPasswordpassword123password567
account Ayrıca parametre değeri olarak ayarlanmış ek bir parametre iletilir 3 .
Uygulamayı test etmeye devam etmeden önce, bir kullanıcının parolasını güncellemek için HTTP POST isteğimizin CloudCity uygulaması tarafından nasıl işlendiğini daha fazla analiz edelim.
changeAccountPassword
kullanıcı tarafından başlatılan parola güncellemelerini işler.
session.getAttribute
İlk önce oturum açmış olan kullanıcıyı oturumdan alır.
getParameter
Ardından, o kullanıcı POST için newPassword, oldPassword ve account parametre değerlerini sorgular.
updatePasswordFor(user);
Son olarak, kullanıcı nesnesi yeni kimlik bilgileriyle güncellenir.
POST, talebini ele geçirip analiz ettikten sonra, parametre değerini aşağıdaki hesap numarasıyla güncellemeye çalışır : account
account 1
Not
Parametreyi değiştirirken KOD penceresine dikkat edin. account
3 parametre değerini silip doğru değeri giriyoruz. 1
Şimdi ise cevabı analiz edelim.
JSON yanıt gövdesi, parolanın başarıyla değiştirildiğini onaylayan bir mesaj içerir.
Ancak, güncellenen kullanıcı hesabı bize ait olan hesap gibi görünmüyor. Bunun yerine yanıt, Alice'in hesabının güncellendiğini gösteriyor.
Önceki POST adımdaki yanıt, bizim - to account parametresini değiştirmemizin, muhtemelen başka bir kullanıcının ( ) hesap kimlik bilgilerinin güncellemiş olabileceğini gösterir. 31 alice@livemail.com
Doğrulamak için hesabımızdan çıkış yapalım ve Alice'in kullanıcı adını ve şifresini kullanarak CloudCity'ye erişmeye çalışalım. password567
Hesap parametresinde yaptığımız değişikliğin Alice'in CloudCity hesabı kimlik bilgilerini gerçekten etkileyip etkilemediğini kontrol etmek için parametreyi değiştirerek istekte belirlediğimiz yeni parolayı kullanarak Alice olarak oturum açalım : POST account
Vee BUM
Parola Güncelleme isteğindeki account parametre değerini değiştirerek, Alice'in hesap kimlik bilgilerini başarıyla güncellemeyi ve CloudCity hesabına erişim elde etmeyi başardık. POST
Not
Kullanılan güvenlik açığı, kötü niyetli bir kullanıcının ayrıcalıklı bir hesaba erişim kazandığı Türkçe deyimi ile Dikey Ayrıcalık Yükseltme saldırısı olarak bilinir. Ancak saldırı, Hesap Yönetimi işlevleriyle sınırlı değildir ve güvenilir olmayan parametre değerlerinin yeterli kimlik doğrulama ve yetkilendirme kontrolleri yapılmadan uygulamaya geçirildiği herhangi bir uygulama özelliğinde potansiyel olarak meydana gelebilir.
Vertical Privilege Escalation güvenlik açığının temel nedenini daha iyi anlamak için changePassword(), belirli bir hesabın parolasını güncellemek için kullanılan yönteme bir göz atalım.
account
Hesap kimliğinin, bu hesabın gerçekten oturumda etkin olan kullanıcıya ait olup olmadığı daha fazla kontrol edilmeden istekten alındığını unutmayın.
updatePasswordFor
Bu nedenle, kullanıcı kimlik bilgileri güncellendiğinde hiçbir doğrulama gerçekleşmedi ve basit bir POST isteği aracılığıyla User, sınırlarının dışında olması gereken bir nesneye doğrudan erişim kazandık.
Peki Bu Saldırıları Nasıl Azaltacağız?
Ayrıcalık Yükseltme güvenlik açıklarını etkin bir şekilde azaltmak için geliştiricilerin, kullanıcının istenen bir kaynağa veya işleve erişmek için gerekli ayrıcalıklara sahip olduğundan emin olmak için erişim denetimi kontrolleri uygulaması gerekir.
Tüm ürün düzeyinde uygun bir erişim kontrol politikası önemlidir. Tüm kullanıcılar ve gruplar için uygun erişim kontrol izinlerini tanımlamalıdır. Daha sonra bunların mimarlara, tasarımcılara, geliştiricilere ve destek ekiplerine açık bir şekilde açıklanması gerekir, böylece erişim denetimi uygulama genelinde tutarlı bir şekilde tasarlanır, uygulanır ve kullanılır.
İlk adım olarak, Privilege Escalation saldırılarını önlemek için savunmasız kod örneğimize basit bir erişim kontrolü kontrolünü nasıl ekleyebileceğimizi görelim.
if (user.getAccountId().equals(account)) {
Yöntemin değiştirilmiş uygulaması , istekten alınan parametre değerinin , kullanıcının etkin oturumundan çıkarılan kullanıcı nesnesinin hesap kimliğiyle eşleştiğinden changePassword() emin olmak için ek bir denetim ekler. account POST