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.