Apa itu XSS?
XSS (Cross-Site Scripting) adalah jenis serangan dimana penjahat menyuntikkan kode javascript berbahaya ke dalam sebuah website.
Normalnya, javascript digunakan untuk hal baik ( seperti membuat tombol animasi). Tapi dalam serangan XSS, Javascript digunakan untuk hal jahat seperti mencuri cookie atau mengintip data pribadi orang lain.
Apa itu DOM?
DOM(Document Object Model) adalah cara browser menyusun isi sebuah halaman web. Bayangkan sebuah pohon keluarga:
- Akarnya adalah halaman web.
- Cabangnya adalah judul, teks, gambar, dan tombol.
Javascript punya kemampuan merubah cabang-cabang tersebut secara langsung di browser tanpa harus bertanya ke server.
Lalu Apa itu XSS DOM?
XSS DOM adalah jenis XSS yang terjadi karena kesalahan dalam penulisan Javascript di sisi browser.
Berbeda dengan XSS biasa yang datanya dikirim ke server dulu, pada XSS DOM kode berbahaya sama sekali tidak menyentuk server jadi semuanya terjadi di dalam rumah atau di browser korban.
Analogi XSS DOM "Pesan Titipan Di Resepsionis"
Bayangkan kita sedang di sebuah hotel. Di meja resepsionis ada papan digital yang otomatis menampilkan nama tamu yang sedang check-in berdasarkan data dari ktp yang tamu berikan.
- Kondisi Normal: Tamu memberikan KTP bernama "Dimas". Papan menampilkan:"Selamat Datang, Dimas!"
- Kondisi XSS DOM: Tamu memberikan KTP yang isinya bukan nama melainkan intruksi "Matikan Lampu Lobbu!". Karena sistem papan digital itu langsung membaca apa pun isi KTP tanpa diperiksa, tiba-tiba lampu lobby mati.
Disini resepsionis (server) tidak salah, tapi papan digitalnya (browser) yang terlalu patuh menjalankan perintah berbahaya yang kamu selipkan di kolom "Nama".
Dampak XSS DOM
Jika seseorang behasil mengeksploitasi XSS DOM, mereka bisa saja:
- Mencuri cookie atau data login korban.
- Mengarahkanmu ke situs palsu tanpa kamu sadari.
- Mengubah tampilan halaman web, misalnya mengganti nomer rekening tujuan transfer.
Fitur Di XSS DOM DVWA

Pada menu XSS DOM di DVWA ada sebuah Drop-down menu untuk memilih bahasa(inggris, prancis, spanyol, dan jerman).
- Saat user memilih bahasa, perhatikan alat URL browser.
- Url-nya akan berubah menjadi /vulnerabilities/xss_d/?default=English
- Fitur ini mengambil kata "English" dari URL dan langsung menampilkannya di halaman web menggunakan Javascript.
XSS DOM DVWA(Low, Medium, High, Impossible)
- Level Low
Di level low DVWA sama sekali tidak memeriksa apa yang ada di dalam URL tersebut. Saya akan coba menyuntikkan kode javascript sederhana.

Ubah tulisan English atau bahasa lainnya yang muncul menjadi <script>alert('PERCOBAAN LEVEL LOW BERHASIL')</script>

Ketika Enter ditekan hasilnya sebuah pop-up muncul di layar dengan teks yang sesuai dengan yang ada di url.
Kerentanan Level Low

Pada source code level low sudah sangat jelas bahwa tidak ada proteksi keamanan, apapun akan dijalankan.
2. Level Medium
Pada level ini, sudah diterapkan kode PHP untuk menyaring input. Dimana server mencoba mencari kata kunci <script> di dalam URL. Jika ditemukan maka kata tersebut akan dihapus agar tidak bisa dijalankan oleh browser.

Perhatikan pada URL diatas, saya tidak menggunakan script seperti di level low. Untuk mengakalinya gunakan onerror pada tag gambar <img>.
URL: http://localhost/dvwa/vulnerabilities/xss_d/?default=<img src=x onerror=allert('PERCOBAAN_LEVEL_MEDIUM_BERHASIL')>

Hasilnya pop-up muncul seperti pada level low tetapi di level ini tidak menggunakan <script> melainkan onerror.
- <img src:x : Mencoba menampilkan gambar tapi diberi alamat yang salah (x).
- onerror=….. : Jika gambar gagal dimuat karena alamat x tidak ada maka jalankan perintah javascript di dalamnya.
Kerentanan Level Medium

Pada source code medium.php ada sebuah baris kode if (stripos($default, "<script") !== false) yang mengartikan bahwa server memeriksa inputan yang bertulisan <script> akan segera di tolak. Tetapi sistem tidak sadar bahwa Javascript bisa dijalankan lewat banyak cara lain. Contohnya onerror.
3. Level High
Di level High server menggunakan sistem whitelist: English, French, Spanish, German. Maka jika kita mamasukan kata diluar daftar whitelist server akan langsung menolaknya.

Karena daftar whitelist wajib ada maka digunakan # setelah English lalu masukan kode javascriptnya.

Hasilnya pop-up berhasil muncul, jika saat enter ditekan hasil belum muncul maka refresh halaman website terlebih dulu.
Alasan mengapa berhasil: Karena English adalah whitelist maka pertahankan teks English lalu gunakan #, ini berguna agar server berhenti membaca URL sebelum tanda # jadi kode javascript tetap bisa jalan.
Kerentanan Level High

Mesikupun di level ini diterapkan keamanan yang cukup ketat, seperti adanya whitelist dan penolakan otomatis jika tidak ada whitelist yang masuk di URL.
Tetapi dengan penggunaan #, server tidak bisa melihat apa yang ada di belakang tanda pagar pada URL.
4. Level Impossible
Pada level Impossible tidak ada kode PHP jika dilihat pada source-code nya itu dikarenakan keamanan level ini berada di sisi client. Javascript di halaman DVWA ini sudah diperbaiki, sistem tidak menelan mentah-mentah apa yang ditulis user di URL.
Analogi Level Impossible "Siaran Tunda Dengan Sensor"
- Level Low/Medium/High: Acara disiarkan live, jika ada bintang tamu berteriak kata kotor atau perintah berbahaya maka penonton langsung mendengarnya.
- Level Impossible: Acara menggunakan Siaran Tunda. Dimana ada editor yang duduk di depan layar. Jika bintang tamu mencoba berteriak kata kotor maka editor akan mengubah suara itu menjadi "Bip" atau teks biasa dilayar. Pesan aslinya tidak pernah sampai ke penonton.
Keamanan Level Impossible

Pada level ini proteksi terlihat pada halaman utama DVWA bukan lagi di file PHP-nya. Di level ini developer tidak lagi membiarkan browser menulis apa pun dari URL secara langsung ke halaman. Itulah alasan mengapa file PHP kosong, karena solusinya dengan memperbaiki cara Javascript di browser mengolah data agar tidak lagi bisa disusupi.

Pada percobaan yang dilakukan hasilnya script yang disisipkan di URL muncul sebagai tulisan biasa di kolom drop down, dikarenakan cara kerja website yang berbeda. Semua input dianggap sebagai teks biasa dan tidak pernah dianggap sebagai perintah atau script.