SQL Injection SQLi
Serangan web ketika seseorang mengetik perintah database di formulir atau alamat web, lalu situs menjalankannya sehingga data yang seharusnya dilindungi bisa terlihat, berubah, atau terhapus.
Juga dikenal sebagai SQLi injeksi SQL serangan SQL injection injeksi kode SQL injeksi database serangan injeksi
Definisi
Apa itu SQL injection
Anda punya toko online. Seorang pengunjung mengetik sesuatu yang aneh di kotak pencarian, menekan Enter, lalu halaman menampilkan nama, nomor telepon, dan riwayat pesanan semua pelanggan Anda. Tidak ada yang mencuri kata sandi. Ia hanya mengetik kata-kata yang tepat di tempat yang salah, dan situs Anda mengerjakan sisanya. Itulah SQL injection.
Sebagian besar situs menyimpan informasinya di dalam database: gudang tabel yang tertata rapi, mirip kumpulan lembar spreadsheet. Untuk membaca atau mengubah informasi itu, situs memakai bahasa bernama SQL (Structured Query Language). Setiap permintaan yang dikirimnya disebut kueri, misalnya "cari pelanggan yang memakai email ini".
SQL injection terjadi ketika situs mengambil apa yang diketik pengunjung dan menempelkannya begitu saja ke dalam salah satu kueri tersebut. Jika pengunjung mengetik SQL alih-alih teks biasa, database tidak bisa membedakannya dan menjalankan perintah penyerang seolah-olah situs sendiri yang menulisnya. Banyak orang menyingkat namanya menjadi SQLi.
Bagaimana serangan SQL injection bekerja
Bayangkan seorang petugas bank yang meneruskan setiap catatan dari nasabah, kata demi kata, kepada petugas ruang brankas. Catatan biasa berbunyi "tolong tunjukkan saldo saya". Catatan yang licik berbunyi "tolong tunjukkan saldo saya, dan sekalian buka semua brankas". Jika petugas tidak pernah membaca catatan itu lebih dulu, petugas brankas akan menurutinya.
Di sebuah situs, langkah-langkahnya biasanya seperti ini:
- Penyerang mencari tempat yang mengirim teks ke database: formulir login, kotak pencarian, formulir kontak, atau alamat web itu sendiri, seperti halaman produk yang berakhiran "?id=25".
- Ia mengetik potongan kecil SQL sebagai pengganti teks biasa. Contoh yang terkenal adalah mengetik ' OR '1'='1 di kolom kata sandi formulir login.
- Situs menyambungkan teks itu ke kuerinya sendiri tanpa memeriksanya. Sekarang kueri itu kira-kira berbunyi "izinkan orang ini masuk jika kata sandinya benar, atau jika 1 sama dengan 1".
- Karena 1 selalu sama dengan 1, database menjawab ya, dan penyerang berhasil masuk tanpa tahu kata sandi apa pun.
Ada serangan yang lebih diam-diam. Pada blind SQL injection, halaman sama sekali tidak menampilkan data. Karena itu, penyerang mengajukan pertanyaan ya atau tidak kepada database dan memperhatikan reaksi halaman, atau berapa lama halaman dimuat. Jika dikerjakan manual, ini pekerjaan yang lambat, jadi penyerang memakai alat otomatis gratis untuk melakukannya.
Apa yang bisa dilakukan penyerang
Begitu database mengikuti perintahnya, besar kerusakan bergantung pada apa saja yang boleh dilakukan akun database milik situs. Sering kali, hak aksesnya jauh lebih besar dari yang dibutuhkan situs. Penyerang mungkin bisa:
- membaca data pribadi, seperti nama, alamat, email, dan riwayat pesanan pelanggan, rekam medis, atau kata sandi yang tersimpan
- masuk sebagai pengguna lain, termasuk admin
- mengubah data, seperti harga, saldo, atau status pesanan
- menghapus seluruh tabel, atau seluruh database
- pada beberapa pengaturan, mencapai server itu sendiri dan menaruh file berbahaya di sana
Mengapa ini penting bagi bisnis Anda
SQL injection adalah salah satu serangan web tertua, dan sampai sekarang masih ada. OWASP, komunitas terbuka yang menerbitkan daftar terkenal OWASP Top 10 tentang risiko aplikasi web, sudah bertahun-tahun memasukkan injection ke dalam daftar itu. Serangan ini mudah dicoba, dan banyak situs masih punya satu formulir terlupakan yang bisa ditembus.
Bagi pemilik bisnis, kerugian sebenarnya jarang bersifat teknis. Wujudnya bisa berupa daftar pelanggan yang bocor, toko yang menjual dengan harga salah, sistem pemesanan yang kehilangan janji temu selama seminggu, atau pesan yang harus Anda kirim kepada pelanggan bahwa data mereka terbuka. Di banyak negara, undang-undang perlindungan data seperti GDPR juga mewajibkan Anda melindungi data pribadi dan melaporkan kebocoran.
Apakah setiap formulir di situs Anda dibuat dengan memikirkan risiko ini? Situs yang disusun terburu-buru dari plugin lama, atau diubah oleh banyak tangan selama bertahun-tahun, lebih mungkin menyembunyikan titik lemah.
Cara melindungi situs dari SQL injection
Solusi utamanya sudah dikenal luas, dan solusi itu berhasil. Sebagian besar perlindungan ada pada cara situs dibangun, jadi berikut pertanyaan yang baik untuk diajukan kepada developer atau penyedia layanan Anda.
- Prepared statement. Disebut juga kueri berparameter. Situs mengirim kueri dan teks pengunjung secara terpisah, sehingga database selalu memperlakukan teks itu sebagai data biasa dan tidak pernah sebagai perintah. Inilah pertahanan utama. Framework modern seperti Laravel melakukannya secara bawaan ketika developer memakai alat database yang sudah tersedia di dalamnya.
- Pemeriksaan input. Kolom nomor telepon seharusnya hanya menerima angka, dan kolom tanggal hanya menerima tanggal. Menolak input yang aneh sejak awal menutup banyak pintu.
- Hak akses minimum. Akun yang dipakai situs untuk mengakses database seharusnya hanya punya hak yang dibutuhkan. Halaman pencarian publik tidak punya alasan untuk menghapus tabel.
- Pesan error yang tidak banyak bicara. Pesan error database yang terperinci di layar sama saja memberi peta kepada penyerang. Tampilkan pesan yang singkat dan sederhana kepada pengunjung, dan simpan detailnya di log pribadi.
- Pembaruan. Selalu perbarui platform, plugin, dan library, karena versi lama sering punya celah yang sudah diketahui.
- Web application firewall. Ini adalah filter di depan situs yang memblokir banyak pola serangan yang sudah dikenal sebelum mencapai kode Anda. Firewall membantu, tetapi tidak memperbaiki kode yang tidak aman.
- Pengujian rutin. Uji penetrasi (serangan yang aman dan terencana oleh para ahli) dan pemindaian kerentanan menemukan titik lemah sebelum penyerang menemukannya.
Berikut perbandingan beberapa kebiasaan sehari-hari:
| Kebiasaan berisiko | Kebiasaan yang lebih aman |
|---|---|
| Menyambungkan teks pengunjung langsung ke kueri | Memakai prepared statement untuk setiap kueri |
| Satu akun database dengan hak penuh untuk semua hal | Akun terbatas untuk setiap bagian situs |
| Menampilkan error database lengkap di halaman | Pesan singkat untuk pengunjung, detail di log pribadi |
| Plugin yang berbulan-bulan tidak diperbarui | Pembaruan rutin dan daftar jelas semua yang terpasang |
| Hanya menguji apakah fitur berjalan | Juga menguji apa yang terjadi saat seseorang mengetik sesuatu yang berbahaya |
Kesalahan yang sering terjadi
- Memercayai pemeriksaan di browser. Pemeriksaan yang berjalan di perangkat pengunjung sendiri mudah dilewati, jadi server harus memeriksa semuanya sekali lagi.
- Mengira situs kecil itu aman. Alat otomatis memindai sangat banyak situs tanpa peduli ukurannya.
- Memperbaiki satu formulir dan melupakan yang lain. Kotak pencarian, filter, alamat web, dan API di balik aplikasi ponsel semuanya butuh perhatian yang sama.
- Menyimpan kata sandi sebagai teks biasa. Jika data bocor, kata sandi yang disimpan dengan hash yang kuat (diubah menjadi kode acak yang tidak bisa dibaca kembali) jauh lebih sulit disalahgunakan.
- Hanya mengandalkan firewall. Filter memberi Anda waktu. Kueri tidak aman di belakangnya tetap harus diperbaiki.
Bagaimana kami bisa membantu
Di Linkysoft, pengujian SQL injection adalah bagian dari layanan keamanan siber kami. Kami melakukan serangan simulasi yang aman pada situs, aplikasi, dan API Anda, meninjau kodenya, lalu memberi Anda daftar dalam bahasa sederhana tentang apa yang kami temukan dan cara memperbaikinya. Setelah perbaikan, kami menguji lagi. Layanan ini juga berlaku untuk situs yang dibuat tim lain, dan pemeriksaan keamanan gratis adalah langkah pertama yang mudah.
Sedang merencanakan sistem baru? Aplikasi web dan sistem manajemen kami aman sejak dirancang, dengan penguatan sesuai OWASP Top 10 dan uji penetrasi sebelum diluncurkan.
Pertanyaan tentang SQL Injection
Apa itu SQL injection dengan kata-kata sederhana?
Apakah situs kecil juga bisa terkena SQL injection?
Bagaimana cara mengetahui apakah situs saya rentan terhadap SQL injection?
Apa cara terbaik untuk mencegah SQL injection?
Apakah firewall bisa menghentikan SQL injection?
Apa itu blind SQL injection?
Apa yang harus saya lakukan jika situs saya terkena SQL injection?
Apakah SQL injection hanya masalah situs web?
Masih belum yakin bagaimana ini berlaku untuk proyek Anda?
Ceritakan apa yang sedang Anda bangun dan kami akan menjawab dengan bahasa sederhana.