CROSS SITE REQUEST FORGERY

 CROSS SITE REQUEST FORGERY

Apa Itu Cross-Site Request Forgery (CSRF)?

Cross-Site Request Forgery (CSRF) adalah salah satu jenis serangan pada aplikasi web di mana penyerang mengeksploitasi identitas pengguna untuk mengirimkan permintaan yang tidak sah ke server aplikasi. CSRF sering kali berhasil karena aplikasi web tidak memverifikasi keaslian permintaan yang datang dari pengguna yang telah diautentikasi.

Cara Kerja CSRF

  1. Pengguna Login: Pengguna login ke situs web A dan mendapatkan cookie sesi yang sah.
  2. Penyerang Membuat Permintaan Berbahaya: Penyerang membuat halaman web berbahaya atau email yang mengandung permintaan berbahaya ke situs web A.
  3. Pengguna Mengunjungi Halaman Berbahaya: Pengguna mengunjungi halaman berbahaya tersebut atau membuka email yang mengandung permintaan berbahaya.
  4. Permintaan Tidak Sah Dikirim: Karena pengguna sudah login ke situs web A, permintaan berbahaya tersebut dikirim ke server dengan menggunakan cookie sesi pengguna, sehingga permintaan tersebut tampak sah bagi server.

Demo:

• Buat sebuah folder di C:\xampp\htdocs\ bernama csrf.

•Di dalam folder csrf, buat file bernama index.html dengan  isi sebagai berikut

<!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="submit" value="Transfer">
        </form>
    </body>
</html>

• Buat file bernama transfer.php dengan isi sebagai berikut:

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

• Buat file bernama csrf_attack.html dengan isi sebagai berikut:

<!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>


•Akses Formulir Transfer:

  • Buka browser dan akses http://localhost/csrf/index.html
  • Isi formulir dan submit untuk memastikan transfer bekerja.



• Luncurkan Serangan:

  • Buka http://localhost/csrf/csrf_attack.html.


• Klik tombol submit dan lihat hasil di halaman transfer.php.



Bentuk mitigasi yang bisa dilakuakn

Untuk melindungi form ini dari serangan Cross-Site Request Forgery (CSRF), bisa menambahkan token CSRF pada form dan memvalidasi token tersebut di server saat form dikirim. Berikut adalah contoh bagaimana cara melakukannya:

  1. Generate dan simpan token CSRF di server: Modifikasi file transfer.php untuk membuat token CSRF dan menyimpannya di sesi.

  2. Tambahkan token CSRF ke dalam form: Sisipkan token CSRF yang dihasilkan ke dalam form sebagai input hidden.

  3. Validasi token CSRF di server: Pastikan token yang dikirim bersama form valid sebelum memproses permintaan.

Berikut adalah contoh implementasi:

Modifikasi pada transfer.php
<?php
// Start the session
session_start();

// Generate CSRF token
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Check if form is submitted
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!empty($_POST['csrf_token']) && hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        // Valid request, process the transfer
        $amount = $_POST['amount'];
        $to = $_POST['to'];
        // Process the transfer here
        echo "Transfer berhasil kepada $to sejumlah $amount.";
    } else {
        // Invalid CSRF token
        echo "Token CSRF tidak valid.";
    }
}
?>

modifikasi pada file index.html

<!DOCTYPE html>
<html>
    <body>
        <h2>Transfer Uang</h2>
        <?php
        // Start the session to get the CSRF token
        session_start();
        ?>
        <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 htmlspecialchars($_SESSION['csrf_token']); ?>">
            <input type="submit" value="Transfer">
        </form>
    </body>
</html>

Hasil yang diperoleh


Dengan demikian, form HTML ini sekarang memiliki perlindungan terhadap serangan CSRF dengan menggunakan token CSRF yang dihasilkan dan divalidasi di server.

Dampak dari CSRF

  • Transfer Dana Tidak Sah: Seperti contoh di atas, penyerang bisa mengalihkan dana ke akun mereka.
  • Mengubah Pengaturan Akun: Penyerang bisa mengubah alamat email atau kata sandi pengguna.
  • Mengirim Pesan Berbahaya: Penyerang bisa mengirim pesan atau posting konten yang tidak diinginkan atas nama pengguna.
  • Eksekusi Perintah Berbahaya: Penyerang bisa menjalankan perintah berbahaya yang merusak data atau sistem.

Cara Mencegah CSRF

Token CSRF

Token CSRF adalah nilai acak yang unik yang dikirimkan bersama dengan setiap permintaan yang membutuhkan otorisasi. Token ini biasanya disisipkan dalam formulir atau sebagai header HTTP. Server memverifikasi token ini sebelum memproses permintaan.

Implementasi Token CSRF:

  1. Membuat Token: Saat sesi pengguna dimulai, server membuat token CSRF yang unik.
  2. Menyisipkan Token dalam Formulir: Token tersebut disisipkan dalam setiap formulir HTML sebagai input tersembunyi.
  3. Memverifikasi Token: Saat permintaan diterima, server memverifikasi apakah token yang diterima cocok dengan token yang disimpan di server.

Verifikasi Referer dan Origin

  • Referer Header: Server dapat memeriksa header Referer untuk memastikan permintaan datang dari domain yang sah.
  • Origin Header: Header Origin lebih sulit untuk dimanipulasi dan dapat digunakan untuk memverifikasi asal permintaan.

Penggunaan CAPTCHA

Menggunakan CAPTCHA pada formulir kritis dapat mencegah serangan otomatis karena CAPTCHA memerlukan interaksi manusia.

SameSite Cookie Attribute

Pengaturan atribut SameSite pada cookie dapat membatasi pengiriman cookie hanya untuk permintaan dari domain yang sama.

Penggunaan Header HTTP

Header seperti X-Requested-With: XMLHttpRequest dapat digunakan untuk memverifikasi bahwa permintaan datang dari sumber yang sah, walaupun ini bukan solusi yang paling aman karena header ini bisa dimanipulasi.

Kesimpulan

Cross-Site Request Forgery (CSRF) adalah serangan yang mengeksploitasi sesi yang sah untuk mengirimkan permintaan tidak sah ke server. Untuk melindungi aplikasi web dari CSRF, teknik seperti penggunaan token CSRF, verifikasi referer/origin, penggunaan CAPTCHA, pengaturan SameSite pada cookie, dan validasi sisi server harus diimplementasikan. Dengan langkah-langkah ini, risiko serangan CSRF dapat diminimalkan.


Komentar

Postingan populer dari blog ini

OSINT

LOCAL/REMOTE FILE INCLUSION

OSINT UTS