Dalam keamanan siber, ancaman terhadap sistem database sering terjadi. Salah satu serangan paling umum dan berbahaya adalah SQL Injection. SQL Injection merupakan teknik peretasan yang memungkinkan penyerang mengakses, mengubah, atau bahkan menghapus data dalam database hanya dengan memanipulasi perintah SQL.
Serangan ini sering terjadi pada website atau aplikasi yang tidak memiliki sistem keamanan yang baik. Tanpa perlindungan yang tepat, peretas dapat mencuri informasi sensitif seperti data pengguna, kata sandi, hingga detail transaksi. Lantas, apa contoh serangan SQL Injection? Bagaimana cara mencegah SQL Injection agar sistem tetap aman? Jawaban pertanyaan tersebut sudah terangkum secara lengkap dalam artikel ini!
Apa Itu SQL Injection?
SQL Injection adalah teknik serangan yang dilakukan dengan menyisipkan kode SQL berbahaya ke dalam form input atau URL pada sebuah website. Tujuan dari serangan cyber ini bisa beragam, mulai dari akses ilegal ke database, mencuri informasi penting, hingga menghapus data secara permanen.
Serangan ini terjadi karena celah keamanan aplikasi yang tidak memvalidasi input dengan benar. Jika sebuah website tidak memiliki sistem penyaringan terhadap query SQL, peretas dapat memasukkan kode tambahan untuk mengakses data yang seharusnya tidak dapat diakses.
Bagaimana Serangan SQL Injection Terjadi?
SQL Injection terjadi ketika penyerang mengeksploitasi kelemahan dalam input pengguna yang tidak divalidasi dengan baik pada sistem berbasis database. Dengan memasukkan kode SQL berbahaya ke dalam formulir atau URL, mereka bisa mendapatkan akses ilegal ke database, bahkan mengubah atau menghapus data.
Serangan ini biasanya menyerang website atau aplikasi yang menggunakan SQL untuk mengelola data tetapi tidak menerapkan langkah-langkah keamanan seperti prepared statements atau parameterized queries. Berikut adalah langkah-langkah umum bagaimana serangan SQL Injection bisa terjadi:
1. Penyerang Mengidentifikasi Celah Keamanan
Pertama, peretas mencari celah dalam sistem, seperti formulir login, kolom pencarian, atau parameter dalam URL yang secara langsung digunakan untuk menjalankan perintah SQL. Mereka mencoba berbagai input untuk melihat bagaimana sistem merespons.
2. Memasukkan Kode SQL Berbahaya
Setelah menemukan celah, peretas memasukkan perintah SQL berbahaya ke dalam input pengguna. Misal, jika website memiliki formulir login dengan perintah SQL berikut:
SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password’;
Jika inputnya tidak divalidasi dengan baik, penyerang bisa memasukkan sesuatu seperti ini:
‘admin’ OR ‘1’=’1′
Nantinya, query akan menjadi:
SELECT * FROM users WHERE username = ‘admin’ OR ‘1’=’1′ AND password = ‘$password’;
Karena ‘1’=’1‘ selalu bernilai benar, sistem akan memberikan akses tanpa perlu password yang valid.
3. Mengeksekusi Perintah SQL Berbahaya
Begitu berhasil masuk, peretas bisa menjalankan berbagai perintah tambahan, seperti membaca data pengguna, mengubah informasi akun, atau bahkan menghapus seluruh isi database. Sebagai contoh, jika seorang peretas ingin menghapus semua data pengguna, mereka bisa memasukkan perintah berikut:
DELETE FROM users;
4. Eksfiltrasi atau Penghancuran Data
Setelah berhasil mengeksploitasi celah, tujuan cyber crime ini bervariasi, mulai dari mencuri informasi sensitif, mendapatkan akses administratif, hingga merusak sistem database. Serangan ini bisa sangat merugikan, terutama bagi bisnis atau layanan yang menyimpan data pelanggan.
Apa Saja Contoh Serangan SQL Injection?
Serangan SQL Injection bisa dilakukan dalam berbagai cara tergantung pada bagaimana sistem menangani input pengguna. Berikut adalah contoh SQL Injection yang sering digunakan oleh peretas:
1. Classic SQL Injection (Union-Based SQL Injection)
Serangan ini terjadi ketika penyerang menggunakan perintah SQL UNION untuk menggabungkan hasil query yang berbeda dan mendapatkan informasi tambahan dari database. Misalnya, jika ada query seperti ini:
SELECT username, password FROM users WHERE username = ‘$username’;
Penyerang bisa memasukkan input seperti:
‘ UNION SELECT credit_card_number, expiry_date FROM credit_cards —
Sehingga query yang dieksekusi menjadi:
SELECT username, password FROM users WHERE username = ” UNION SELECT credit_card_number, expiry_date FROM credit_cards –‘;
Hasilnya, informasi kartu kredit yang ada dalam database bisa ditampilkan di layar.
2. Login Bypass (Authentication Bypass)
Serangan ini memungkinkan peretas masuk ke dalam akun tanpa perlu memasukkan kata sandi yang benar. Jika sistem login menggunakan query seperti ini:
SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password’;
Peretas bisa memasukkan input berikut ke dalam kolom username:
admin’ OR ‘1’=’1
Sehingga query yang dieksekusi menjadi:
SELECT * FROM users WHERE username = ‘admin’ OR ‘1’=’1′ AND password = ‘$password’;
Karena ‘1’=’1′ selalu bernilai benar, sistem akan memberikan akses tanpa perlu kata sandi yang valid.
3. Error-Based SQL Injection
Teknik ini memanfaatkan error yang ditampilkan oleh sistem untuk mendapatkan informasi struktur database. Misalnya, penyerang memasukkan input:
‘ OR 1=1 ORDER BY 10 —
Jika server memberikan error karena kolom ke-10 tidak ditemukan, peretas bisa menyimpulkan jumlah kolom yang ada dalam tabel tersebut.
4. Blind SQL Injection (Boolean-Based SQL Injection)
Serangan ini terjadi ketika sistem tidak menampilkan error, tetapi respons dari server bisa digunakan untuk menyimpulkan apakah query berhasil atau tidak. Jika sistem memiliki query seperti ini:
SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password’;
Peretas bisa mencoba input berikut:
admin’ AND ‘1’=’1
Jika halaman berhasil dimuat, berarti kondisi benar. Jika tidak, berarti salah. Dengan cara ini, peretas bisa menebak informasi dalam database.
5. Time-Based SQL Injection
Serangan ini digunakan ketika tidak ada error atau output yang bisa dimanfaatkan. Peretas memasukkan query yang memaksa database untuk menunggu sebelum memberikan respons. Misalnya, jika penyerang memasukkan input seperti ini:
admin’ OR IF(1=1, SLEEP(5), 0) –
Jika server membutuhkan waktu lebih lama untuk merespons, berarti injeksi berhasil dan database bisa dieksploitasi lebih lanjut.
6. Second-Order SQL Injection
Metode ini tidak langsung mengeksekusi perintah berbahaya, tetapi menyimpan kode SQL berbahaya yang nantinya akan digunakan dalam query lain. Misalnya, aplikasi menyimpan input pengguna tanpa validasi dan menggunakannya kembali nanti dalam query lain. Jika peretas memasukkan:
‘; DROP TABLE users; —
Saat data ini digunakan kembali dalam query SQL berikutnya, perintah DROP TABLE users akan dijalankan, yang bisa menghapus seluruh tabel pengguna.
7. Batched Query SQL Injection (Multiple Statement Execution)
Serangan ini terjadi ketika aplikasi mengizinkan eksekusi beberapa query dalam satu perintah. Misalnya, jika sistem menjalankan query tanpa validasi input:
SELECT * FROM users WHERE username = ‘$username’;
Peretas bisa memasukkan:
admin’; DROP TABLE orders; —
Sehingga query yang dieksekusi menjadi:
SELECT * FROM users WHERE username = ‘admin’; DROP TABLE orders; —
Hasilnya, tabel orders akan dihapus dari database.
Bagaimana Cara Mencegah Serangan SQL Injection?
SQL Injection adalah salah satu ancaman keamanan siber yang bisa merusak sistem database sebuah website atau aplikasi. Untuk melindungi sistem dari serangan ini, kamu harus menerapkan beberapa teknik keamanan yang efektif. Berikut adalah beberapa cara mencegah SQL Injection yang bisa kamu terapkan:
1. Gunakan Prepared Statements dengan Parameterized Queries
Cara paling efektif untuk mencegah SQL Injection adalah dengan menggunakan prepared statements dan parameterized queries. Teknik ini memastikan bahwa input pengguna tidak langsung dieksekusi sebagai perintah SQL, tetapi diperlakukan sebagai data biasa. Misalnya, jika kamu memiliki query seperti ini:
SELECT * FROM users WHERE username = ? AND password = ?
Parameter dalam query ini tidak bisa dimanipulasi oleh peretas karena mereka tidak dapat mengubah struktur SQL yang sudah ditentukan.
2. Gunakan ORM (Object-Relational Mapping)
Framework ORM seperti Hibernate (untuk Java), Sequelize (untuk Node.js), dan Eloquent (untuk Laravel) memungkinkan kamu untuk berinteraksi dengan database tanpa menulis query SQL secara langsung. Dengan menggunakan ORM, input pengguna akan secara otomatis sanitized sebelum digunakan dalam database.
Berikut adalah contoh ORM di Laravel:
$user = User::where(‘username’, $username)->first();
Dengan pendekatan ini, sistem akan lebih aman dibandingkan dengan menulis query SQL secara manual.
3. Validasi dan Filter Input dari Pengguna
Jangan pernah mempercayai input pengguna secara langsung. Pastikan untuk menerapkan validasi input sebelum data diproses. Beberapa teknik validasi yang bisa kamu gunakan:
- Batasi panjang input (misalnya, username maksimal 20 karakter).
- Gunakan whitelist untuk karakter yang diperbolehkan.
- Tolak input yang mengandung karakter mencurigakan seperti ‘, “, ;, dan –.
Misalnya, jika sebuah aplikasi hanya menerima angka sebagai input, pastikan hanya angka yang bisa dimasukkan.
4. Batasi Hak Akses ke Database
Jangan gunakan akun database dengan hak akses admin untuk menjalankan aplikasi. Sebaiknya, buat akun database dengan hak akses minimal yang hanya bisa membaca dan menulis data tertentu. Contohnya:
- Akun admin_db hanya boleh digunakan untuk operasi administratif.
- Akun app_db hanya memiliki izin SELECT dan INSERT tanpa hak DELETE atau DROP.
Dengan cara ini, jika terjadi serangan SQL Injection, dampaknya bisa diminimalisir karena akun aplikasi tidak memiliki hak untuk menghapus atau memodifikasi tabel kritis.
5. Nonaktifkan Eksekusi Multi-Statement Queries
Banyak sistem database modern memungkinkan eksekusi beberapa perintah SQL dalam satu query. Fitur ini bisa dieksploitasi oleh peretas dengan teknik batched query injection. Jika memungkinkan, nonaktifkan fitur ini di pengaturan database atau gunakan driver database yang tidak mendukung eksekusi multi-statement.
6. Gunakan Web Application Firewall (WAF)
Web Application Firewall (WAF) bisa membantu mendeteksi dan memblokir serangan SQL Injection sebelum mencapai server. WAF bekerja dengan memantau dan memfilter permintaan HTTP yang mencurigakan.
Beberapa WAF populer yang bisa kamu gunakan:
- ModSecurity (open-source WAF)
- Cloudflare WAF (layanan berbayar)
- Imperva WAF
Dengan WAF, request mencurigakan yang mengandung pola serangan SQL Injection bisa langsung diblokir.
7. Enkripsi atau Hashing Data Sensitif dalam Database
Jika seorang peretas berhasil mendapatkan akses ke database, mereka bisa mencuri data pengguna. Oleh karena itu, penting untuk mengenkripsi data sensitif seperti password dan informasi keuangan. Gunakan algoritma hashing yang kuat seperti bcrypt, Argon2, atau PBKDF2 untuk menyimpan password.
Contoh hashing password dengan bcrypt di PHP:
$hashed_password = password_hash($password, PASSWORD_BCRYPT);
Dengan metode ini, meskipun database bocor, password pengguna tetap tidak bisa digunakan oleh peretas.
8. Perbarui dan Patch Sistem Secara Berkala
Banyak serangan SQL Injection terjadi karena sistem yang digunakan masih memiliki celah keamanan lama yang belum diperbaiki. Pastikan kamu selalu:
- Menggunakan versi terbaru dari database management system (MySQL, PostgreSQL, dll.).
- Memperbarui framework dan library yang digunakan.
- Mengikuti informasi terbaru tentang keamanan dari vendor software yang digunakan.
Sudah Paham Apa itu SQL Injection & Contohnya?
SQL Injection adalah salah satu teknik serangan siber yang memungkinkan peretas mengeksploitasi celah dalam sistem database. Dengan teknik ini, peretas bisa mencuri, mengubah, atau menghapus data sensitif. Untuk mencegahnya, kamu perlu menerapkan prepared statements, validasi input, ORM, serta membatasi hak akses database. Selain itu, penggunaan Web Application Firewall (WAF) dan enkripsi data juga penting untuk meningkatkan keamanan sistem.
Agar aplikasi dan website kamu lebih aman dari serangan SQL Injection, kamu bisa gunakan Cloud VPS dari Nevacloud. Dengan performa tinggi, fleksibilitas, dan keamanan yang optimal, Cloud VPS Nevacloud membantu melindungi database serta meningkatkan stabilitas website kamu. Pilih infrastruktur yang aman dan andal untuk mencegah ancaman siber sejak dini!