Medium

CSRF level Medium on DVWA

Di bawah ini adalah source-code dari CSRF level medium di DVWA.

vulnerabilities/csrf/source/medium.php<?php​if( isset( $_GET[ 'Change' ] ) ) {    // Checks to see where the request came from    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {        // 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` SET password = '$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 user            echo "<pre>Password Changed.</pre>";        }        else {            // Issue with passwords matching            echo "<pre>Passwords did not match.</pre>";        }    }    else {        // Didn't come from a trusted source        echo "<pre>That request didn't look correct.</pre>";    }​    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}​?> 

Mencari Informasi

stripos() berfungsi untuk mencari adanya substring dalam sebuah string (case-insensitive). Dalam kasus ini mungkin developer bermaksud ingin membuat semua request berasal dari website-nya. Terlihat bahwa di baris ke-5 terdapat validasi bahwa jika HTTP_REFERER mengandung kata dari SERVER_NAME maka akan bernilai true dan proses akan dilanjutkan.

Jika kita menggunakan cara sebelumnya, maka proses perubahan password akan gagal karena referer tidak mengandung kata dari server name/host.

Untuk mengatasi hal ini kita bisa saja merubah file index.html yang sebelumnya kita buat, dirubah menjadi nama host target (dalam kasus saya ini menjadi 172.17.0.2.html).

Melakukan Serangan

Seperti dari hasil recon, kita akan merubah nama file-nya menjadi host dari website target. Setelah itu, kita akan membuat victim mengakses mengakses website yang telah kita buat.

Setelah victim yang telah terautentikasi mengakses website tersebut, maka password akan berhasil diubah. Dan sekarang kita bisa menggunakan password baru yang telah ditentukan yaitu "pwned".

Happy Hacking! 🍻

Last updated