Ders 22 - Authentication Flaws > Basic Authentication | #Include <Karabük>
Authentication Flaws(Kimlik Doğrulama Kusurları) ünitesinin üçüncü dersi olan Basic Authentication(Temel Kimlik Onaylama) dersinde http header'ında yer alan authorization'den(yetkilendirmeden) ve jsessionid'dan(çerezlerden) bahsedilecektir(Http header'ın ne olduğuyla alakalı yazı için bkz. Ders 3 - General > Http Split).
Bu derste hedefiniz temel kimlik doğrulamayı anlamak ve ders ekranında verilen soruları cevaplamaktır.
Basic Authentication(Temel kimlik doğrulama) sunucu tarafındaki kaynakları korumak için kullanılır. Web sunucusu talep edilen kaynak için yanıt olarak 401 nolu kimlik doğrulama talebi gönderir. İstemci tarafındaki tarayıcı ise bunun üzerine kendinden olan pencereleri(dialog box'ları) kullanarak kullanıcı adı ve şifre için kullanıcıyı harekete geçirtecektir. Tarayıcı girilen kullanıcı adı ve şifreyi base64 algoritması ile kodlayacaktır. Sonra web sunucusu hesap bilgilerini denetleyecektir ve eğer hesap bilgileri doğru ise talep edilen kaynağı istemciye döndürecektir. Bu tarz kimlik doğrulama mekanizması ile korunan her sayfa için tekrardan hesap bilgilerini girmeye lüzum olmadan girilmiş hesap bilgileri sunucuya otomatik olarak gönderilir.
Bu dersin sonunda oturum yönetimi için JSESSIONID çerezinin nasıl kullanıldığını anlamanız ve ayrıca kimlik doğrulama için temel kimlik doğrulama header'ının nasıl kullanıldığını anlamanız beklenmektedir. Bu iki header Dersin Çözümü başlığında değerleri manipule edilerek anlatılmaya çalışılacaktır. Ama önce tanımlarına değinmekte fayda var.
Bu dersin başlığı da olan Authentication kavramı bir kişinin sistemin geçerli bir kullanıcısı olup olmadığının sunucu tarafında sorgulanması hakkındadır. Eğer sorgulamaya geçerli hesap bilgileri girilmişse o kişi authenticate edilmiş olur. Bunun üzerine sunucu JSESSIONID denilen çerezi yollar(Java web uygulamalarında çerez ismi olarak JSESSIONID kullanılmaktadır). Authorization kavramı ise bir kişinin belirli bir içeriğe erişimine izin verme ya da o içeriğe erişim yetkisi verme hakkındadır. Yani bir kimse oturum açmış bir kullanıcı dahi olsa erişimi sınırlandırılmış bir içeriğe erişemiyorsa o kişi o içerik için authorizate edilmemiş demektir. Şimdi JSESSIONID ve Authorization header'larını sunucu nasıl yorumluyoru uygulama üzerinde deneyimleyelim.
Yukarıdaki resimde gördüğünüz üzere sorular şu şekildedir:
What is the name of the authentication header:
(Kimlik doğrulama header'ının adı nedir?)
What is the decoded value of the authentication header:
(Kimlik doğrulama header'ının kodlanmadan arınmış değeri nedir?)
Bu sorulara cevap verebilmek için http header'a odaklanmamız gerekmektedir. Dolayısıyla bizim bir talep yapmamız ve bu talebi WebScarab aracılığıyla yakalamamız gerekmektedir. Böylece gönderdiğimiz http header'ı gözlemleyebiliriz. Bunun için WebScarab'ı talepleri yakalabileceği şekilde aktifleştirin. Aktifleştirme işlemi WebScarab arayüzünde yer alan Intercept sekmesindeki Intercept Request [✔] 'e tick koyarak gerçekleşir.
WebScarab'ı talebi yakalayabiliyor hale getirdikten sonra ders ekranındaki Submit butonuna tıklayın. Böylece bir talebi başlatmış olursunuz. Bu işlem sonrası ekranınızda bir webscarab popup penceresi gelmiş olması gerekir.
Bu pencerede yukarıdaki resimden de görebileceğiniz üzere sarı ile vurgulanan kolon http header bileşenlerinin sıralandığı bölümdür. Temel kimlik doğrulama başlığı bu header'lar içerisinden Authorization şeklinde adlandırılandır. Değeri de Z3Vlc3Q6Z3Vlc3Q= şeklindedir. Bu değer kodlanmış değerdir. Daha önce de bahsedildiği gibi tarayıcı kimlik doğrulama bilgilerini base64 algoritması ile kodlamaktadır. Bu kodlanmış veriyi decode edebilmek için, yani orijinal haline dönüştürebilmek için WebScarab'ın penceresine gelin. Ardından Tools menüsündeki Transcoder sekmesine tıklayın. Bu açılan ekrana base64 algoritmasına göre kodlanmış Z3Vlc3Q6Z3Vlc3Q= verisini kopyalayın. Ardından pencerenin aşağısındaki düğmelerden Base64 Decode düğmesine basarak kimlik doğrulama verisini orjinal haline dönüştürün.
Görüldüğü üzere kodlanmış veri aslında kullanıcı adı ve şifrenin birleşiminden oluşturulmuş bir veriymiş. (guest:guest | Kullanıcı adı: guest, Şifre: guest) Dersin ilk aşamasını tamamlayabilmek için header'ın adı olarak ilk metin kutusuna Authorization, bu header'ın değeri olarak da ikinci metin kutusuna guest:guest ifadesini giriniz ve Submit butonuna basınız. Ekrana gelen popup penceresi için de Accept Changes butonuna basınız. Böylece ilk aşama bitmiş bulunmaktadır.
Dersi tamamlayabilmek için bir dokunuşa daha ihtiyaç vardır. Bu dokunuş Açıklamalar başlığında bahsedilen çerez ve kimlik doğrulama bilgilerinin pratikteki kullanımını içerecektir. Yukarıdaki resimde yer alan kırmızı yazıda bizden kullanıcı adı olarak basic ve şifre olarak da basic olacak şekilde WebGoat'a tekrardan kimlik doğrulama yaptırtmayı denememiz isteniyor. basic kullanıcı adı ve şifresi ile WebGoat'a erişmek için JSESSIONID'yi ve Authorization header'ını bozmanız gerekir. Bozmanız gerekir derken aslında amaç bu iki header'ı anlamlandırabilmek içindir. Bu bozma işlemini WebScarab ile yapabilirsiniz. Talepleri yakalayacak şekilde WebScarab yine aktif kalsın ve ders ekranındaki Hint adlı sekmeye bir kez tıklayın. Böylece bir webscrab popup'ı ekrana gelecektir. Bu ekrandaki cookie ve Authorization başlıklarının değerlerinden birer karakter silin ve Accept Changes butonuna tıklayın. Böylece WebGoat kimlik doğrulaması yapmaya ihtiyaç duyacaktır. Bu yüzden ekrana kullanıcı adı ve şifre girilmesini isteyen tarayıcı penceresi(dialog box) gelecektir. Kullanıcı adı ve şifre olarak dersin bizden istediği gibi basic kelimesini giriniz.
OK tuşuna bastıktan sonra ekrana yeni bir WebScarab popup'ı daha gelecektir. Bu popup'a dikkat edelim.
Authorization kısmı dikkat ederseniz değişti. Fakat cookie(çerez), yani JSESSIONID değişmedi. Yani daha basic olarak oturum açamadık. Neden olduğuna birazdan değineceğim. Fakat önce bazı şeylerden bahsedilecektir.
Oturum çerezi olmadığında, eğer zaten kimlik onaylamasından geçilmişse Webgoat sizi onaylar. Eğer kimlik onaylamasından geçilmemişse kullanıcı adı ve şifre girilmesini isteyen tarayıcı pencereleri görüntülenir. basic kullanıcı adı ve basic şifre girişi gerçek manada onaylandıktan sonra WebGoat'un başlangıç sayfasına yönlendirilirsiniz ve bu oturum için size yeni bir JSESSIONID sunucu tarafından verilir. Fakat hatırlayın: JSESSIONID değişmemişti. Sıra geldi bunu izah etmeye. JSESSIONID ilk ziyaret sürecinde oluşturulan ve kalıcı olmayan bir çerezdir. Tarayıcıdan WebGoat'a giden her talepte bu eski JSESSIONID değeri kullanılır. Önceki talepte yaptığımız JESSIONID'yi bozma işlemi tarayıcı belleğindeki depolanmış çerez değerini değiştirmeyecektir. Sonuçta çerez dosyasını manipule etmedik. Talebimizle gönderdiğimiz http header'ı manipule ettik. İşte bu yüzden kimlik doğrulama sonrası Hint butonuna tıklayarak yapılan talepte olduğu gibi ve bundan sonra olacak taleplerdeki gibi eski JSESSIONID her defasında gönderilecektir. Bu eski ama geçerli JSESSIONID yüzünden WebGoat kendi içindeki fonksiyonları kullanarak( getSession().getUser() ) sunucu taraflı oturum nesnesi üzerinden kimlik onaylamasından geçmiş kullanıcıyı bulup çıkaracaktır. WebGoat'a basic olarak kimlik onaylamasından geçtiğinize inandırmak için JSESSIONID'yi aşağıdaki resimde olduğu gibi novalidsession ile doldurmanız gerekmektedir.
Bu şekilde yapınca Accept Changes diyerek olması gerektiği gibi WebGoat'ın başlangıç sayfasına yönlendirileceksiniz. JSESSIONID artık değiştirilmiştir. Bu yüzden sunucu verdiği bu yeni oturuma göre derslere sıfırdan sizi başlatacaktır. Bu zamana dek yaptığınız dersleri tamamlamamış görüceksiniz. Çünkü artık oturumunuz değişti. Bu oturum açıkken başlangıç sayfasından derslerin listeleneceyi arayüze geçin. Ardından yapmakta olduğunuz ders olan "Basic Authentication"a tıklayın. Böylece dersi başarıyla tamamlamış olursunuz. Eski oturumunuza dönebilmek için WebGoat'u terminalden sonlandırın ve tekrar başlatın. Böylece kaldığınız yerden devam edebilirsiniz. Webscarab'ın popup'ları karşınıza gelmesin istiyorsanız koyduğunuz tick'i kaldırmanız yeterlidir.
Bu derste iki kavram üzerinde durulmuştur. Bunlardan birincisi JSESSIONID, yani çerez, ikincisi ise authorization, yani yetki. Bu iki kavram(header) sırayla manipule edilerek ne anlama geldikleri uygulama üzerinden deneyimlenmeye çalışılmıştır. Toparlayacak olursak bir kimse bir web uygulamasının login ekranına hesap bilgilerini girmekle authenticate edilir. Bunun üzerine sunucu kullanıcıya ilgili çerezi ve authorization'ı gönderir. Kullanıcı böylece çerez ile sistem üzerinde online kalacağı gibi authorization'ın izin verdiği ölçüde de içeriklere ulaşabilir olacaktır.
Bu yazı 01.09.2015 tarihinde, saat 18:37:14'de yazılmıştır. 27.10.2015 tarihi ve 06:28:46 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK	 Görüntülenme Sayısı : 1476