Google XSS Game Çözüm
Öncelikle herkese merhaba. Bu yazımda “xss-game.appspot.com” adresinden erişilebilen Google XSS Game çözümünü yapacağım. XSS açığının birçok sistemde keşfedilmesinden ötürü bu tarz alıştırmalar öğretici olabilmektedir.
1- İlk seviyede en basit düzeyde hiçbir filtreleme olmadan Reflected XSS açığı karşımıza çıkmakta. Klasik payloadımızı çalıştırarak bir sonraki seviyeye basit bir şekilde geçiyoruz.
Payload: <script>alert(333)</script>
2 – İkinci kısımda ise bir yorum alanı görülmekte. Bu alanda Stored XSS açığı bulunmakta. Girilen veriler encode edilmediği durumlarda bu açık bulunabilmektedir. Veritabanına kaydedildiği için oldukça tehlikeli sonuçlar doğurabilir.
Payload: “><img src=x onerror=alert(333);>
Yorum alanına payloadı yazıp paylaşıyoruz.
Hatayı alıyoruz ve böylece paylaşım yaptığımız sayfaya giren tüm kullanıcılar bu hatayı görecektir.
3 – Bu seviyede ise bir Javascript kodunda yer alan güvenlik açığı bulunmakta. Burada DOM XSS karşımıza çıkmakta.
Kaynak kodunu incelediğimizde en altta tabContent kısmına bir image kodunun eklendiğini görmekteyiz. Ayrıca bu image koduna kullanıcı tarafından alınan num değerinin geldiği görülmekte. Burada yer alan img kodunu kullanarak açığı bulacağız. DOM XSS tipinde bildiğimiz gibi # karakterinden sonra payloadı ekleyeceğiz. ‘ şareti ile payloadı çalışır hale getiriyoruz.
Payload: “’><img src=x onerror=alert(“‘XSS’”);>
4 – Belkide çözmesi düşünmesi en zevkli bölüm bu olabilir. Oldukça zevkliydi benim için beyin fırtınası yaptırıyor.
Burada startTimer isimli fonksiyona aktarılan kullanıcı inputu görülmekte.
Burada çeşitli kombinasyonlar deneyerek sayfayı inceledim. Buradaki mantığı deneyerek anlamaya çalıştım ve sonuca ulaştım. Burada koddan gördüğümüz üzere startTimer fonksiyonunda girdiyi parantezler tek tırnak olarak bize gösteriyor.
‘);alert(333) payloadını girdiğimizde kod içerisinde alert kısmında ‘) kısmının olmaması durumunda kodun çalışabileceğini görüyoruz. Buraya gireceğimiz payload ‘):alert(‘test şeklinde olursa, kod içerisinde payloadımız startTimer(‘’);alert(‘test’); şeklini alarak çalışacaktır.
Payload başarılı bir şekilde çalışıyor ve diğer bölüme geçiyoruz.
5 – Bu seviyede ise bir e-mail input kısmı yer almakta. Sign up kısmına tıklayıp ilerliyoruz.
Bu kısımda e-mail girmemiz gereken bir input kısmı yer almakta.
İnput kısmının kaynak kodlarına baktığımızda kullanıcıdan alınan next parametresinin bir Javascript içerisinde çalıştığını görüyoruz. Buraya girdiğimiz payload encode işlemi olmayacak parametreler kullanıldığında çalışacaktır.
E-mail input kısmına javascript:alert(333) payloadını girdiğimizde çalışacaktır.
6 – Bu seviyede ise kullanıcı tarafından alınan verinin src tagı kısmına direk olarak verilmesi ile oluşan bir zafiyet bulunmakta. Bu şekilde başka bir sayfadan http veya https olmadan başka bir siteden Javascript dosyası çağırılabilir. Burada bize verilen google üzerinden bir Javascript dosyası çağırarak alert alacağız.
Bu kodlar içerisinde görüldüğü gibi http ile bir web sitesinden bir dosya çağırılamamaktadır, engellenmiştir. Challenge da bize verilen #https://www.google.com/jsapi?callback=foo adresi üzerinden bir Javascript dosyası çağırabiliriz.
Evet kod içerisinde engellendiği için http olduğundan dolayı dosyamızı çağıramadık. Burada browser http olmadan //www.google….. şeklinde de bir web sitesinden dosya çağırabilir src kısmında illa http ile çağırılması gerekmez.
Evet hatayı almayı başardık. Burada adresimizi #//www.google.com/jsapi?callback=alert bu şekile sokarak bir web adresinden dosya çağırabildik ve alert ile hatamızı aldık.
Böylece challenge başarılı bir şekilde tamamlanmış oldu. Başka yazılarda görüşmek üzere.