DVWA – XSS

index - DVWA - XSS

XSS (Cross Site Scripting) Nedir ?

[+] Kısaca bahsedecek olursak OWASP’ın top 10 listesinden bir türlü düşmek bilmeyen bir web güvelik açığıdır. Yazılımcıların kullanıcıdan aldığı veriyi dikkatli bir şekilde filtrelememesinden kaynaklanan bir zafiyettir. Web sitelerindeki yorum kısımları veya arama yapabileceğiniz arama kutularında oldukça sık rastlanır.

[+] Çok eskilerden beri var olan bir güvenlik zafiyetidir buna rağmen yazılımcıların halen gözünden kaçmatadır ki OWASP’ın top 10 listesinden düşmüyor, bunun yanında etkili bir şekilde sömürülmesi durumunda çok ağır hasarlar verebilir.

[+] Genelde web sitesine zararlı bir kod yada komut dosyası enjekte ederek gerçekleştirilir. Bu zararlı kodlar istemci tarafından çalıştırılabilir,yorumlanabilir dillerle yazılır (Javascript, HTML, VBScript, Flash vb.) daha çok HTML ve Javascript kullanılarak sömürülür.

[+] Örneğin, kullanıcıdan alınacak olan isim bilgisi yerine saldırgan tarafından HTML,JavaScript,CSS gibi tarayıcı tarafından yorumlanan kodların yazılması durumunda tarayıcının zararlı yazılımı çalıştırması senaryosu.

[+] Cookie bilgilerinin çalınması çok sık rastlanan bir saldırı vektörüdür, bildiğiniz üzere Cookie bilgileri web sitesi tarafından kullanıcının kim olduğunu tanıması için verilen bilgilerdir. Cookieler otomatik olarak sisteme giriş için size resmen açık çek verir herhangi bir kullanıcının cookie bilgileri çalınması durumunda sisteme farklı bir kullanıcı adına giriş yapılabilir. Bunun yanında Oturum çalma,farklı sahte web sitelerine yönlendirme yada reverse shell alma gibi saldırılar yapılabilir bu kısım tamamen saldırganın bilgi düzeyine, tecrübesine ve hayalgücüne kalmıştır.

[-] XSS Türleri

1 – XSS Reflected >> Temel XSS zafiyetidir, kullanıcıdan alınan herhangi bir bilginin gerekli filtrelemelerden geçmeden direkt ekrana yazılması bu zafiyetin doğmasına sebep olur. Input kısmına tarayıcı tarafından yorumlanan HTML,CSS,JavaScript gibi dillerle yazılmış zararlı yazılımların enjekte edilmesi bu açığın sömürümesi anlamına gelmektedir. Yazılan kodlar direkt sayfanın kaynak kodlarına kalıcı olarak yazılır.

2 – XSS Stored >> Bu XSS türünde ise kullanıcıdan alınan veri bir yerde tutulur/saklanır burası bir veri tabanı olabilir yada bir dosyaya yazılması durumu olabilir. Eğer saldırgan XSS zafiyeti tespit edipte bir zararlı yazılım enjekte ederse zararlı yazılım veri tabanında tutulur. Verinin, veri tabanından çağırılıp işlenmesi durumunda zararlı yazılım çalıştırılır ve XSS Stored(Kalıcı) zafiyeti gerçekleşmiş olur. Sayfaya giriş yapan her kullanıcı saldırıya mağruz kalır.

3 – DOM Based XSS >> Basitçe tanımlamak gerekirse “DOM Tabanlı XSS, bir HTML parçasında değil DOM (Document Object Model)’da meydana gelen XSS zafiyetidir” denilebilir. Stored ve Reflected XSS saldırılarında, saldırı sonrası dönen sayfada XSS atağını görmek mümkünken; DOM tabanlı XSS saldırılarında HTML kaynağı ve dönen yanıt, tamamen aynı olacaktır. Başka bir deyişle, XSS atağı dönen sayfada bulunamaz ve sadece runtime sırasında ya da sayfanın DOM’u incelenirken gözlemlenebilir (DOM Based kısmı alıntıdır > netsparker.com).

DVWA – XSS (Cross Site Scripting)

[X] DVWA Tüyo – DVWA uygulamasında sağ alt kısımda bulunan “view source” butonuna basarak kaynak kodlarını görebilirsiniz nasıl bir güvenlik önlemi alındığını görüntüleyebilirsiniz. Hemen yanındaki “help” butonuna basarak güvenlik zafiyeti ile ilgili bilgi alabilirsiniz ve çözemediğiniz seviyelerde size yardımcı olacak ipucular verebilir.

XSS (Cross Site Scripting) Reflected

Yukarıda basit bir form görüyorsunuz bu sayfayı tarayıcımızda açtığımızda bizden input alan bir kutucuk ve submit butonu karşılayacak. Inputu girdikten sonra submit ettiğimizde xss_reflected.php dosyası çalıştırılacak ve inputu GET metodu ile gönderecek. xss_reflected.php dosyasının içeriği aşağıdaki gibi belirli güvenlik sınırlamaları var bunları aşmaya çalışacağız.

#LOW – Burada herhangi bir filtreleme işlemi yapılmamış <script>alert(1);</script> kodunu input olarak girdiğimizde enjekte ettiğimiz kodun çalıştığını göreceksiniz. Burada yanlızca input kısmından değil URL dende sömürülebilir çünkü GET metodu kullanılıyor :). Aynı zamanda webisitenin kaynak koduna baktığınızda enjekte ettiğimiz kodu görebilirsiniz.

#MEDIUM – Bu seviyede bir filtreleme söz konusu (if yapısı ile) inputta <script> yakalanırsa <script> yerine boş bir karakter(“”) koyması gerektiği belirtilmiş. <script>alert(1);</script> girmeyi denersek etiketi açtığımız kısmı boş bir karakter ile değiştirecek alert(1);</script> gibi bir sonuç alacağız etiketimizi açamadığımız için kod çalışmayacaktır. <sc<script>ript>alert(1);</script> şeklinde filtreyi atlatabiliriz.(bir başka kullanım <Script>alert(1);</script>)

#HIGH – Burada <script></script> etiketleri tamamen filtrelenmiş fakat HTML etikerleri filtrelenmemiş <script>alert(1);</script> denediğimizde olumsuz sonuç alacağız fakat <h1>XSS</h1> gibi HTML etiketleri denersek HTML etiketlerinin filtrelenmemiş olduğunu farkedebiliriz. <img src=kaynak_yok_hata_verecek onerror=”alert(1);” /> HTML deki <img/> etiketini bu şekilde kullanarak hata alabiliriz.

NOT : <script>alert(1);</script> Gibi tek düze ezber kodlarla kalmayıp farklı şeylerde yapılabilir. Tamamen bilginize,tecrübenize ve hayal gücünüze kalmış bir şeydir. Deli gibi zararlı yazılım yazan insanlar var dışarıda :).

OWASP XSS Filtre Kaçırma Hile Sayfasını Buraya Bırakıyorum 🙂

https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

ÖRN.

  • <script>document.write(document.cookie)</script> –> Cookie bilgilerini çeker.
  • <script>window.open(“https://www.erdoganyoksul.com/”);</script> –> Yeni sekmede parametre olarak gönderilen sayfayı açan fonksiyon.
  • <iframe src=”https://www.erdoganyoksul.com/” /> –> Başka bir web sayfası görüntüler (width=”100%” height=”100%” boyutlandırma yapılabilir)
  • <script>alert(document.cookie);</script> –> Cookie bilgilerini alert fonksiyonu ile iletir.
  • <img src=”resim_kaynak.png” width=”100px” height=”200px” /> –> Resim görüntüler.
  • <a href=”https://www.google.com/”> Devamını Oku ….</a> –> Devamını Oku …. şeklinde bir link oluşturur fakat www.google.com’a yönlendirir.

Vesayre vesayre temel mantık şu, tarayıcı tarafından yorumlanabilen,çalıştırılabilen kodlar yazabilirsiniz tabi eğer filtre varsa önce filtreyi atlamalısınız.

Farklı Bir Örnek Daha

xss_search.php adında bir php dosyası oluşturdum içerisine bir takım kodlar yazdım, dosyanın içeriği aşağıdaki gibi.

Dosyayı local dizinimize attıktan sonra tarayıcıdan dosyayı açarsak karşımıza bir arama kutucuğu cıkacak herhangi bir kelime arattığımızda bize sonuçlar listelenecek ve arattığımız kelime arama kutucuğunun içerisine yazılı olarak gelecek (Zaten de çoğu web sitesinde bu böyledir :). İşte tam da orada XSS zafiyeti ortaya çıkıyor herangi bir kelime arattığımızda arattığımız kelime input etiketinin value’sine yazılıyor

Bu satırda bunu görebiliriz

Eğer ben arama kutucuğunda “/><script></script> gibi bir arama yaparsam, yaptığım arama value kısmına yazılacağı için ilk başa koyduğum “/> karakterleri ile input etiketini kapatmış olacağım ve ardından <script></script> etiketlerini açıp kodu enjekte etmiş olacağım ve kodumuzun çalıştığını ve alert(); fonksiyonunun etkinleştirildiğini göreceğiz. Kaynak kodunu incelediğimizde aşağıdaki gibi bir çıktı alırız.

XSS (Cross Site Scripting) Stored

Stored XSS türünde kullanıcıdan alınan verinin bir veritabanına yada dosyaya yazıldığından bahsetmiştik. Eğer kullanıcıdan alınan veriler filtreden geçirilmezse XSS Stored açığı ortaya çıkar, enjekte edilen kodlar veritabanına yazılır ve tekrar çağırılıp işleme alındığında code tekrardan çalışır.

NOT : DVWA uygulamasında isim bilgisi alan input etiketi maxlength=”10″ olarak geliyor <script>alert(1);</script> gibi kodlar deneyebilmeniz için kaynak koddan maxlength (örn. maxlength=”1000000″) değerini arttırabilirsiniz.

#LOW – DVWA uygulamasında bununla ilgili bir form hazırlanmış. DVWA’dan XSS Stored kısmına geldiğimizde kullanıcıdan isim ve mesaj bilgisi alan bir form geliyor isim kısmına “code” mesaj kımına “mesaj” yazarak submit ettiğimizde veri tabanına kaydedilip alt kısımda bize tekrarda gösteriliyor isim bilgisi yerine <script>alert(1);</script> kodunu mesaj kısmına ise “mesaj” yazıp denediğimizde hatamızı alıyoruz bu seviyede herhangi bir filtreleme yapılmamış. Hatayı aldıktan sonra kaynak kodlarına baktığımızda kodumuzun kaynak koda enjekte edildiğini görebiliriz.

#MEDIUM – Bu seviyede, <script>alert(1);</script> kodunu enjekte etmeyi denediğimizde hata almıyoruz belliki buralarda filtrelemeler var hemen kodu denedikten sonra kaynak koda bakıyoruz veee karşımızda alert(1);</script> gibi bir sonuç var. İlk etiketimiz belliki filtreye yakalanmış fakat 2. </script> etiketimizde sorun yok, şu şekilde bir kullanımla <sc<script>ript>alert(1);</script> bu filtreyi atlatabiliriz. Bir başka kullanım –> <sCriPt>alert(1);</script>
PHP kaynak kodlarına baktığımızda


Satırında name inputunda <script> gibi bir değer yakalarsa bunun yerine boşluk karakteri koyması gerektiği belirtilmiş (“”) burada filtrelemeyi canlı canlı görebiliyoruz, XSS reflected Medium seviyesiyle aynı filtreleme tek farkı veri tabanına yazılması :).

#HIGH – <script>alert(1);</script> kodunu enjekte etmeyi deniyoruz input olarak verip kaynak koda baktığımızda <script></script> etiketlerinin tamamen filtrelendiğini görüyoruz. Kaynak koddaki bu satırdan da anlaşılıyor.


HTML etiketlerini deniyoruz <h1>A</h1> gibi bir input denediğimizde HTML etiketlerinin filtrelenmediğini görüyoruz HTML etiketlerini kullanarak sisteme alert verdittirebiliriz. <img src=yok onerror=”alert(1);”/> denediğimizde hatayı alırız :).

DOM Based XSS (Cross Site Scripting)

DOM Based XSS zafiyetinin tanımını yukarıda yapmıştık buyüzden direkt uygulamalara geçeceğim.

#LOW – DVWA uygulamasında XSS (DOM) sayfasına geldiğimizde karşımıza XSS Stored ve XSS Reflected’dan farklı olarak input girebileceğimiz bir alan gelmiyor bunun yerine <select></select> etiketi karşımıza geliyor ve seçebileceğimiz bazı seçenekler var burada “lütfen bir dil seçiniz ?” denmiş ve seçebileceğimiz 4 farklı dil verilmiş. Bunlardan birini seçip submit ettiğimizde URL den anlıyoruz ki aslında bir fonksiyona parametre gönderiyor.
URL > http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English –> default parametresine English değerini gönderiyor.
Aslında GET metodu güvenlik zafiyetini ele veriyor, gizliden gizliye input alıyor aslında :).
Sayfaya http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert(1);</script> gibi bir istek attığımızda hatayı direkt alabiliriz
Kaynak kodlarında <script>alert(1);</script> şeklinde bir ibare göremeyiz çünkü DOM (Document Object Model) de gerçekleşmiştir. Runtime sadece çalışma sırasında gerçekleşmiştir kaynak kodlarına yazılmaz.

#MEDIUM – LOW seviyedeki gibi bir deneme yaparak açığı sömürmeyi deniyelim.
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert(1);</script> isteğini attıktan sonra url nin http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English buna dönüştüğünü görüyoruz burada <script></script> etiketlerine 1 şekilde izin verilmemiş eğer <script></script> etiketi varsa default’a English değerini göndermesi gerektiği söylenmiş. Kaynağı görüntüle dediğimizde bunu görebiliriz.

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=yenideger</option></select><img src=yok onerror=”alert(1);”/> şeklinde bir istekte bulundu ğumuzda hatayı alacağız.

#HIGH – Bu seviyeyede LOW daki gibi bir istek atarak hata alabilecekmiyiz bir bakalım.
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert(1);</script> isteğini attığımızfa tıpkı mediumdaki gibi
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English url sine dönüştü urlmiz peki napacağız ?
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English#<script>alert(1);</script> burada “#”
karakterini açıklayalım “#” karakterinden sonra yazılan her şey sunucuya gitmez o karakterden önce yazılan her şey sunucuya gider.