SQL Injection

SQL Injection #

SQL Injection (SQLi) adalah salah satu jenis kerentanan keamanan web paling tua, namun hingga hari ini masih menjadi penyebab utama kebocoran data besar di berbagai aplikasi. Meski konsepnya sederhana, dampaknya bisa sangat fatal: mulai dari pencurian data sensitif, bypass login, hingga penghapusan seluruh database.

OWASP secara konsisten menempatkan SQL Injection (atau kategori Injection secara umum) sebagai risiko keamanan tingkat atas, menandakan bahwa masalah ini belum selesai meskipun teknologinya sudah lama dikenal.

Apa Itu SQL Injection? #

SQL Injection adalah teknik serangan di mana penyerang menyisipkan (inject) perintah SQL berbahaya ke dalam input aplikasi, sehingga query database yang dijalankan berubah dari yang seharusnya.

Masalah utama terjadi ketika:

  • Input user digabung langsung ke query SQL
  • Tidak ada validasi atau sanitasi input
  • Tidak menggunakan parameterized query (prepared statement)

Contoh Query Rentan #

SELECT * FROM users WHERE email = 'input_user' AND password = 'input_password';

Jika input_user diisi dengan nilai tertentu, struktur query dapat dimanipulasi.


Mengapa SQL Injection Sangat Berbahaya? #

SQL Injection bukan sekadar bug biasa, melainkan pintu masuk ke seluruh sistem data.

Dampak umum:

  • ๐Ÿ”“ Bypass autentikasi (login tanpa password)
  • ๐Ÿ“„ Dump seluruh isi database
  • ๐Ÿงจ Menghapus atau memodifikasi data
  • ๐Ÿ•ต๏ธ Mengambil data sensitif (password, token, PII)
  • โš™๏ธ Dalam kasus tertentu, eskalasi ke Remote Code Execution

Yang membuatnya berbahaya:

  • Database biasanya menyimpan single source of truth
  • Aplikasi sangat bergantung pada integritas data
  • Sering kali akun DB punya privilege terlalu besar

Contoh SQL Injection Sederhana #

Bypass Login #

Input email:

' OR '1'='1' --

Query menjadi:

SELECT * FROM users WHERE email = '' OR '1'='1' -- ' AND password = 'xxx';

Akibatnya:

  • Kondisi OR '1'='1' selalu true
  • Komentar -- mengabaikan sisa query
  • Login berhasil tanpa kredensial valid

Jenis-Jenis SQL Injection #

Classic / In-Band SQL Injection #

Hasil serangan langsung terlihat di response aplikasi.

  • Error-based
  • Union-based

Blind SQL Injection #

Response tidak menampilkan error atau data langsung.

  • Boolean-based (true / false)
  • Time-based (SLEEP, WAITFOR)

Out-of-Band SQL Injection #

Data dikirim lewat channel lain (DNS, HTTP request eksternal). Biasanya terjadi jika DB memiliki kemampuan network.


Contoh Blind SQL Injection (Time-Based) #

' OR IF(1=1, SLEEP(5), 0) --

Jika response aplikasi delay ยฑ5 detik, berarti query berhasil dieksekusi.


Mengapa SQL Injection Masih Sering Terjadi? #

Beberapa penyebab umum:

  • Developer menganggap ORM otomatis aman
  • Query dinamis manual tanpa binding
  • Legacy code
  • Deadline pressure
  • Kurangnya security review

Bahkan aplikasi modern pun masih rentan jika:

  • Menggunakan raw query
  • Dynamic ORDER BY / LIMIT tanpa whitelist

Best Practice Mencegah SQL Injection #

Gunakan Prepared Statement (Parameterized Query) #

Ini adalah solusi utama dan paling efektif.

โŒ Salah:

SELECT * FROM users WHERE email = '" + email + "';

โœ… Benar:

SELECT * FROM users WHERE email = ?;

Jangan Pernah Menggabungkan Input User ke Query #

Tidak ada alasan valid untuk melakukan string concatenation pada query SQL.

Jika butuh query dinamis:

  • Gunakan conditional binding
  • Gunakan query builder

Gunakan ORM, Tapi Tetap Waspada #

ORM membantu, tapi bukan jaminan mutlak.

Masih berbahaya jika:

  • Menggunakan raw SQL
  • Dynamic table / column name tanpa whitelist

Validasi dan Normalisasi Input #

  • Batasi panjang input
  • Validasi tipe data (angka, email, enum)
  • Normalisasi sebelum diproses

โš ๏ธ Catatan: Validasi bukan pengganti prepared statement.

Principle of Least Privilege untuk Database User #

Akun database:

  • Jangan pakai root
  • Pisahkan read / write user
  • Batasi DROP, ALTER, CREATE

Jika SQL Injection terjadi, dampaknya bisa diminimalkan.

Hindari Menampilkan Error SQL ke User #

Error seperti:

You have an error in your SQL syntax near...

Memberi penyerang informasi berharga.

Gunakan:

  • Generic error message
  • Logging internal

Security Testing & Review #

  • Static code analysis
  • Dynamic testing (DAST)
  • Penetration testing
  • Gunakan payload SQLi saat QA

Diagram Alur SQL Injection (Text-Based) #

User Input
   |
   v
Application (tanpa validasi)
   |
   v
SQL Query Digabung Manual
   |
   v
Database Menjalankan Query Berbahaya
   |
   v
Data Bocor / Sistem Rusak

Ringkasan #

SQL Injection adalah:

  • Kerentanan klasik
  • Mudah dicegah
  • Namun berdampak sangat besar jika terlewat

Kunci utamanya:

  • Prepared statement adalah wajib
  • Jangan percaya input user
  • Batasi privilege database

Jika sebuah aplikasi terhubung ke database dan menerima input user, maka SQL Injection harus selalu menjadi perhatian utama dalam desain keamanan.

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