CSRF

CSRF #

CSRF (Cross-Site Request Forgery) adalah serangan web di mana penyerang memanfaatkan sesi autentikasi korban untuk melakukan aksi yang tidak sah pada web application. Browser korban secara otomatis menyertakan cookie autentikasi saat mengakses endpoint target, sehingga server mempercayai request tersebut berasal dari pengguna yang sah.

Ciri khas CSRF:

  • Tidak memerlukan penyerang mengetahui kredensial korban.
  • Bergantung pada session atau cookie yang aktif.
  • Biasanya menyerang state-changing request (misal POST, PUT, DELETE).

Contoh ilustratif:

  • Korban login ke bank.com.
  • Penyerang membuat halaman evil.com dengan form hidden yang mengirim POST /transfer?amount=1000&to=attacker.
  • Browser korban otomatis mengirim cookie bank.com, sehingga transfer terjadi tanpa persetujuan korban.

Dampak CSRF #

CSRF memiliki potensi merusak integritas, kerahasiaan, dan kontrol aplikasi.

Dampak umum #

  1. Perubahan data pengguna: Profil, alamat email, preferensi, password.
  2. Transaksi finansial: Transfer uang, pembelian, pembayaran tagihan.
  3. Kompromi hak akses: Perubahan hak admin, penghapusan user.
  4. Penyalahgunaan API: Eksekusi fungsi internal tanpa izin.

Studi kasus:

  • Tahun 2008, PayPal mengakui adanya potensi CSRF pada beberapa endpoint, memungkinkan transfer uang tanpa otorisasi penuh.
  • Situs media sosial terkadang terkena CSRF yang bisa mengubah password, email, atau posting tanpa persetujuan pengguna.

Mekanisme CSRF #

  1. Session-based attack: Menggunakan session autentikasi korban.
  2. Hidden form attack: Form HTML atau script yang otomatis mengirim request.
  3. Link attack: URL yang jika diklik mengirim aksi ke target.
  4. AJAX abuse: Request JavaScript cross-site (jika server tidak melakukan CORS dengan benar).

Contoh Real CSRF #

Transfer Uang #

  • Target: akun bank online
  • Request: POST /transfer?amount=5000&to=attacker
  • Teknik: Hidden auto-submit form di website penyerang
  • Akibat: Uang dikirim ke akun penyerang tanpa persetujuan korban

Mengubah Password #

  • Target: media sosial atau email
  • Request: POST /change-password
  • Teknik: Link email atau script auto-submit
  • Akibat: Password berubah, korban kehilangan akses akun

Admin Panel Exploit #

  • Target: admin aplikasi web
  • Request: DELETE /users/123
  • Teknik: Admin mengunjungi halaman yang memicu aksi
  • Akibat: User dihapus atau hak akses berubah

Solusi dan Proteksi CSRF #

CSRF Token (Synchronizer Token Pattern) #

  • Token unik dibuat per sesi atau per request form.
  • Token dikirim sebagai hidden input atau header.
  • Server memverifikasi token sebelum mengeksekusi aksi.

Contoh:

<form method="POST" action="/change-password">
  <input type="hidden" name="csrf_token" value="{{csrf_token}}">
  <input type="password" name="new_password">
  <button type="submit">Change Password</button>
</form>
# Server side validation
if request.csrf_token != session.csrf_token:
    return "Forbidden", 403

Keunggulan: efektif untuk semua form.

SameSite Cookies #

  • Gunakan SameSite=Strict atau Lax untuk cookie autentikasi.
  • Browser tidak mengirim cookie pada request cross-site.
  • Efektif untuk melindungi session dari request pihak ketiga.
  • Kirim CSRF token di cookie dan di body/header.
  • Server membandingkan nilai token di cookie dan request.
  • Berguna jika server tidak bisa menyimpan token di session.

Validasi Referer / Origin Header #

  • Periksa header Referer atau Origin untuk memastikan request berasal dari domain sah.
  • Sebagai lapisan proteksi tambahan, meskipun tidak 100% aman.

State-Changing Request Harus POST/PUT/DELETE #

  • Hindari GET untuk aksi yang mengubah data.
  • Membatasi eksposur CSRF melalui URL.

Best Practices CSRF #

  1. Gunakan CSRF Token untuk semua state-changing request.
  2. Set cookie dengan SameSite=Lax/Strict dan HttpOnly.
  3. Selalu gunakan HTTPS untuk melindungi token dan cookie dari sniffing.
  4. Validasi Origin/Referer sebagai lapisan tambahan.
  5. Hindari GET untuk aksi sensitif, gunakan POST/PUT/DELETE.
  6. Framework modern (Django, Rails, Laravel, Spring) biasanya menyediakan CSRF protection built-in.
  7. Edukasi developer tentang risiko CSRF dan cara mitigasinya.
  8. Audit endpoint yang melakukan aksi sensitif, pastikan tidak ada endpoint yang terlewat.

Diagram Visual CSRF (Alur Diagram) #

      +--------------------+
      | User Browser       |
      | (logged in bank.com)|
      +---------+----------+
                |
                v
      +--------------------+
      | Visit malicious.com |
      | hidden form/script |
      +---------+----------+
                |
                v
      +--------------------+
      | Auto-submit POST   |
      | /transfer?amount=1000&to=attacker |
      +---------+----------+
                |
                v
      +--------------------+
      | bank.com Server    |
      | Validates session  |
      | Executes transfer  |
      +--------------------+

Dengan CSRF Token / SameSite Cookie:

      +--------------------+
      | bank.com Server    |
      | Validates token    |
      | Rejects request    |
      +--------------------+

Kesimpulan #

CSRF merupakan ancaman serius yang mengeksploitasi sesi aktif pengguna. Proteksi mendetail mencakup CSRF token, SameSite cookie, double submit, validasi header, dan praktik coding aman. Implementasi best practice secara konsisten dapat secara signifikan mengurangi risiko serangan ini, terutama untuk aplikasi yang menangani data sensitif atau transaksi finansial.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact