Ana içeriğe atla

DOM Tabanlı Cross Site Scripting (XSS) Zafiyeti

Herkese merhabalar,bugünkü konumuz DOM tabanlı cross site scripting yani kısa adıyla xss zafiyeti.
haydi konumuza geçelim;
Cross Site Scripting (XSS), içinde bulunduğumuz dönemde geliştiriciler arasında oldukça iyi tanınan bir güvenlik açığıdır. Dolayısıyla XSS’in ne olduğunu tekrar anlatmaya gerek yok. Bir XSS saldırısının etkisine dair geliştiriciler tarafından iyi anlaşılması gereken en önemli kısım şu ki bir saldırgan oturum bilginizi (session) çalabilir ya da oturumunuzu ele geçirebilir. Yanı sıra başarılı phishing saldırıları düzenleyebilir. Kısacası kurbanın yapabildiği her şeyi etkin bir şekilde yapma becerisine sahip olur.

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 XSS Zafiyeti Gerçek Bir Tehdittir

Çeşitli araştırma ve çalışmalar göstermiştir ki web sitelerinin %50’ye yakını DOM tabanlı XSS açığına karşı savunmasızdır. Google, Yahoo ve Alexa gibi popüler ve bilinen firmaların sitelerinde DOM Tabanlı XSS zafiyetleri tespit edilmiştir.

Sunucu Taraflı Filtrelerin Hiçbir Önemi Yok

Reflected ve Stored XSS zafiyetleriyle DOM Tabanlı XSS zafiyeti arasındaki en büyük fark, DOM Tabanlı XSS’nin server-side (sunucu taraflı) filtrelerle durdurulamamasıdır. Bunun çok basit bir sebebi bulunmakta: ‘#’ (hash) karakterinden sonra yazılan hiçbir şey sunucuya gönderilmez, yani HTTP trafiğinde gözükmez.

Hash olarak da bilinen bölüm geçmişte, HTML sayfayı belli bir elemente doğru kaydırma amacıyla tanıtılmıştı. Fakat ilerleyen dönemlerde JavaScript geliştiricileri tarafından AJAX kullanılan sayfalarda, sayfa kayıtlarını ve buna benzer şeyleri tutmak için çoğunlukla hash-bang “#!” olarak kullanılmıştır.

Bu tasarımdan dolayı hash’tan sonraki hiçbir şey sunucuya gönderilmeyecektir. Bu da göstermektedir ki DOM Tabanlı XSS zafiyetlerinde, kodda uygulanan sunucu taraflı hiçbir güvenlik yöntemi işe yaramayacaktır. İşin doğrusunu söylemek gerekirse, web uygulama güvenlik duvarlarına (WAF) benzer diğer korunma yöntemleri ya da ASP.NET Request Validation gibi kapsamlı framework önlemi, DOM Tabanlı XSS saldırılarına karşı koruma sağlamayacaktır.

Kaynak & Alıcı olarak isimlendirilen Girdi & Çıktı

OM XSS’in ardındaki mantık şudur: Kullanıcıdan (source, kaynak) alınan girdi, bir yürütme noktasına (sink, alıcı) gider. Önceki örnekte kaynak document.baseURI iken, alıcıysa document.write idi.

Yine de DOM XSS’in, kullanıcı tarafından kontrol edilebilen bir kaynağın tehlikeli bir alıcıda kullanılmasıyla gerçekleştiğini bilmek gerekir.

Dolayısıyla, DOM XSS’e karşı savunmasız kalmamak için ihtiyaç duyulan kod değişikliklerinin yapılması ya da uygun kodlama (encoding) işleminin gerçekleştirilmesi gerekir.

Aşağıda, DOM XSS saldırılarında sıklıkla hedeflenen kaynak ve alıcıların bir listesi mevcut. Bu, tamamlanmış bir liste olmasa da nelerin sorun oluşturabileği konusunda size iyi bir fikir verecek. Eğer girdi/kaynak kullanıcı tarafından kontrol edilebiliyorsa ve çıktı/alıcı kısmında JavaScript kodu çalıştırılmasına yol açabilecekse, DOM XSS güvenlik açığı oluşabilir demektir.

Popüler Kaynaklar

  • document.URL
  • document.documentURI
  • location.href
  • location.search
  • location.*
  • window.name
  • document.referrer

Popüler Alıcılar

  • HTML modifikasyon alıcıları
    • document.write
    • (element).innerHTML
  • Davranış değişimi için HTML modifikasyon
    • (element).src (belli elementlerde)
  • Yürütmeyle ilgili alıcılar
    • eval
    • setTimeout / setInterval
    • execScript
  • DOM XSS'den Korunmak

DOM tabanlı XSS zafiyetlerinden en iyi korunma yolu doğru çıktı (sink) metodunu kullanmaktan geçer. Örneğin, bir kullanıcı girdisini <div> elementi içerisinde yazdırmak isterseniz, innerHTML’i kullanmayın. Bunun yerine DOM XSS zafiyetlerine karşı kullanılması daha doğru olan innerText / textContent metotlarını kullanın.

Eval gibi tehlikeli kaynaklarda da (source) kullanıcı tarafından kontrol edilen bir girdiyi kullanmak her zaman kötü bir fikir olacaktır. Zararlı olabilecek karakterleri temizlemek doğru metodu kullanmaya göre çok daha zor ve riskli bir çözüm olur.

Son olarak, ilk kodumuzdaki problemin çözümü için güçlük çıkarabilecek ve kolayca hataya neden olabilecek encode etme yöntemi yerine, çıktıyı içeriğe yazdırma amacıyla element.textContent metodunu şu şekilde kullanmamız yeterlidir:

b>Geçerli URL: </b> <span id=“contentholder”></span>
<script>
document.getElementById(“contentholder”).textContent = document.baseURI;
</script>

Bu kod parçası da aynı işlemi yapmasına rağmen diğer kodun aksine, DOM tabanlı XSS zafiyetlerine karşı güvenlidir


Yorumlar

Bu blogdaki popüler yayınlar

Sniffing Nedir Ve Nasıl Korunuruz ?

Sniffing Nedir ? Sniffing temel olarak verinin yolunu kesmek olarak tabir edilebilir. Sniffing ile networkdeki paketler yakalanabilir içeriği okunabilir. Sniffingin amacı ; Şifreleri (email, web, SMB , ftp, telnet,SQL) ,Email text’ini Transfer edilen dosyaları (e-mail,ftp, SMB ) yakalamaktır. Sniffing metodu ikiye ayrılır ; Pasif Sniffing ve Aktif Sniffing. Pasif Sniffing Hub olan sistemler için geçerlidir,Hub olan networklerde paketler tüm bilgisayarlara iletilir. Networkteki veri lan üzerinden tüm bilgisayarlara gönderildiği için sniff etmek kolaydır. Aktif Sniffing Switch olan sistemler için geçerlidir. Switch MAC adreslerine bakar ve veriyi sadece alması gerekenkişiye gönderir. Saldırgan switchi zehirlemeye çalışır , binlerce mac adresi gönderip swichin bir hub gibi davranmasına neden olur ve verinin tüm portlardan çıkmasını sağlar. Sniffingle yapılacak farklı saldırı şekilleri vardır. ARP Poisoning Arp veri göndermek için IP adresinin mac adresini çözümlemeye yarayan protokoldür. ...

Remote Code Evaluation Zafiyeti

Remote Code Evaluation Nedir? Remote Code Evaluation (RCE), kullanıcı girdisinin bir string ya da bir dosyaya enjekte edilmesi ve bu girdinin kullanılan programlama diline ait parser (ayrıştırıcı) tarafından uygulanmasıyla ortaya çıkan bir açık türüdür. Bu durum, genelde, web geliştiricilerinin beklediği bir şey değildir. Bir Remote Code Evaluation zafiyeti suistimale açık web uygulaması ya da web sunucusunun tümü üzerinde bir risk meydana getirebilir. RCE ile ilgili önemli bir nokta şu ki neredeyse tüm programlama dillerinde açığın temelini oluşturan söz konusu evaluation (değerleme) fonksiyonları mevcuttur. RCE’yi Bir Örnekle Açıklayalım Kullanıcı girdilerinin, kodun evaluate edilmesini sağlayan fonksiyonlara enjekte edilmesine izin verdiğiniz takdirde bir code evaluation (kod değerleme) meydana gelebilir. Kasti olarak, örneğin, bir hesap makinesi programı yazmak amacıyla matematik fonksiyonlarına erişirken; veya tesadüfen bu olay meydana gelebilir. Tesadüfi denmesinin sebebi şu ki k...

Sosyal Mühendislik Ve Phising Saldırıları

Sosyal Mühendislik , bir bilgisayar sisteminin kullanıcılarını, bir bilgisayar sistemine yetkisi olmadan erişim elde etmek için gizli bilgileri açığa çıkarma sanatıdır. Bilgisayar korsanları yani Hackerlar kimliğini kullanan kullanıcıları hayati oturum açma bilgilerini serbest bırakmaları için kullandığı hileleri bilmek, bilgisayar sistemlerini korumak açısından temel bir gerekliliktir. Başta bu kavramı duyunca gerçekten böyle bir meslek var mı diye araştırmıştım. Sonra araştırınca anladım ki bu kavram Aldatma ve insanları kandırmanın ta kendisiymiş. Ünlü Hacker  Kevin D. Mitnick ’ın yazmış olduğu  Aldatma Sanatı  adlı kitabı okumanızı öneririm. Ünlü Hacker : Fujitsu, Motorola, Nokia, Sun Microsystems gibi büyük şirketlere izin ağlarına girerek birçok ceza ve bilgisayardan uzaklaştırma almıştır.  Sosyal Mühendislikte Püf Noktalar Sosyal Mühendislikte genelde amaç para değil; teknik olarak ulaşılması mümkün olmayan durumlarda hacklenecek sisteme teknik olmayan bir diz...