[Google XSS Game] – Level 1 – 6

Challenge dapat di akses melalui https://xss-game.appspot.com/

Level 1

Mission Description : This level demonstrates a common cause of cross-site scripting where user input is directly included in the page without proper escaping.

Interact with the vulnerable application window below and find a way to make it execute JavaScript of your choosing. You can take actions inside the vulnerable window or directly edit its URL bar.

Mission Objective : Inject a script to pop up a JavaScript alert() in the frame below.

Once you show the alert you will be able to advance to the next level.

Hints :

  1.  To see the source of the application you can right-click on the frame and choose View Frame Source from the context menu or use your browser’s developer tools to inspect network traffic.
  2.  What happens when you enter a presentational tag such as <h1>?
  3.  Alright, one last hint: <script> … alert …

Solution :
Pertama masukkan sebuah kata, apa saja ke dalam searh bar. Penulis akan memasukkan kata “test”. Ini hasilnya :

Setelah input sebuah kata “test” kata yang kita cari tersebut ditampilkan kembali di kalimat error “Sorry, no results were found for (input). Try again. Ini merupakan tanda tanda pertama untuk mengetahui jika halaman tersebut dapat di XSS atau tidak. Maka kita lanjutkan dengan test kedua. Kita akan mencoba memasukkan <strike>test2</strike>

Nampaknya apapun yang kita masukan kedalam search bar akan di tampilkan ulang di page tanpa filtering apa apa sehingga dengan mencari <script>alert(1)</script>, challenge dapat diselesaikan

Level 2

Mission Description : Web applications often keep user data in server-side and, increasingly, client-side databases and later display it to users. No matter where such user-controlled data comes from, it should be handled carefully.

This level shows how easily XSS bugs can be introduced in complex apps.

Mission Objective : Inject a script to pop up an alert() in the context of the application.

Note: the application saves your posts so if you sneak in code to execute the alert, this level will be solved every time you reload it.

Hints :

  1.  Note that the “welcome” post contains HTML, which indicates that the template doesn’t escape the contents of status messages.
  2.  Entering a <script> tag on this level will not work. Try an element with a JavaScript attribute instead.
  3.  This level is sponsored by the letters im and g and the attribute onerror.

Solution :

Pertama penulis mencoba memasukkan <script>alert(1)</script> dan melakukan share status, namun tidak terjadi apa apa. Nampaknya untuk level ini dibutuhkan cara lain untuk melakukan XSS. Namun <strong>test</strong> masih dapat bekerja yang berarti kita masih bisa melakukan XSS namun dengan cara lain selain menggunakan <script> tag. Untuk menyelesaikan challenge ini dapat menggunakan <img src=’1′ onerror=’alert(1)’ >

Level 3

Mission Description : As you’ve seen in the previous level, some common JS functions are execution sinks which means that they will cause the browser to execute any scripts that appear in their input. Sometimes this fact is hidden by higher-level APIs which use one of these functions under the hood.

The application on this level is using one such hidden sink.

Mission Objective : As before, inject a script to pop up a JavaScript alert() in the app.

Since you can’t enter your payload anywhere in the application, you will have to manually edit the address in the URL bar below.

Hints :

  1. To locate the cause of the bug, review the JavaScript to see where it handles user-supplied input.
  2. Data in the window.location object can be influenced by an attacker.
  3. When you’ve identified the injection point, think about what you need to do to sneak in a new HTML element.
  4. As before, using <script> ... as a payload won’t work because the browser won’t execute scripts added after the page has loaded.

Solution : Pertama penulis mencoba mengecek 1 per 1 image dari cloud data center yang disediakan, terdapat 3 image dan setiap image di klik akan mengubah URL nya sesuai nomor imagenya.

https://xss-game.appspot.com/level3/frame#1

https://xss-game.appspot.com/level3/frame#2

https://xss-game.appspot.com/level3/frame#3

Nampaknya, kita bisa memasukkan input kita dibelakang pound symbol di url. Namun pada challenge ini, kita tidak dapat menggunakan <script> tag juga karena browsernya tidak akan mengeksekusi script setelah pagenya sudah selesai loading. Sehingga mari kita coba payload yang sama seperti sebelumnya, namun kita letakkan di belakang pound symbol di url. Challenge dapat diselesaikan dengan

https://xss-game.appspot.com/level3/frame#<img src=’1′ onerror=alert(1) >

Level 4

Mission Description : Every bit of user-supplied data must be correctly escaped for the context of the page in which it will appear. This level shows why.

Mission Objective : Inject a script to pop up a JavaScript alert() in the application.

Hints :

  1. Take a look at how the startTimer function is called.
  2. When browsers parse tag attributes, they HTML-decode their values first. <foo bar=’z’> is the same as <foo bar=’z’
  3. Try entering a single quote (‘) and watch the error console.

Solution :

Pertama penulis menekan tombol create timer dan melihat apa yang terjadi. Saat tombol ditekan, url akan berubah menjadi

https://xss-game.appspot.com/level4/frame?timer=3

setelah 3 detik, alert ini akan muncul dan url kembali menjadi semula lagi. Penulis mengecek hint untuk bantuan, pada hint nomor 3, kita diminta untuk memasukkan ‘ kedalam timer. Setelah tombol create timer ditekan, tidak terjadi apa apa setelah begitu lama.

Pada console, terdapat sebuah error

Uncaught SyntaxError: missing ) after argument list

Penulis menyadari cara yang benar untuk melakukan xss, hal pertama yang dilakukan adalah melihat source code yang bekerja saat input di submit.

Challenge ini dapat diselesaikan dengan mensubmit timer dengan

3′); alert(‘1

Mengapa XSS dapat terjadi ketika kita memasukkan itu? Hal ini karena yang kita input akan langsung masuk ke fungsi yang dijalankan onload tanpa dilakukan filterin terlebih dahulu. Sehingga kurang lebih akan menjadi

<img src=”static/loading.gif” onload=”startTimer(‘3’);alert(‘1’);” />

Tidak terjadi error pada syntax, dan XSS sukses dilakukan

Level 5

Mission Description : Cross-site scripting isn’t just about correctly escaping data. Sometimes, attackers can do bad things even without injecting new elements into the DOM.

Mission Objective : Inject a script to pop up an alert() in the context of the application.

  1. The title of this level is a hint.
  2. It is useful look at the source of the signup frame and see how the URL parameter is used.
  3. If you want to make clicking a link execute Javascript (without using the onclick handler), how can you do it?
  4. If you’re really stuck, take a look at this IETF draft

Solution : Penulis mengklik Sign up dan menemukan sebuah box email dan tombol hyperlink untuk Next >> . Pada signup.html terdapat sebuah comment

<!– We’re ignoring the email, but the poor user will never know! –>

Dari sini dapat disimpulkan bahwa kita tidak akan menggunakan field input email untuk melakukan XSS.

Kemudian pada line 15 di signup.html terdapat

<a href=”{{ next }}”>Next >></a>

yang berarti inputan yang bernama next akan dimasukkan dan menggantikan posisi {{ next }} . Penulis baru menyadari ternyata pada url terjadi perubahan menjadi

https://xss-game.appspot.com/level5/frame/signup?next=confirm

terdapat http request dengan metode GET, next=confirm sehingga akan membuat line tadi menjadi seperti

<a href=”confirm”>Next >></a>

Mari kita ubah sedikit untuk melakukan XSS dengan referensi dari hints nomor 4, menjadi

<a href=”javascript:alert(1)”>Next >></a>

Berhasil

Level 6

Mission Description : Complex web applications sometimes have the capability to dynamically load JavaScript libraries based on the value of their URL parameters or part of location.hash.

This is very tricky to get right — allowing user input to influence the URL when loading scripts or other potentially dangerous types of data such asXMLHttpRequest often leads to serious vulnerabilities.

Mission Objective : Find a way to make the application request an external file which will cause it to execute an alert().

Hints :

  1. See how the value of the location fragment (after #) influences the URL of the loaded script.
  2. Is the security check on the gadget URL really foolproof?
  3. Sometimes when I’m frustrated, I feel like screaming
  4. If you can’t easily host your own evil JS file, see if google.com/jsapi?callback=foo will help you here.

Solution :

Tidak ada field input dimanapun, sehingga penulis langsung saja melihat source code dan hints yang ada dan mengambil kesimpulan bahwa yang perlu dilakukan adalah redirection XSS dengan cara menghost sebuah javascript file di sebuah website.

Terdapat beberapa bagian yang perlu diperhatikan dalam source code yang diberikan yang berhubungan dengan URL pada saat itu

https://xss-game.appspot.com/level6/frame#/static/gadget.js


  •  

  •  

  •  

  •  

  •  

Kita akan melakukan input URL setelah # untuk melakukan sebuah file inclusion dari website yang kita buat dan berisi file javascript untuk melakukan alert(1), namun tidak lupa juga terdapat sebuah filter yang melarang penggunaan http, namun pengecekan ini sangat mudah untuk dilewatkan dengan menggunakan capital contohnya Http atau HTTP karena pengecekannya case-insensitive. Penulis sempat stuck di titik ini dan menentukan untuk mencoba teknik lain, yaitu Data URL.

Referensi dapat dicek dari https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs

Challenge dapat diselesaikan dengan mengubah URL menjadi

https://xss-game.appspot.com/level6/frame#data:text/javascript,alert(1)

Challenge Complete !

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *