DVWA Series: XSS (Reflected)
January 04, 2022 ⏱️4 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 Reflected XSS?
Reflected Attackn adalah serangan di mana acript yang diinject dipantulkan dari server web, seperti dalam pesan kesalahan, hasil pencarian, atau respons lain apa pun yang menyertakan beberapa atau semua input yang dikirim ke server sebagai bagian dari permintaan.
https://portswigger.net/web-security/cross-site-scripting/reflected
Security Level: Low
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
Information Gathering
Pada halaman web tersebut tedapat form yang bisa kita submit. Jika kita mengisi nilai totooo <'"/>
, maka akan muncul seperti berikut:
Dan form tesebut menggunakan method GET. kemudian ketika kita melihat source nya special character yang kita input tidak ter encode dan pada file php tersebut tidak ada validasi yang melarang penggunaan kata tag script.
Sehingga kita bisa lakukan serangan.
Serang
Kita tinggal ketikkan kode berikut pada form input
<script>alert(document.cookie)</script>
dan kalau kita lihat sourcenya, apa yang kita inputkan itu langsung ditampilkan oleh website tersebut.
Untuk real scenarionya sama dengan yang DOM, jadi silakan liat pada artikel saya yang membahas tentang XSS DOM
Security Level: Medium
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
Information Gathering
Terdapat validasi untuk menghilangkan tag <script>
pada inputan. Jika kita menggunakan payload sebelumnya, maka hasilnya akan seperti berikut:
tag scrip yang pertama akan hilang sehingga script tidak bisa jalan. namun masih bisa diakalin, karena tag <script>
direplace menjadi kosong (”) kita bisa gunakan payload
<scr<script>ipt>alert(document.cookie)</script>
atau bisa juga menggunakan payload yang tidak mengandung kata script seperti:
<body onload="alert(document.cookie)">
atau
<img src/onerror=alert(document.cookie)>
Security Level: High
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
Information Gathering
Pada source code di atas terlihat bahwa pattern "<s*c*r*i*p*t"
tidak diizinkan. Sehingga kita tidak bisa menggunakan payload yang mengandung tag <script
. kita bisa pakai tag img
atau body
atau pakai tag lain, dapat dilihat di cheat sheet berikut https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
Launch Attack
<body onload="alert(document.cookie)">
atau
<img src/onerror=alert(document.cookie)>
Menghindari Reflected XSS
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
Menggunakan fungsi PHP bawaan (seperti “htmlspecialchars()”), memungkinkan untuk meng-escape nilai apa pun yang di input.