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".

2 Jam lebih saya mengerjakan soal ini, karena TIDAK TELITI. Dan ini akan menjadi pelajaran bagi saya sendiri agar lebih teliti kedepannya. 😅

Happy Hacking! 🍻

Last updated