Di bawah ini adalah source-code dari CSRF level high di DVWA.
vulnerabilities/csrf/source/high.php<?phpif( isset( $_GET[ 'Change' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ],'index.php');// Get input $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ];// Do the passwords match?if( $pass_new == $pass_conf ) {// They do! $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new =md5( $pass_new );// Update the database $insert ="UPDATE `users` SETpassword= '$pass_new' WHERE user = '".dvwaCurrentUser()."';"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Feedback for the userecho"<pre>Password Changed.</pre>"; }else {// Issue with passwords matchingecho"<pre>Passwords did not match.</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ?false: $___mysqli_res);}// Generate Anti-CSRF tokengenerateSessionToken();?>
Mencari Informasi
Jika kita melakukan inspect element pada level high ini, maka akan terlihat bahwa terdapat parameter user_token yang sengaja disembunyikan oleh developer.
user_token ini akan terkirim ketika kita melakukan request.
Nilai dari user_token ini akan berubah-ubah setiap kali kita melakukan request baru (coba saja refresh). Nilai dari parameter ini nantinya akan divalidasi kecocokannya dengan yang ada di server. Ini lah yang dinamakan Anti-CSRF token yang berfungsi untuk memastikan bahwa request dilakuakan secara sah.
Setelah beberapa hari memikirkan jalan keluar untuk mengatasi masalah ini, akhirnya saya menemukan titik terang ketika membaca salah satu artikel. Untuk menyelesaikan masalah ini kita membutuhkan bantuan dari vulnerability lainnya, yaitu XSS.
Jadi skenarionya, kita akan menjalankan JavaScript melalui XSS untuk mendapatkan nilai dari token tersebut, lalu melakukan CSRF untuk merubah password. WOW! Menjadi pengetahuan baru ini bagi saya. 😅
Melakukan Serangan
Oke dari informasi yang sudah kita dapatkan, kita akan siap melakukan serangan.
Pertama-tama kita akan membuat script JS seperti berikut:
Pastikan URL-nya sudah sesuai dengan kondisi anda.
Selanjutnya kita upload file tersebut ke server yang bisa diakses oleh DVWA (contoh: http://0.0.0.0/xsrf-to-csrf.js). Setelah itu lakukan serangan XSS (sebagai contoh saya menggunakan XSS DOM) dan jalankan script JS yang telah kita buat sebelumnya.