Lompat ke konten Lompat ke sidebar Lompat ke footer

Mencegah Serangan CSRF pada Aplikasi Web

Cross-Site Request Forgery (CSRF) adalah salah satu jenis serangan web yang memungkinkan penyerang untuk memaksa pengguna melakukan tindakan yang tidak diinginkan pada aplikasi web di mana mereka telah diautentikasi. Artikel ini akan menjelaskan bagaimana menambahkan perlindungan terhadap serangan CSRF dengan menggunakan token CSRF pada aplikasi web.


Cara Kerja CSRF pada Pengguna yang Login:

  1. Pengguna Login: Pengguna login ke situs web A dan mendapatkan cookie sesi yang sah.

  2. Penyerang Menyiapkan Serangan: Penyerang membuat halaman web berbahaya atau email dengan permintaan berbahaya ke situs web A.

  3. Pengguna Terkena Serangan: Pengguna mengakses halaman web berbahaya atau membuka email dengan permintaan berbahaya.

  4. Permintaan Tidak Sah Dikirim: Karena pengguna masih login, permintaan berbahaya dikirim ke server A menggunakan cookie sesi pengguna, sehingga terlihat sah.


Sebelum Update: Script Rentan Terhadap Serangan CSRF

Berikut adalah contoh formulir transfer uang yang rentan terhadap serangan CSRF:

index.html

<!DOCTYPE html>
<html>
  <body>
    <h2>Transfer Uang</h2>
    <form action="transfer.php" method="POST">
      <label for="amount">Jumlah:</label><br />
      <input type="text" id="amount" name="amount" /><br />
      <label for="to">Kepada:</label><br />
      <input type="text" id="to" name="to" /><br /><br />
      <input
        type="hidden"
        name="csrf_token"
        value="<?php echo generateToken(); ?>"
      />
      <input type="submit" value="Transfer" />
    </form>
  </body>
</html>


transfer.php

<?php
session_start();
// Proses transfer (tanpa perlindungan CSRF)
$amount = $_POST['amount'];
$to = $_POST['to'];
echo "Transferred $amount to $to";
?>

Pada contoh di atas, tidak ada perlindungan terhadap serangan CSRF. Penyerang dapat membuat formulir yang mengirimkan permintaan POST ke `transfer.php` tanpa sepengetahuan pengguna.

Hasil user


Contoh Serangan CSRF

Berikut adalah contoh script yang dapat digunakan oleh penyerang untuk mengeksploitasi kelemahan CSRF pada aplikasi:

csrf_attack.html:

<!DOCTYPE html>
<html>
  <body>
    <h2>CSRF Attack</h2>
    <form action="http://localhost/csrf/transfer.php" method="POST">
      <input type="hidden" name="amount" value="1000" />
      <input type="hidden" name="to" value="attacker_account" />
      <input type="submit" value="Submit" />
    </form>
  </body>
</html>

Hasil attacker



Sesudah Update: Script Terlindungi dari Serangan CSRF

Untuk melindungi aplikasi web dari serangan CSRF, kita dapat menambahkan token CSRF pada formulir dan memverifikasinya di sisi server.


1. Mengubah `index.html` menjadi `index.php`:

   Karena `index.html` adalah file HTML statis, kita perlu mengubahnya menjadi file PHP untuk bisa menghasilkan token CSRF dinamis.

<?php
session_start();

function generateToken() {
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}
?>

<!DOCTYPE html>
<html>
<body>
  <h2>Transfer Uang</h2>
  <form action="transfer.php" method="POST">
    <label for="amount">Jumlah:</label><br />
    <input type="text" id="amount" name="amount" /><br />
    <label for="to">Kepada:</label><br />
    <input type="text" id="to" name="to" /><br /><br />
    <input type="hidden" name="csrf_token" value="<?php echo generateToken(); ?>" />
    <input type="submit" value="Transfer" />
  </form>
</body>
</html>


2. Memastikan Token CSRF Diterima dan Diverifikasi di `transfer.php`:

<?php
session_start();

function generateToken() {
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function verifyToken($token) {
    return $token === $_SESSION['csrf_token'];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || !verifyToken($_POST['csrf_token'])) {
        die('Invalid CSRF token');
    }

    // Proses transfer
    $amount = $_POST['amount'];
    $to = $_POST['to'];
    // Lakukan logika transfer di sini
    echo "The account has been verified and the transfer was successfully made to $to an amount of $amount.";
} else {
    die('Invalid request method');
}
?>


   

3. Memastikan Permintaan POST Terkirim dengan Token yang Benar:

   Pastikan bahwa Anda mengakses file `index.php` melalui server lokal Anda, misalnya `http://localhost/csrf/index.php`, bukan `index.html`.

4. Memastikan Tidak Ada Cache yang Mengganggu:

   Bersihkan cache browser atau gunakan mode incognito untuk memastikan tidak ada cache yang mengganggu proses pengiriman token CSRF.

Dengan langkah-langkah di atas, token CSRF seharusnya dihasilkan dan diverifikasi dengan benar, sehingga menghindari kesalahan "Invalid CSRF token". Pastikan juga bahwa session bekerja dengan baik dan tidak ada konflik di server lokal Anda.

Hasil user


Hasil attacker



Dampak dari Serangan CSRF

Serangan CSRF memungkinkan penyerang untuk membuat pengguna yang sah melakukan tindakan yang tidak diinginkan tanpa sepengetahuan mereka. Dampak dari serangan ini dapat sangat merugikan, termasuk:

  1. Transaksi Finansial Tidak Sah:

    • Penyerang dapat memaksa pengguna untuk melakukan transfer uang atau pembelian online tanpa sepengetahuan pengguna.
  2. Pengubahan Informasi Akun:

    • Informasi pribadi pengguna, seperti alamat email, kata sandi, atau preferensi akun, dapat diubah oleh penyerang.
  3. Penyalahgunaan Hak Istimewa:

    • Pengguna dengan hak administratif dapat dipaksa untuk membuat perubahan kritis pada sistem atau menambahkan pengguna dengan hak istimewa tinggi.
  4. Pencurian Identitas:

    • Informasi pribadi dan kredensial pengguna dapat disalahgunakan untuk berbagai bentuk penipuan dan pencurian identitas.
  5. Kerugian Reputasi:

    • Serangan CSRF pada aplikasi web yang dikelola dapat merusak reputasi bisnis dan mengurangi kepercayaan pengguna.

Kesimpulan

Menambahkan perlindungan CSRF pada aplikasi web sangat penting untuk menghindari tindakan tidak sah yang dapat membahayakan pengguna dan integritas aplikasi. Dengan menggunakan token CSRF, kita dapat memastikan bahwa setiap permintaan POST yang diterima oleh server adalah sah dan berasal dari sumber yang valid. 

Selalu pastikan untuk menerapkan praktik keamanan terbaik dalam pengembangan aplikasi web untuk melindungi pengguna dan data mereka.

Posting Komentar untuk "Mencegah Serangan CSRF pada Aplikasi Web"