Ders 31 - Cross-Site Scripting > Stage 2: Block Stored XSS using Input Validation | |||||
Cross-Site Scripting (XSS) ünitesinin üçüncü dersi ve 2.aşaması olan Stage 2: Block Stored XSS using Input Validation(Aşama 2: Girdi Doğrulama Kullanarak Depolanmış XSS'i Engelleme) dersinde ilk aşamada yapılan Stored XSS saldırısının kullandığı açığı bu aşamada kapatmaya çalışacağız.
Dersin HedefiFirmanın insan kaynakları otomasyonuna önceki derskteki gibi stored XSS atağı yapıldığında bu xss kodunun veritabanına kaydolmasını engellemek için otomasyonu kontrol eden kodları düzelt. Ardından Eric'in profiline önceki derste yaptığınız şekilde XSS kodu ekle ve onun amiri olan David'in saldırıdan etkilenmediğini teyit et.Dersin ÇözümüBu ders WebGoat'un geliştirici sürümünü kullananlar içindir. Çünkü ancak geliştirici sürümünü kullanan kullanıcılar kaynak kodda değişiklik yapabilmektedir. Biz bu yazı dizisinin başından beridir WebGoat'un standard versiyonunu kullandığımız için bu dersi tamamlayamayacağız. Fakat bu dersin verdiği bilgiyi teorik olarak özümseyebiliriz. O yüzden şimdi çözüme geçelim.Öncelikle XSS kodunun veritabanına dahil edildiği otomasyonun profil düzenleme sayfasındaki tüm metin kutularını girdi denetleme kodu ile denetleyelim. Böylece denetleme mekanizması XSS türü kod tespit ettiğinde hata fırlatsın ve akışı değiştirsin. Akışın değişmesiyle girilen veri veritabanına kaydolmamış olacaktır. Bunun için denetleme mekanizmasında kullanılacak olan yöntem regular expression diye tabir edilen, düzenli ifadeler diye çevirebileceğimiz seçenektir. Regular expression ile kabul edilecek karakter setini biçimlendirip oluşturduğumuz karakter setinin dışında bir karakter, metin kutularına girildiğinde hata fırlatılması sağlanacaktır. Veritabanına kayıt işlemi öncesine eklenecek kod şu şekildedir(NOT: Bu kod eğer geliştirici versiyonunu kullanıyorsanız UpdateProfile.java dosyasındaki parseEmployeeProfile() methodunun içine koyulmalıdır. UpdateProfile.java'yı dilerseniz şu adresten detaylı bir şekilde inceleyebilirsiniz): String regex = "[\\s\\w-,]*"; String stringToValidate = firstName + lastName + ssn + title + phone + address1 + address2 + startDate + ccn + disciplinaryActionDate + disciplinaryActionNotes + personalDescription; Pattern pattern = Pattern.compile(regex); validate(stringToValidate, pattern); Yukarıdaki regex değişkeni karakter seti uzayını ifade eden bir pattern, yani desen değeri almaktadır. Bu karakter seti uzayını oluşturan desen bileşenleri şu anlama gelmektedir: \s : Beyaz boşluk(space) \w : a'dan Z'ye, A'dan Z'ye tüm kelimeler(words) ve 0'dan 9'a tüm rakamlar - : tire , : virgül * : Önceki desene uygun 0 ya da sayısız tane karakter Yukarıdaki desen bileşenleri karakter uzayında barınabilecek karakterleri ifade etmektedir. Kodda yer alan stringToValidate değişkeni ise otomasyonun profil düzenleme sayfasındaki tüm metin kutularında yer alan verilerin birleşimini içinde tutmaktadır. pattern değişkeni ise az önce bahsettiğimiz kabul edilen karakter uzayına uygun desen nesnesinin referansını tutmaktadır. Bu nesne, kıyaslamada kullanılacaktır. validate() methodu sayesinde karakter uzayı ile yani desen ile metin kutularının verileri kıyaslanır. Kıyaslama sonucunda eğer metin kutularından birine desene uymayan bir karakter girilmişse validate() fonksiyonu hata fırlatacaktır ve veriler veritabanına kaydolmayacaktır. Kodu düzeltme işlemi sonrası Eric olarak otomasyona giriş yapın. Önceki dersten hatırlayabileceğiniz üzere otomasyon şifreleri kullanıcı adlarının küçük hali idi. Dolayısıyla Eric kullanıcısının şifresi eric 'tir. Önceki derste olduğu gibi otomasyondan Eric'in ViewProfile butonuna, ardından EditProfile butonuna tıklayın ve Street yazısının yanındaki metin kutusuna <script>alert("haha");</script> yazın. XSS kodunu girdikten sonra UpdateProfile butonuna tıklayın ve LogOut butonu ile otomasyondan Eric olarak çıkış yapın. Şu ana kadar yaptığınız şey Eric olarak kendi profil bilgilerinizden birine XSS kodu dahil etmeniz ve veritabanına öylece kaydedilmesini sağlamanızdır. Şimdi ise Eric'in amirinin kendi otomasyon hesabına girip Eric'in profil bilgilerini görüntülenmesi gerekmektedir. Amirin bu profil görüntülemesi sonucu eğer ekrana koddan dolayı bir popup mesajı gelirse Eric'in amirinin saldırıdan etkilendiği sonucuna varacağız. Şimdi Eric'in amiri olan David olarak otomasyona giriş yapın. Sıralı personellerden Eric'i seçip ViewProfile butonuna tıklayın. Daha önce Eric'in kendi profiline dahil ettiği XSS kodu amirinin ekranında önceki aşamanın aksine çalışmayacaktır. Çünkü sarı ile vurgulanan profil bilgisine bakacak olursanız XSS kodu veritabanına regular expression'lı denetleyici sayesinde kaydedilmemiştir. Dolayısıyla çalıştırılacak bir saldırı kodu ortada yoktur. Bu demektir ki eklenilen girdi denetleme mekanizması doğru bir şekilde çalışmaktadır. Bu şekilde dersi eğer geliştirici versiyonunu kullanıyor olsaydınız tamamlamış olacaktınız. Sonuç Girdiler bu dersteki gibi web programlama dili ile denetlenmelidir. Bu denetlemenin kısıtı size kalmıştır. Dilerseniz bu dersteki gibi kabul ettiğiniz karakter setlerini kabul eden, gerisini ise kabul etmeyen bir yaklaşımı uygulayabilirsiniz, dilerseniz sadece kendi oluşturduğunuz kara liste (zararlı kodlar listesi) ile kullanıcının girdiği verileri kıyaslayarak bir denetim kurabilirsiniz. Bu size kalmış bir şeydir. |
|||||
Bu yazı 14.09.2015 tarihinde, saat 20:08:17'de yazılmıştır. 03.01.2016 tarihi ve 22:43:16 saatinde ise güncellenmiştir. | |||||
|
|||||
Yorumlar |
|||||
|
|||||
|
|||||
Yorum Ekle | |||||