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

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:

  1. 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".
  2. Ia mengetik potongan kecil SQL sebagai pengganti teks biasa. Contoh yang terkenal adalah mengetik ' OR '1'='1 di kolom kata sandi formulir login.
  3. 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".
  4. 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 berisikoKebiasaan yang lebih aman
Menyambungkan teks pengunjung langsung ke kueriMemakai prepared statement untuk setiap kueri
Satu akun database dengan hak penuh untuk semua halAkun terbatas untuk setiap bagian situs
Menampilkan error database lengkap di halamanPesan singkat untuk pengunjung, detail di log pribadi
Plugin yang berbulan-bulan tidak diperbaruiPembaruan rutin dan daftar jelas semua yang terpasang
Hanya menguji apakah fitur berjalanJuga 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?
Ini adalah trik ketika seseorang mengetik perintah database di formulir situs atau alamat web. Jika situs tidak memeriksa teks itu, database akan menjalankan perintahnya. Penyerang pun bisa membaca, mengubah, atau menghapus data.
Apakah situs kecil juga bisa terkena SQL injection?
Bisa. Sebagian besar serangan datang dari alat otomatis yang memindai situs secara acak, berapa pun ukurannya. Situs apa pun yang punya formulir, kotak pencarian, atau database di belakangnya bisa menjadi sasaran.
Bagaimana cara mengetahui apakah situs saya rentan terhadap SQL injection?
Cara paling aman adalah uji penetrasi atau pemindaian kerentanan oleh orang yang tahu apa yang harus dicari. Mereka mencoba serangan dengan aman dan memberi tahu halaman mana yang terbuka. Pesan error database yang aneh di halaman Anda juga merupakan tanda bahaya.
Apa cara terbaik untuk mencegah SQL injection?
Gunakan prepared statement, yang juga disebut kueri berparameter, untuk setiap kueri ke database. Cara ini memisahkan teks pengunjung dari perintah, sehingga database tidak pernah menjalankannya. Tambahkan juga pemeriksaan input, hak akses database yang terbatas, dan pembaruan rutin.
Apakah firewall bisa menghentikan SQL injection?
Web application firewall memblokir banyak pola serangan yang sudah dikenal dan menjadi lapisan tambahan yang baik. Namun, firewall tidak memperbaiki kode yang tidak aman di belakangnya, dan penyerang terus mencari cara untuk melewati filter. Kodenya sendiri tetap harus aman.
Apa itu blind SQL injection?
Ini adalah bentuk serangan ketika halaman tidak menampilkan data apa pun dari database. Penyerang mengajukan pertanyaan yang jawabannya ya atau tidak, lalu melihat bagaimana halaman berubah atau berapa lama halaman merespons. Cara ini lebih lambat, tetapi tetap bisa membongkar isi database.
Apa yang harus saya lakukan jika situs saya terkena SQL injection?
Hentikan serangannya atau matikan sementara bagian yang terdampak, lalu cari dan perbaiki kueri yang lemah. Ganti kata sandi dan kunci, periksa data apa saja yang dibaca atau diubah, dan pulihkan data yang bersih dari cadangan jika perlu. Tergantung hukum di tempat Anda beroperasi, Anda mungkin juga harus memberi tahu pelanggan.
Apakah SQL injection hanya masalah situs web?
Tidak. Aplikasi ponsel, program komputer, dan sistem apa pun yang mengirim teks dari pengguna ke database SQL bisa punya kelemahan yang sama. Di aplikasi, risikonya biasanya ada di API, yaitu koneksi yang dipakai aplikasi untuk berbicara dengan servernya.

Masih belum yakin bagaimana ini berlaku untuk proyek Anda?

Ceritakan apa yang sedang Anda bangun dan kami akan menjawab dengan bahasa sederhana.