Kimlik Doğrulama Zafiyetlerine Giriş: Modern Web Uygulamalarında Görülen Yaygın Hatalar
Portswigger : Kimlik Doğrulama Zafiyetlerine Giriş: Modern Web Uygulamalarında Görülen Yaygın Hatalar

Web uygulamalarının güvenliğinde kimlik doğrulama (authentication) kritik bir rol oynar. İnternete bağlı herkesin erişebileceği sistemlerde, kullanıcıların gerçekten iddia ettiği kişi olup olmadığını doğrulamak büyük önem taşır.
Kimlik Doğrulama Türleri
Kimlik doğrulama genellikle üç temel faktöre dayanır:
Bilgi (Knowledge): Parola veya güvenlik sorusu gibi kullanıcının bildiği bilgiler.
Sahiplik (Possession): Telefon, güvenlik anahtarı gibi fiziksel cihazlar.
Öz/İnharens (Inherence): Parmak izi, yüz tanıma veya davranışsal kalıplar gibi kullanıcıya özgü veriler.
Modern sistemler, bu faktörlerden bir veya birkaçını doğrulayarak kullanıcıyı tanımlar.
Authentication vs Authorization
Bu iki kavram sıkça karıştırılıyor:
Authentication: Kullanıcının kim olduğunu doğrular.
Authorization: Doğrulanan kullanıcının hangi işlemleri yapmaya yetkili olduğunu belirler.
Yani önce “Bu kişi gerçekten Carlos mu?” sorusu yanıtlanır, ardından “Carlos ne yapabilir?” aşamasına geçilir.
Kimlik Doğrulama Zafiyetleri Nasıl Ortaya Çıkar?
Kimlik doğrulama açıklarının büyük çoğunluğu iki ana nedene dayanır:
Zayıf korumalar: Brute-force (tahmin) saldırılarına karşı yetersiz önlemler.
Mantık hataları / kötü implementasyon: Saldırganın kimlik doğrulamayı tamamen atlamasına yol açan “broken authentication” durumları.
Kimlik doğrulama süreçlerinde yapılan küçük bir hata bile, sistemin tamamen ele geçirilmesine kadar gidebilir.
Zafiyetlerin Etkisi Neden Bu Kadar Büyük?
Bir saldırgan herhangi bir hesabı ele geçirdiğinde:
Hesabın tüm verilerine erişebilir.
Kullanıcının tüm yetkilerini kullanabilir.
Eğer hesap yüksek yetkiliyse (ör. admin), tüm uygulamayı ele geçirebilir.
Bu nedenle en düşük yetkili hesap bile kritik bir saldırı yüzeyi oluşturabilir.
Parola Tabanlı Sistemlerde Görülen Yaygın Açıklar
Parolaya dayalı giriş mekanizmalarında güvenlik, kullanıcı adının ve parolanın gizli kalmasına bağlıdır. Bu bilgiler ele geçirildiğinde veya tahmin edildiğinde sistem tamamen tehlikeye girer.
Brute-Force Saldırıları
Brute‑force, saldırganın otomatik araçlarla binlerce kullanıcı adı/parola denemesi yapmasıdır. Bu saldırılar:
Wordlist’lerle hızlandırılır,
Kamuya açık bilgilerle daha “akıllı” hâle getirilebilir.
Yeterli bruteforce koruması olmayan sistemler dakikalar içinde ele geçirilebilir.
Kullanıcı Adı Tahmini (Username Enumeration)
Saldırganlar, sitenin verdiği farklı tepkilerden kullanıcı adının geçerli olup olmadığını anlayabilir. Örneğin:
“Bu kullanıcı adı yok” vs. “Parola yanlış” gibi farklı hata mesajları
Kayıt formunda “Bu kullanıcı adı alınmış” uyarısı
Farklı HTTP durum kodları
Bu bilgiler saldırganın işini inanılmaz derecede kolaylaştırır.
Parola Tahmini
Sitelerin parola politikaları çoğu zaman teoride güçlüdür; fakat kullanıcı davranışları saldırganların işini kolaylaştırır.
Örnek tahmin edilebilir kalıplar:
“mypassword” → Mypassword1!, Myp4$$w0rd
Parola yenileme zorunluluğu: Mypassword1! → Mypassword1? → Mypassword2!
Saldırganlar bu insan davranışlarını hesaba katarak çok daha etkili brute-force saldırıları yapabilir.
Lab: Username enumeration via different responses
Bu laboratuvar, kullanıcı adı ve password brute force saldırılarına karşı savunmasızdır. Tahmin edilebilir bir kullanıcı adı ve parolaya sahip bir hesaba sahiptir; bunlar aşağıdaki kelime listelerinde bulunabilir:
labı başlatıyorum karşıma bir blog çıkıyor .
Login sayfasına ilk olarak manuel bir istek gönderdim.

/login endpoint’ine yaptığım POST isteğinde username=abc&password=abc gönderdiğimde uygulamanın “Invalid username” hatası döndürdüğünü gördüm.

Bu da bana, uygulamanın önce username doğrulaması yaptığını , username geçersizse password kontrolüne hiç geçmediğini gösterdi. Ardından, bu davranışı doğrulamak için Intruder üzerinden username wordlist’iyle brute-force başlattım.

Bu aşamada /login adresine gönderdiğim istekte username parametresini wordlist’ten çektim ( username=albuquerque gibi), password parametresini ise sabit bırakarak farklı response davranışlarını izledim ve böylece valid username’i tespit ettim yani invalid username tespit etmedi response da.
Valid username’i bulduktan sonra bu kez PortSwigger’ın verdiği password wordlist’ini kullanarak brute-force işlemine geçtim.

/login endpoint’ine bu sefer username’i sabit bırakarak ( username=albuquerque ), sadece password parametresini wordlist’ten gelecek şekilde Intruder ile istek gönderdim. Wordlist’teki çoğu denemede uygulama “Incorrect password” hatası döndürdü. Ancak password=thunder denemesinde hata mesajı gelmedi ve farklı bir response döndüğünü gördüm.

Bu da şifrenin doğru olduğunu gösteriyordu. Ardından albuquerque : thunder bilgileriyle giriş yaparak kullanıcı paneline ulaştım ve labı başarıyla tamamladım.








