CSRF Attack & Solution

A. CSRF Attack

  1. Untuk mencoba serangan, anda bisa mendownload project web yang sudah tersedia untuk penetrasi, download di sini -> https://github.com/raesene/bWAPP
  2. Kemudian download aplikasi sender penetrasi tambahan Burp Suite di sini -> https://portswigger.net/burp/communitydownload
  3. Setelah anda download, install pada localhost anda. Jika bingung, bisa lihat tutorial berikut -> https://www.youtube.com/watch?v=F3QcgmCuEC0
  4. Jika sudah terinstall, masuk ke halaman Login
    http://localhost/bwapp/login.php

5. Kemudian login dengan Login : bee, Password : bug

6. Untuk serangan CSRF terbagi menjadi beberapa serangan, kita coba satu – persatu. Sekarang kita coba CSRF (Change Password) kemudian pilih Hack

7. Setelah masuk ke halaman yang di tuju, klik kanan -> View page source ( Google Chrome )

8. Kemdian block baris code seeperti gambar di bawah, copy + paste di editor anda.

9. Buatlah sebuah file csrf.html simpan di lokasi yang anda inginkan. Paste code di atas.

10. Sekarang copy + paste url pada halaman ganti password

11. Sekarang kita akan mengganti password menggunakan file crsf.html yang dibuat, ubah code seperti gambar berikut

12. untuk melakukan perubahan password, buka file csrf.html pada browser anda, klik Change

13. Kemudian coba anda login dengan password baru yang dibuat lewat file csrf.html

B. Solution

  1. Untuk mengatasi serangan CSRF (Change Password) , pada bagian form input, tambahkan current password field seperti gambar di bawah

2. Pada saat handling request get password_curr , tambahkan code berikut ( Sesuaikan nama tabel dan kolom )

if(isset($_REQUEST["password_curr"]))
                {
                              
                    $password_curr = $_REQUEST["password_curr"];
                    $password_curr = mysqli_real_escape_string($link, $password_curr);
                    $password_curr = hash("sha1", $password_curr, false);                

                    $sql = "SELECT password FROM users WHERE login = '" . $login . "' AND password = '" . $password_curr . "'";

                    // Debugging
                    // echo $sql;    

                    $recordset = $link->query($sql);             

                    if(!$recordset)
                    {

                        die("Connect Error: " . $link->error);

                    }

                    // Debugging                
                    // echo "<br />Affected rows: ";                
                    // printf($link->affected_rows);

                    $row = $recordset->fetch_object();   

                    if($row)
                    {

                        // Debugging
                        // echo "<br />Row: ";
                        // print_r($row);

                        $sql = "UPDATE users SET password = '" . $password_new . "' WHERE login = '" . $login . "'";

                        // Debugging
                        // echo $sql;

                        $recordset = $link->query($sql);

                        if(!$recordset)
                        {

                            die("Connect Error: " . $link->error);

                        }

                        // Debugging              
                        // echo "<br />Affected rows: ";         
                        // printf($link->affected_rows);

                        $message = "<font color=\"green\">The password has been changed!</font>";

                    }

                    else
                    {

                        $message = "<font color=\"red\">The current password is not valid!</font>";

                    }
                
                }

Leave a Reply

Your email address will not be published. Required fields are marked *