XSS Atlatma Teknikleri

XSS (Cross Site Scripting), saldırganların HTML ve JavaScript gibi istemci tabanlı script dillerinden yararlanarak web sayfalarına istemci taraflı kod enjekte etmelerine olanak veren bir güvenlik zafiyetidir.

XSS saldırıları istemci taraflı gerçekleştirildiği için saldırılardaki asıl hedef web uygulamaları değil, kullanıcılardır. XSS güvenlik zafiyetinden yararlanabilen saldırganlar; ad-jacking, click-jacking, keylogging, session-hijacking vb. gibi ataklar gerçekleştirebilirler. Aşağıda XSS zafiyetinin tetiklenmesine yönelik basit bir örnek bulunmaktadır.

Resim 1.1’de metin kutusu ve butondan oluşan basit bir web sayfası yer almaktadır.

Resim 1.2’de ise web sayfasının kaynak kodları yer almaktadır.

Kodlardan anlaşılacağı üzere kullanıcıların butona tıklamaları durumunda, metin kutusuna girilen girdi sayfaya yazılacaktır. Ancak girilen metin sayfaya yazılmadan önce hiçbir kontrolden geçmemektedir. Dolayısıyla metin kutusuna HTML etiketleri yazılması durumunda, bu etiketler normal bir metin gibi sayfaya yazılmayacaktır ve sayfa üzerinde birer HTML kodu olarak çalışacaklardır.

Resim 1.3’te <script> etiketi kullanılarak sayfa üzerinde bir JavaScript komutu çalıştırıldı ve XSS zafiyeti tetiklendi.

Bu örnekte XSS saldırısı oldukça kolay bir şekilde gerçekleştirilmiş olsa da XSS zafiyetinden yararlanmak her zaman için bu kadar kolay değildir. Bu yazıda, XSS zafiyetinin tetiklenmesine engel olmak için uygulanan bazı filtreleme yöntemlerinin atlatılmasına yönelik teknikler anlatılacaktır.

XSS Atlatma Teknikleri

XSS zafiyetlerinin engellenmesi için birtakım yöntemler uygulanarak filtreleme işlemleri gerçekleştirilebilir. Filtreleme işlemi, tarayıcı tabanlı veya sunucu tabanlı yapılabilir.  Filtreleme işlemindeki ana fikir, kullanıcılar tarafından gelen girdilerde XSS saldırılarına neden olabilecek verilerin kontrol edilmesidir. Filtreleme işlemine yönelik genel yaklaşımlar arasında Regex ve Blacklist kontrolleri yer alır. Bu kontroller sonucunda XSS saldırılarına neden olabilecek girdilerin tespit edilmesi durumunda, tüm istek veya istekte yer alan zararlı kod parçaları engellenebilir.

Geliştiricilerin filtreleme işlemlerinde uyguladıkları yöntemler XSS saldırılarına karşı çözüm oluşturmasına rağmen, bu yöntemlerden bazıları atlatılabilir ve XSS saldırıları gerçekleştirilebilir. Aşağıda bazı filtreleme yöntemlerinin atlatılması için kullanılabilecek olan teknikler anlatılmaktadır.

Karakter Kodlama

Kullanıcılar tarafından yapılan isteklerin XSS saldırılarına neden olmaması için kullanıcı girdilerine yönelik metin taramaları yapılabilir. Saldırganlar, web sitelerine yaptıkları isteklerin metin taramasından geçmesi durumunda, bu yöntemi atlatmak için XSS kodunda yer alan bazı karakterleri encode edebilirler ve bu şekilde istek yapabilirler. Örneğin; gelen istekler üzerinde “JavaScript” kelimesinin incelendiği varsayılsın ve XSS zafiyetinin tetiklenmesi için <a href=”javascript:alert(‘PriviaSec’)” >XSS</a> gibi bir payload kullanılsın. Böyle bir durumda “JavaScript” kelimesinin bazı karakterlerine ASCII kodlaması yapılabilir. Örneğin j karakterinin ASCII karşılığı 106 dır. Yapılan istekte j karakteri yerine &#106; kullanılabilir. Böyle bir durumda &#106; bir HTML varlığı olarak algılanır ve j harfini temsil eder. İstek bu şekilde yeniden yapıldığında metin taraması atlatılacağından dolayı XSS zafiyeti tetiklenmiş olur.

<a href=”&#106;avascript:alert (‘PriviaSec’)”>XSS</a>

Metin taramaları dışında, yapılan isteklerde &# karakterlerinden sonra gelen sayıların kontrol edilmesi durumunda, yapılan istek filtreye takılabilir ve saldırı başarısız olabilir. Bunun için &# karakterlerinden sonra desimal bir sayı kullanmak yerine, x karakteri ile birlikte sayının heksadesimal karşılığı kullanılabilir. Bu durumda payload aşağıdaki gibi olur.

<a href=”&#x6A;avascript:alert (‘PriviaSec’)”>XSS</a>

Metin taramalarını atlatmak için Base64 kodlamasından da yararlanılabilir. Bu işlem için ilk olarak XSS zafiyetini tetiklemek amacıyla kullanılacak olan payload Base64 algoritmasıyla encode edilir. Ardından encode edilen metin, JavaScript atob() ve eval() fonksiyonları ile birlikte kullanılarak yeniden istek yapılır. atob() fonksiyonuyla encode edilen metin decode edilecektir ve eval() fonksiyonuyla ortaya çıkan metnin bir string olarak algılanması sağlanacaktır. Böylece yapılan kontrol atlatılacak ve XSS zafiyeti tetiklenmiş olacaktır. Örnek payload aşağıda yer almaktadır.

<body onload= “eval(atob(‘YWxlcnQoJ1ByaXZpYVNlYycp’))”>

Başka bir filtreleme yöntemi olarak metin taramasıyla beraber ASCII kodlarına yönelik tarama yapılabilir. Böyle bir durumda XSS kodu içerisinde yer alan bazı karakterlere ASCII kodlaması yapılacak olsa bile istek filtreye takılabilir. Ancak kontrolü atlatmak için yine ASCII kodlamasından yararlanılabilir.  ASCII kodlamasıyla ortaya çıkan karakter varlıkları 1-7 basamak arasında sayısal değerler alabilirler. Bu sayısal değerin en sol basamaklarında 0 rakamları bulunması durumunda bu rakamlar yok sayılır. Ayrıca karakter varlıklarının sonunda ; (noktalı virgül) işareti bulunmayabilir. Örneğin; &#97; ve &#0000097 ifadeleri aynı anlama gelmektedir. Dolayısıyla XSS zafiyetinin tetiklenmesi için kullanılacak olan payload içerisinde yer alan bir metnin (örn: alert) karakterleri belirtilen şekilde kodlanabilir ve bu yöntemle filtre atlatılarak XSS zafiyeti tetiklenebilir. Örnek payload aşağıda yer almaktadır:

<a href= “&#x6A;avascript:&#0000097&#0000108ert(‘PriviaSec’)” >XSS</a>

Bazı geliştiriciler gelen istekte yer alan zararlı kodların tüm harflerini büyük harfe çevirebilirler. Örneğin; <script>alert(1)</script> gibi örnek bir kodun bu filtreden geçmesi durumunda, kod <SCRIPT>ALERT(1)</SCRIPT> halini alır. Bu durumda kod bir işe yaramayacaktır. Çünkü, JavaScript büyük-küçük harfe duyarlı (case sensitive) bir dil olduğu için karakterleri büyük harfe dönüşen alert() fonksiyonu çalışmayacaktır. Dolayısıyla alert kelimesinin tüm karakterleri ASCII kodlamasından geçirilebilir ve filtre atlatılabilir. Örnek payload aşağıda yer almaktadır:

<SCRIPT> &#97;&#108;&#101;&#114;&#116;(1) </SCRIPT>

JavaScript komutları çalıştırmak için Unicode kodlamadan da yararlanılabilir. Böylece metin taraması ve ASCII kod taraması gibi filtreleme yöntemleri uygulanan web sayfalarına yönelik XSS saldırıları gerçekleştirilebilir. Örnek payload aşağıda yer almaktadır:

<script>\u0061\u006cert(1)</script>

Filtreleme işlemi için kullanılan yöntemlerden biri de karakter kontrolüdür. Bazı karakterler zafiyet tetiklenmesinde kullanılabileceği için kontrol edilirler (örn: ‘,”). Bu kontrolü atlatmak için HTML varlıklarından yararlanılabilir. Örnek payload aşağıda yer almaktadır:

<img src= javascript:alert(&quot;XSS&quot;)>

Ayrıca kullanıcı girdileri kontrolden geçtikten sonra bazı özel karakterler URL Encoding yöntemiyle encode edilebilirler (örn: <,>,’,”). Payload içerisinde yer alan belirli karakterlerin bu yöntemle encode edilmesi durumunda, yapılan istek sonucu XSS zafiyeti tetiklenebilir. Örnek payload aşağıda yer almaktadır:

%3Cscript%3Ealert(1)%3C%2Fscript%3E

Boşluk Kullanma

JavaScript ve HTML gibi diller boşluklar konusunda oldukça esnektirler. Örneğin; JavaScript alert() fonksiyonu al ert() şeklinde de kullanılabilmektedir.

Eski tarayıcılarda karakterler arasında TAB karakteri olması durumunda TAB yok sayılırdı. Bu nedenle filtreleri atlatmak için TAB karakteri kullanılarak metinler arasında boşluk bırakılabilir. Örnek payload aşağıda yer almaktadır (Bu yöntem modern tarayıcılarda çalışmamaktadır.):

<img src=”javascript:al ert(‘PriviaSec’)”>

Ayrıca TAB karakteri ASCII kodlamasından geçirilebilir. Ortaya çıkan payload aşağıda yer almaktadır:

<img src="java&#x09;script: al&#x09;ert('PriviaSec')">

HTML boşluklarda esnek olduğu gibi yeni satırlar konusunda da oldukça esnektir. Herhangi bir satırda açılan HTML etiketi kapatılmadan bir alt satıra geçilerek kaldığı yerden devam ettirilebilir. Bu durum XSS filtrelerini atlatmak için kullanılabilir. Örnek payload aşağıda yer almaktadır:

<a href=”jav&#x0A;ascript:&#x0A;ale&#x0Drt;(‘PriviaSec’)”>privia_security</a>

HTML Etiketlerinin Manipule Edilmesi

Saldırganların XSS saldırıları gerçekleştirmek için HTML etiketlerinden yararlanmalarına engel olmak adına, kullanıcılar tarafından yapılan isteklerde yer alan HTML etiketlerine ve etiket isimlerine göre filtreleme yapılabilir.

Bir filtreleme yöntemi olarak, yapılan isteklerde <script> etiketi olup olmadığına yönelik tarama yapılabilir ve ifadenin bulunması durumunda tespit edilen etiketler isteğin içerisinden silinebilir. Bu yöntemi atlatmak için ikiye ayrılmış bir <script> (örn: <scr ve ipt>) etiketinin arasına 2. bir <script> etiketi yerleştirilerek yeniden istek yapılabilir. Bu durumda araya yerleştirilen etiketin tespit edilip silinmesi durumunda ikiye ayrılmış olan etiket yeniden birleşir ve XSS zafiyeti tetiklenmiş olur. Örnek payload aşağıda yer almaktadır:

<scr<script>ipt>alert(“privia_security”) </scr<script>ipt>

İkinci bir yöntem olarak etiket tespiti yapmak için etiket adı ve özellik adı arasında bulunan boşluk karakterleri kontrol edilebilir. Bu filtreyi atlatmak için / işareti kullanılabilir. Etiket adı ve özellikler boşluk karakteriyle ayrıldığı gibi eğik çizgi kullanılarak da ayrılabilir. Örnek payload aşağıda yer almaktadır:

<img/src=”logo.jpg”onload= &#x6A;avascript:eval(alert(‘PriviaSec’))>

Farklı bir yöntem olarak, saldırganlar etiketleri farklı bir şekilde biçimlendirerek XSS zafiyetinden yararlanabilirler. Örneğin; <a> etiketi için href özelliğinin kontrol edildiği düşünülsün. Aşağıdaki payload kullanılarak bu yöntem atlatılabilir:

<a onmouseover=alert(“PriviaSec”)> priviasecurity.com</a>

Bir başka atlatma yöntemi, etiket isimlerinin büyük-küçük harf karışık bir şekilde kullanılmasıdır. HTML büyük-küçük harfe duyarlı bir dil değildir. Dolayısıyla metin taramalarında büyük-küçük harfe önem verilmemesi durumunda saldırganlar zafiyeti tetiklemek için etiket adının harflerini büyük-küçük harf karışık bir şekilde yazabilirler. Örnek payload aşağıda yer almaktadır:

<ScRipT>alert(1)</script>

Kullanıcı girdilerine yönelik yapılan etiket kontrolünde, bir etiket tespit edilmesi durumunda bu etiket istekten silinebilir ve girdinin geri kalanı için kontrol yapılmadan girdinin geri kalanı kabul edilebilir. Böyle durumlarda saldırganlar yaptıkları isteklerde birden fazla etiket kullanarak XSS zafiyetini tetikleyebilirler. Örnek payload aşağıda yer almaktadır:

<input type=”text” name=”textBox” value=””><script>alert(1)</script>