Apa itu Injeksi SQL? Cara Mencegah Serangan SQLi
Diterbitkan: 2023-09-15Aplikasi web memperkuat pengalaman online kami hari demi hari. Kami terhubung, berinteraksi, berbelanja, dan menonton video kucing lucu – semuanya menggunakan aplikasi web. Mereka memberikan layanan bisnis yang penting dan menyimpan data sensitif, namun semakin sering kita menggunakan sesuatu, semakin rentan terhadap serangan.
Salah satu serangan siber yang harus diwaspadai pada aplikasi yang mengeksploitasi kerentanan dalam bahasa kueri terstruktur (SQL) adalah injeksi SQL yang umum dan berbahaya.
Apa itu injeksi SQL?
Injeksi SQL (SQLi) adalah teknik injeksi kode berbahaya yang digunakan penyerang dunia maya untuk mengeksploitasi kerentanan dalam aplikasi web. Mereka memanfaatkan titik lemah untuk mendapatkan akses tidak sah dengan menambahkan serangkaian kode berbahaya ke kueri database.
Serangan injeksi SQL menyebabkan akses data yang tidak tepat, manipulasi, pencurian identitas, kerugian finansial, kerusakan reputasi, dan konsekuensi hukum. Pengembang dan organisasi harus memahami risikonya dan menerapkan langkah-langkah keamanan penuh. Alat seperti perangkat lunak firewall aplikasi web (WAF) dan perangkat lunak forensik digital dirancang untuk melindungi dari serangan injeksi SQL. Bisnis juga dapat bergantung pada rangkaian keamanan situs web yang komprehensif untuk melindungi aplikasi mereka.
Baca lembar contekan injeksi SQL ini untuk mengetahui bagaimana serangan SQL dieksekusi beserta contohnya, variasinya, dan cara mencegah serangan tersebut.
Mengapa serangan injeksi SQL berbahaya?
Injeksi SQL telah masuk dalam daftar 10 besar risiko keamanan aplikasi web Open Worldwide Application Security Project (OWASP) selama bertahun-tahun. Pada tahun 2022 saja, OWASP menemukan 274.000+ kemunculan beberapa bentuk injeksi pada aplikasi yang mereka uji; Injeksi SQL dan skrip lintas situs (XSS) adalah yang paling umum.
Penyerang dapat menggunakan suntikan SQl untuk menyebabkan:
- Kesalahan dalam aplikasi web dengan mengubah atau menghapus informasi dalam database.
- Pelanggaran data jika peretas mendapatkan akses tidak sah ke data sensitif yang disimpan dalam basis data, seperti informasi pribadi, catatan keuangan, atau kata sandi.
- Sistem yang dikompromikan dengan mengakses sistem tambahan yang tidak sah yang menggunakan database bersama yang sama. Hal ini memungkinkan penyerang untuk meningkatkan serangannya ke sistem lain di jaringan yang sama atau melakukan penolakan layanan terdistribusi (DDoS).
Tindakan destruktif ini menimbulkan kerugian yang tidak dapat diperbaiki lagi bagi dunia usaha. Pelanggaran tersebut membahayakan privasi dan integritas data, sehingga menyebabkan hilangnya kepercayaan pelanggan dan reputasi bisnis. Hal ini juga menambah beban keuangan bagi perusahaan yang menghadapi dampaknya.
Contoh serangan injeksi SQL di kehidupan nyata
Sudah lebih dari dua dekade sejak injeksi SQL pertama kali hadir. Dua puluh tahun kemudian, hal ini tetap menjadi terkenal, sebagaimana dibuktikan oleh insiden injeksi SQL yang menonjol berikut ini.
- Sistem Pembayaran Heartland: Pada tahun 2008, Sistem Pembayaran Heartland mengalami salah satu pelanggaran data terbesar dalam sejarah, mengekspos lebih dari 130 juta rincian kartu kredit dan debit melalui serangan SQLi. Heartland membayar denda jutaan.
- Yahoo : Pada tahun 2012, serangan injeksi SQL membahayakan hampir 5 juta detail akun pengguna Yahoo, termasuk alamat email dan kata sandi.
- Freepik: Peretas mencuri email dan kata sandi 8,3 juta pengguna Freepik dan Flaticon pada tahun 2020 selama serangan injeksi SQL terhadap situs web Flaticon perusahaan.
- WooCommerce: Plugin WordPress yang populer memperbaiki kerentanan injeksi SQL yang menyebabkan 5 juta situs terkena pencurian data.
- BillQuick: Penjahat dunia maya mengeksploitasi kerentanan SQL buta di platform penagihan populer untuk menyebarkan ransomware.
- MOVEit: Pada bulan Mei 2023, geng ransomware Cl0p menggunakan kerentanan injeksi SQL dalam perangkat lunak transfer file terkelola MOVEit, yang memengaruhi lebih dari 1.000 organisasi dan setidaknya 60 juta individu, menjadikannya pelanggaran data terbesar pada tahun ini sejauh ini.
Bagaimana cara kerja serangan injeksi SQL?
Mari kita lihat dasar-dasar database dan query SQL yang kita gunakan dalam aplikasi web modern. Ini akan membantu kita memahami cara kerja injeksi SQL dengan lebih baik.
Semua situs web menggunakan database relasional, juga disebut database SQL, untuk menyimpan data tentang pengguna dan aplikasinya. Bisa berupa info pengguna, kredensial login, informasi pembayaran, atau apa pun tentang perusahaan. Ambil situs web e-niaga, misalnya. Ini menyimpan data produk, akun pengguna, data pesanan, dan informasi pembayaran dalam databasenya.
Situs web kemudian mengambil data dari database ini dan mengirimkan konten atau layanan khusus kepada pengguna. Proses ini terjadi berkat SQL, bahasa pemrograman standar yang digunakan untuk mengelola database. Kapan pun Anda perlu mendapatkan sesuatu dari suatu aplikasi, katakanlah riwayat pembelian Anda, sebenarnya Anda membuat permintaan ke database menggunakan kueri SQL, sebuah perintah yang menginstruksikan database untuk melakukan tindakan tertentu.
Dalam upaya membuat interaksi web lancar, banyak situs web mengizinkan pengguna memasukkan data untuk membuat kueri SQL. Ini dapat mencakup hal-hal seperti istilah penelusuran, nama pengguna, atau detail pembayaran.
Perhatikan contoh situs web e-niaga. Kueri SQL sederhana untuk menampilkan riwayat pesanan Anda dari database dengan tabel "pesanan" (o) dan tabel "produk" (p) adalah sebagai berikut:
PILIH o.id_pesanan, o.tanggal_pesanan, hal.nama_produk, hal.harga
DARI pesanan o
GABUNG produk p ON o.product_id = p.product_id
DIMANA o.user_id = 12345;
Kode SQL ini mengambil ID pesanan dan tanggal dari tabel pesanan, bersama dengan nama produk dan harga dari tabel produk untuk USER ID 12345 dari database situs web. Biasanya, ID akan didasarkan pada masukan dari pengguna. Masalah muncul ketika masukan tidak diperiksa dan dikontrol dengan benar. Penyerang mengeksploitasi kerentanan ini untuk melakukan serangan injeksi SQL.
Beginilah biasanya hal itu terungkap.
- Identifikasi kolom masukan yang rentan: Penyerang memulai dengan menemukan kolom masukan pada aplikasi web tempat mereka berpotensi memasukkan kode berbahaya. Mereka mengirimkan nilai yang berbeda dan melihat bagaimana respons aplikasi. untuk mengetahui apakah. Jika aplikasi tidak memvalidasi atau membersihkan input pengguna dengan benar, aplikasi akan memproses inputnya sebagai kode SQL. Potensi kerentanan ini digunakan untuk injeksi kode.
- Injeksi kode melalui masukan pengguna: Setelah memahami cara aplikasi menangani masukan, penyerang membuat payload, yang merupakan bagian kode SQL berbahaya yang memanfaatkan kerentanan. Ini termasuk menambahkan karakter kontrol SQL seperti tanda kutip tunggal ('), tanda kutip ganda (“), atau sama dengan (=) untuk mengubah struktur kueri SQL. Menggunakan karakter kontrol ini dengan perintah SQL umum seperti SELECT dan FROM memungkinkan penyerang mengakses atau mengambil data dari server database.
Mereka kemudian mengirimkan masukan yang dibuat khusus bersama dengan permintaan yang sah, mengelabui aplikasi agar memperlakukan kode teduh sebagai bagian sah dari kueri. - Eksekusi: Basis data, yang tidak menyadari serangan tersebut, memproses kueri dan mengeksekusi kode yang dimasukkan seolah-olah itu adalah permintaan yang sah.
- Eksploitasi: Bergantung pada niat penyerang, kode SQL yang disuntikkan mungkin mengambil data sensitif, mengubah atau menghapus informasi, atau bahkan memberikan akses tidak sah. Hal ini membahayakan keamanan aplikasi, dan berpotensi mengungkap informasi sensitif.
Contoh injeksi SQL
Pertimbangkan aplikasi web yang menggunakan parameter URL untuk mengambil detail produk berdasarkan ID produk, seperti ini:
http://example.com/products?id=1
Penyerang mungkin mencoba memasukkan kode SQL berbahaya yang menyebabkan kesalahan dan mengambil informasi seperti ini: http://example.com/products?id=1' OR 1=1; –
Jika aplikasi gagal memvalidasi dan membersihkan input pengguna secara memadai, kueri SQL dapat dimanipulasi sebagai berikut:
PILIH * DARI produk DIMANA ATAU 1=1; - - ';
Dalam kasus ini, kueri asli dirancang untuk mengambil produk dengan ID 1, namun masukan penyerang mengubah kueri untuk mengembalikan semua produk karena penambahan 1=1 dan tanda hubung ganda yang ditambahkan (- -). Ini membatalkan kutipan tunggal penutup asli dan menyebabkan konsekuensi menampilkan semua detail produk atau mengungkapkan pesan kesalahan yang dapat dieksploitasi oleh penyerang.
33%
kerentanan kritis aplikasi web pada tahun 2022 disebabkan oleh injeksi SQL.
Sumber: Statista
Meluasnya prevalensi kerentanan SQL dan daya tarik database aplikasi web dengan semua data penting bisnisnya menjadikan injeksi SQL sebagai salah satu serangan siber yang paling persisten.
Sumber: Spiceworks
Jenis serangan injeksi SQL
Ada tiga jenis utama serangan injeksi SQL berdasarkan cara penyerang mengambil informasi atau berinteraksi dengan database:
- SQLi klasik atau in-band
- SQLi buta atau inferensial
- SQLi di luar band
1. SQLi klasik atau in-band
In-band adalah jenis serangan injeksi SQL yang paling umum. Peretas klasik menggunakan saluran komunikasi yang sama (in-band) untuk memasukkan kode SQL berbahaya dan mengambil hasilnya. Dua variasi utama SQLi in-band adalah:
SQLi in-band berbasis serikat pekerja
Serangan ini memanfaatkan operator UNION SQL, yang digunakan untuk menggabungkan data dari hasil dua atau lebih pernyataan SELECT. Dengan melakukan ini, penyerang dapat mengambil data dari tabel yang tidak dapat mereka akses langsung.
SQLi in-band berbasis kesalahan
Dalam teknik ini, penyerang dengan sengaja memicu kesalahan dalam kueri SQL untuk mengeksploitasi pesan kesalahan yang dikembalikan oleh database. Kesalahan dapat mengungkapkan informasi berharga tentang struktur database, nama tabel, nama kolom, dan terkadang data itu sendiri. SQLi berbasis kesalahan juga dapat dijalankan sebagai SQLi out-of-the-band.
2. SQLi inferensial (buta).
Dalam SQLi buta, penyerang tidak dapat melihat secara langsung hasil serangannya. Sebaliknya, mereka menyimpulkan informasi dengan mengamati perilaku aplikasi atau pesan kesalahan yang merespons pertanyaan mereka. Jenis serangan ini memakan waktu lama karena peretas harus membuat serangkaian kueri SQL untuk menemukan potensi kerentanan untuk dieksploitasi. Dua variasi SQLi buta adalah:
SQLi buta berbasis waktu
Di sini, penyerang menanyakan pertanyaan yang membuat database menunda responsnya sebelum bereaksi. Mereka menyimpulkan informasi tentang database dengan memperhatikan waktu respon.
SQLi buta Boolean
Untuk Boolean blind SQLi, penyerang memanfaatkan cara aplikasi merespons kondisi benar atau salah dalam kueri SQL. Berdasarkan respons aplikasi web, mereka menyimpulkan informasi tentang database, meskipun tidak ada data dari database yang dikembalikan.
3. SQLi di luar band
Serangan SQLi out-of-the-band menyebabkan aplikasi mengirim data ke titik akhir jarak jauh yang dikendalikan oleh peretas. Serangan seperti ini memerlukan server SQL untuk memiliki fitur tertentu, seperti kemampuan untuk memulai permintaan jaringan eksternal seperti permintaan Hypertext Transfer Protocol (HTTP).
Cara mencegah serangan injeksi SQL: lembar contekan
Mencegah injeksi SQL memerlukan pendekatan berlapis yang melibatkan praktik pengkodean aman dan pemantauan berkelanjutan. Berikut adalah lembar contekan dengan langkah-langkah penting untuk membantu Anda tetap aman dari serangan injeksi SQL.
Gunakan pernyataan yang sudah disiapkan
Pertahanan utama terhadap serangan injeksi SQL adalah menyiapkan pernyataan dengan kueri berparameter. Pernyataan yang disiapkan memastikan masukan pengguna diperlakukan sebagai data, bukan kode yang dapat dieksekusi.
Pengembang mengkompilasi kode SQL untuk kueri terlebih dahulu sebagai templat dengan placeholder untuk nilai masukan dari pengguna. Pada waktu eksekusi kueri, pernyataan yang disiapkan mengikat nilai aktual, bukan placeholder. Ini menghentikan eksekusi kode berbahaya.
Pernyataan yang disiapkan lebih disukai daripada pernyataan SQL dinamis. Mereka menulis query SQL selama waktu eksekusi, yang melemahkan mereka terhadap serangan injeksi.
Pernyataan yang disiapkan dalam bahasa pemrograman populer:
Berikut adalah rekomendasi khusus bahasa untuk menggunakan pernyataan yang telah disiapkan (kueri berparameter) dalam pemrograman database populer:
- Java enterprise edition (EE): Gunakan kelas PreparedStatement dari paket java.sql. Ikat parameter menggunakan metode seperti setString , setInt , dll.
- Python (SQLite3) : Gunakan placeholder ( ? ) dalam kueri. Ikat parameter menggunakan tuple atau list .
- PHP: Gunakan ekstensi objek data PHP (PDO) . Gunakan pernyataan yang telah disiapkan dengan placeholder (:). Ikat parameter dengan bindValue atau bindParam .
- .NET : Gunakan objek MySqlCommand . Ikat parameter menggunakan Parameters.AddWithValue .
Metode pencegahan injeksi SQL lainnya adalah penggunaan prosedur tersimpan atau sekelompok kode SQL yang telah dikompilasi sebelumnya yang dapat digunakan berulang kali.
Praktek validasi masukan
Validasi masukan melibatkan pemeriksaan masukan pengguna untuk memastikannya memenuhi kriteria tertentu sebelum diproses. Daftar yang diizinkan, juga dikenal sebagai daftar putih, adalah aspek penting dalam validasi masukan. Di sini, hanya nilai atau pola aman yang telah ditentukan sebelumnya yang diterima sebagai bagian dari kueri SQL. Masukan apa pun yang tidak sesuai dengan kriteria yang ditetapkan akan ditolak. Hal ini secara aktif mencegah masukan berbahaya atau tidak terduga memasuki sistem.
Gunakan pustaka pemetaan relasional objek
Pustaka pemetaan relasional objek (ORM) adalah alat berharga bagi pengembang yang bekerja dengan database relasional. Mereka membiarkan pengembang berinteraksi dengan database menggunakan bahasa pemrograman pilihan mereka, dan dengan demikian mengurangi kebutuhan untuk menulis query SQL mentah. Pustaka ORM memberikan perlindungan bawaan terhadap serangan injeksi SQL.
Latih pengembang dan tim TI tentang praktik pengkodean yang aman. Pastikan untuk melakukan audit keamanan rutin dan pengujian penetrasi untuk menemukan kerentanan.
Tip: Bantu pemrogram dan pengembang Anda mempelajari pengkodean aman lebih cepat dengan alat pelatihan kode aman.
Menerapkan prinsip hak istimewa terkecil
Prinsip hak istimewa paling rendah hanya memberi pengguna database izin minimum yang diperlukan untuk melakukan pekerjaan mereka. Mengikuti prinsip ini akan mengurangi dampak potensi serangan injeksi SQL, atau serangan siber apa pun. Juga, terapkan kontrol akses yang ketat ke database Anda.
Menyebarkan firewall aplikasi web (WAF)
WAF memonitor lalu lintas jaringan aplikasi yang masuk dan memblokir potensi lalu lintas berbahaya berdasarkan daftar tanda serangan yang terkenal.
5 alat firewall aplikasi web (WAF) teratas:
- Firewall Aplikasi Web Azure
- AWSWAF
- Firewall Aplikasi Web Imperva (WAF)
- Spektrum Awan Flare
- Firewall Aplikasi Web Symantec dan Proksi Terbalik
* Di atas adalah lima solusi WAF terkemuka dari Laporan Grid Musim Panas 2023 G2.
WAF menggunakan aturan yang telah ditentukan sebelumnya untuk mendeteksi pola mencurigakan dan anomali dalam lalu lintas masuk, seperti kata kunci SQL dan muatan berbahaya. Ini membersihkan dan memvalidasi masukan pengguna dan memblokir atau memfilter permintaan berbahaya. Ini membantu menghentikan kueri SQL berbahaya saat memasuki sistem.
WAF modern beradaptasi dengan metode serangan baru menggunakan pembelajaran mesin.
Alat keamanan lainnya untuk mencegah serangan injeksi SQL
Selain WAF, beberapa platform keamanan lainnya menghambat serangan injeksi SQL.
- Pemindai kerentanan mencari kerentanan yang diketahui dan tidak diketahui dalam aplikasi web.
- Alat pengujian keamanan aplikasi statis (SAST) dan perangkat lunak analisis kode statis menemukan kerentanan keamanan tanpa benar-benar mengeksekusi kode.
- Perangkat lunak pengujian keamanan aplikasi dinamis mensimulasikan serangan terhadap aplikasi yang berjalan dan mengidentifikasi kelemahan.
- Sistem deteksi dan pencegahan intrusi serta perangkat lunak forensik digital menyelidiki anomali dan serangan terhadap aplikasi secara real-time.
Jagalah benteng data Anda
Serangan injeksi SQL menimbulkan ancaman besar terhadap keamanan aplikasi web. Perusahaan berisiko kehilangan data berharga, privasi pengguna, dan reputasi baik mereka jika serangan berhasil.
Meskipun tidak ada solusi tunggal yang menjamin keamanan mutlak terhadap injeksi SQL, menggabungkan tindakan pencegahan yang kita bicarakan di sini secara signifikan mengurangi kemungkinan serangan. Pengembang web dan administrator basis data harus menerapkan pertahanan yang ketat dan memperkuat aplikasi web mereka terhadap potensi eksploitasi.
Ingin solusi komprehensif untuk mengamankan situs web Anda? Jelajahi perangkat lunak keamanan web dan bagaimana perangkat lunak tersebut membantu melawan serangan cyber yang mengarah pada pelanggaran data.