Mengenal SQL Injection, Contoh Serangan dan Cara Mencegah - Rumah IT

Baru

recent

Mengenal SQL Injection, Contoh Serangan dan Cara Mencegah

Mengenal SQL Injection, Contoh Serangan dan Cara Mencegah

Menurut OWASP Serangan SQL Injection terdiri dari penyisipan atau "injeksi" kueri SQL melalui input data dari klien ke aplikasi. Eksploitasi injeksi SQL yang berhasil dapat membaca data sensitif dari database, memodifikasi data database (Sisipkan/Perbarui/Hapus), menjalankan operasi administrasi pada database (seperti mematikan DBMS), memulihkan konten file yang diberikan yang ada pada file DBMS sistem dan dalam beberapa kasus mengeluarkan perintah ke sistem operasi. Serangan injeksi SQL adalah jenis serangan injeksi, di mana perintah SQL disuntikkan ke input bidang data untuk memengaruhi eksekusi perintah SQL yang telah ditentukan sebelumnya.


Serangan injeksi SQL terjadi ketika:

  1. Data yang tidak diinginkan memasuki program dari sumber yang tidak dipercaya.
  2. Data digunakan untuk membuat kueri SQL secara dinamis

Konsekuensi Utama Serangan SQL Injection

1. Kerahasiaan
Karena database SQL umumnya menyimpan data sensitif, hilangnya kerahasiaan sering menjadi masalah dengan kerentanan SQL Injection.

2. Otentikasi
Jika perintah SQL yang buruk digunakan untuk memeriksa nama pengguna dan kata sandi, dimungkinkan untuk terhubung ke sistem sebagai pengguna lain tanpa mengetahui kata sandi sebelumnya.

3. Otorisasi
Jika informasi otorisasi disimpan dalam database SQL, dimungkinkan untuk mengubah informasi ini melalui keberhasilan eksploitasi kerentanan SQL Injection.

4. Integritas
Sama seperti mungkin untuk membaca informasi sensitif, juga memungkinkan untuk membuat perubahan atau bahkan menghapus informasi ini dengan serangan SQL Injection.

Model Ancaman SQL Injection

Pemodelan ancaman pada sql injection dibagi menjadi 3 kategori pemodelan, yaitu :
  1. Serangan injeksi SQL memungkinkan penyerang untuk memalsukan identitas, mengutak-atik data yang ada, menyebabkan masalah penolakan seperti membatalkan transaksi atau mengubah saldo, memungkinkan pengungkapan lengkap semua data pada sistem, menghancurkan data atau membuatnya tidak tersedia, dan menjadi administrator sistem. server basis data.
  2. SQL Injection sangat umum dengan aplikasi PHP dan ASP karena prevalensi antarmuka fungsional yang lebih lama. Karena sifat antarmuka program yang tersedia, aplikasi J2EE dan ASP.NET cenderung tidak mudah mengeksploitasi injeksi SQL.
  3. Tingkat keparahan serangan SQL Injection dibatasi oleh keterampilan dan imajinasi penyerang, dan pada tingkat yang lebih rendah, pertahanan dalam penanggulangan yang mendalam, seperti koneksi hak istimewa yang rendah ke server database dan sebagainya. Secara umum, pertimbangkan SQL Injection sebagai tingkat keparahan dampak yang tinggi.

Jenis-Jenis Serangan SQL Injection Beserta Contohnya

Ada berbagai macam kerentanan, serangan, dan teknik injeksi SQL, yang muncul dalam situasi yang berbeda. Beberapa contoh umum injeksi SQL meliputi:
  • Retrieving hidden data , dimana Anda dapat memodifikasi kueri SQL untuk mengembalikan hasil tambahan.
  • Subverting application logic , di mana Anda dapat mengubah kueri untuk mengganggu logika aplikasi.
  • UNION attacks , di mana Anda dapat mengambil data dari tabel database yang berbeda.
  • Examining the database , dimana Anda dapat mengekstraksi informasi tentang versi dan struktur basis data.
  • Blind SQL injection , di mana hasil kueri yang Anda kontrol tidak dikembalikan dalam respons aplikasi.

1. Retrieving hidden data

Pertimbangkan aplikasi belanja yang menampilkan produk dalam berbagai kategori. Saat pengguna mengklik kategori Hadiah, browser mereka meminta URL:

https://insecure-website.com/products?category=Gifts

Ini menyebabkan aplikasi membuat kueri SQL untuk mengambil detail produk yang relevan dari database:

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

Kueri SQL ini meminta database untuk mengembalikan:
  • semua rincian (*)
  • dari tabel produk
  • di mana kategorinya adalah Hadiah
  • dan dilepaskan adalah 1.
Pembatasan released = 1 digunakan untuk menyembunyikan produk yang tidak dirilis. Untuk produk yang belum dirilis, mungkin released = 0.

Aplikasi tidak menerapkan pertahanan apa pun terhadap serangan injeksi SQL, sehingga penyerang dapat membuat serangan seperti:

https://insecure-website.com/products?category=Gifts'--

Ini menghasilkan kueri SQL:

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

Kuncinya di sini adalah bahwa urutan tanda hubung ganda -- adalah indikator komentar dalam SQL, dan berarti bahwa kueri lainnya ditafsirkan sebagai komentar. Ini secara efektif menghapus sisa kueri, sehingga tidak lagi menyertakan AND released = 1. Artinya, semua produk ditampilkan, termasuk produk yang belum dirilis.

Lebih jauh lagi, penyerang dapat menyebabkan aplikasi menampilkan semua produk dalam kategori apa pun, termasuk kategori yang tidak mereka ketahui:

https://insecure-website.com/products?category=Gifts'+OR+1=1--

Ini menghasilkan kueri SQL:

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

2. Subverting application logic

Pertimbangkan aplikasi yang memungkinkan pengguna masuk dengan nama pengguna dan kata sandi. Jika pengguna memasukkan nama pengguna wiener dan kata sandi bluecheese, aplikasi akan memeriksa kredensial dengan melakukan kueri SQL berikut:

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

Jika kueri mengembalikan detail pengguna, maka login berhasil. Jika tidak, maka ditolak. Di sini, penyerang dapat masuk sebagai pengguna mana pun tanpa kata sandi hanya dengan menggunakan urutan komentar SQL -- untuk menghapus pemeriksaan kata sandi dari WHERE klausa kueri. Misalnya, mengirimkan nama pengguna administrator'-- dan kata sandi kosong akan menghasilkan kueri berikut:

SELECT * FROM users WHERE username = 'administrator'--' AND password = ''

Permintaan ini mengembalikan pengguna yang nama penggunanya administrator dan berhasil memasukkan penyerang sebagai pengguna itu.

3. Retrieving data from other database tables

Dalam kasus di mana hasil kueri SQL dikembalikan dalam respons aplikasi, penyerang dapat memanfaatkan kerentanan injeksi SQL untuk mengambil data dari tabel lain di dalam database. Ini dilakukan dengan menggunakan kata kunci UNION, yang memungkinkan Anda menjalankan kueri tambahan SELECT dan menambahkan hasilnya ke kueri awal.

Misalnya, jika aplikasi mengeksekusi kueri berikut yang berisi masukan pengguna "Gifts":

SELECT name, description FROM products WHERE category = 'Gifts'

maka penyerang dapat mengirimkan input:

' UNION SELECT username, password FROM users--

Query ini akan menyebabkan aplikasi mengembalikan semua nama pengguna dan kata sandi beserta nama dan deskripsi produk.

4. Examining the database

Mengikuti identifikasi awal dari kerentanan injeksi SQL, umumnya berguna untuk mendapatkan beberapa informasi tentang database itu sendiri. Informasi ini seringkali dapat membuka jalan untuk eksploitasi lebih lanjut.

Anda dapat menanyakan detail versi untuk database. Cara ini dilakukan bergantung pada tipe database, jadi Anda bisa menyimpulkan tipe database dari teknik mana pun yang berfungsi. Misalnya, di Oracle Anda dapat menjalankan:

SELECT * FROM v$version

Anda juga dapat menentukan tabel database apa yang ada, dan kolom mana yang ada di dalamnya. Misalnya, pada sebagian besar database, Anda dapat menjalankan kueri berikut untuk mencantumkan tabel:

SELECT * FROM information_schema.tables

5. Blind SQL injection vulnerabilities

Banyak contoh injeksi SQL adalah kerentanan buta. Ini berarti aplikasi tidak mengembalikan hasil kueri SQL atau detail kesalahan basis data apa pun dalam responsnya. Kerentanan buta masih dapat dieksploitasi untuk mengakses data yang tidak sah, tetapi teknik yang terlibat umumnya lebih rumit dan sulit dilakukan.

Bergantung pada sifat kerentanan dan database yang terlibat, teknik berikut dapat digunakan untuk mengeksploitasi kerentanan injeksi SQL buta:
  • Anda dapat mengubah logika kueri untuk memicu perbedaan yang dapat dideteksi dalam respons aplikasi bergantung pada kebenaran suatu kondisi. Ini mungkin melibatkan penyuntikan kondisi baru ke dalam beberapa logika Boolean, atau secara kondisional memicu kesalahan seperti pembagian dengan nol.
  • Anda dapat memicu penundaan waktu secara kondisional dalam pemrosesan kueri, memungkinkan Anda untuk menyimpulkan kebenaran kondisi berdasarkan waktu yang dibutuhkan aplikasi untuk merespons.
  • Anda dapat memicu interaksi jaringan out-of-band, menggunakan teknik OAST . Teknik ini sangat kuat dan bekerja dalam situasi di mana teknik lain tidak. Seringkali, Anda dapat langsung mengekstraksi data melalui saluran out-of-band, misalnya dengan menempatkan data ke dalam pencarian DNS untuk domain yang Anda kontrol.

Cara Mencegah SQL Injection

Satu-satunya cara pasti untuk mencegah serangan SQL Injection adalah validasi input dan kueri dengan parameter termasuk pernyataan yang disiapkan. Kode aplikasi tidak boleh menggunakan input secara langsung. Pengembang harus membersihkan semua input, tidak hanya input formulir web seperti formulir login. Mereka harus menghapus elemen kode berpotensi berbahaya seperti tanda kutip tunggal. Ini juga merupakan ide bagus untuk mematikan visibilitas kesalahan database di situs produksi Anda. Kesalahan database dapat digunakan dengan SQL Injection untuk mendapatkan informasi tentang database Anda.

Jika Anda menemukan kerentanan SQL Injection, misalnya menggunakan pemindaian Acunetix, Anda mungkin tidak dapat segera memperbaikinya. Misalnya, kerentanan mungkin dalam kode sumber terbuka. Dalam kasus seperti itu, Anda dapat menggunakan firewall aplikasi web untuk membersihkan input Anda untuk sementara.

Langkah 1: Latih dan pertahankan kesadaran

Untuk menjaga keamanan aplikasi web Anda, setiap orang yang terlibat dalam pembuatan aplikasi web harus menyadari risiko yang terkait dengan SQL Injections. Anda harus memberikan pelatihan keamanan yang sesuai untuk semua pengembang, staf QA, DevOps, dan SysAdmin Anda. Anda bisa mulai dengan merujuk mereka ke halaman ini.

Langkah 2: Jangan percaya masukan pengguna apa pun

Perlakukan semua input pengguna sebagai tidak tepercaya. Input pengguna apa pun yang digunakan dalam kueri SQL menimbulkan risiko Injeksi SQL. Perlakukan masukan dari pengguna yang diautentikasi dan/atau internal dengan cara yang sama seperti Anda memperlakukan masukan publik.

Langkah 3: Gunakan daftar putih, bukan daftar hitam

Jangan memfilter masukan pengguna berdasarkan daftar hitam. Penyerang yang cerdik hampir selalu menemukan cara untuk menghindari daftar hitam Anda. Jika memungkinkan, verifikasi dan filter input pengguna hanya menggunakan daftar putih yang ketat.

Langkah 4: Gunakan teknologi terbaru

Teknologi pengembangan web lama tidak memiliki perlindungan SQLi. Gunakan versi terbaru dari lingkungan pengembangan dan bahasa serta teknologi terbaru yang terkait dengan lingkungan/bahasa tersebut. Misalnya, dalam PHP gunakan PDO, bukan MySQLi.

Langkah 5: Gunakan Query Berparameter

Kueri berparameter dapat digunakan untuk situasi apa pun di mana input yang tidak dipercaya muncul sebagai data dalam kueri, termasuk klausa WHERE dan nilai dalam pernyataan INSERT atau UPDATE. Mereka tidak bisa digunakan untuk menangani masukan yang tidak dipercaya di bagian lain kueri, seperti nama tabel atau kolom, atau klausa ORDER BY. Fungsionalitas aplikasi yang menempatkan data yang tidak tepercaya ke dalam bagian kueri tersebut perlu mengambil pendekatan yang berbeda, seperti memasukkan nilai input yang diizinkan ke daftar putih, atau menggunakan logika yang berbeda untuk memberikan perilaku yang diperlukan.

Agar kueri berparameter efektif dalam mencegah injeksi SQL, string yang digunakan dalam kueri harus selalu berupa konstanta hard-coded, dan tidak boleh berisi data variabel apa pun dari asal mana pun. Jangan tergoda untuk memutuskan kasus per kasus apakah item data dipercaya, dan terus gunakan penggabungan string dalam kueri untuk kasus yang dianggap aman. Terlalu mudah untuk membuat kesalahan tentang kemungkinan asal data, atau untuk perubahan kode lain yang melanggar asumsi tentang data apa yang tercemar.

Kode berikut rentan terhadap injeksi SQL karena input pengguna digabungkan langsung ke dalam kueri:

String query = "SELECT * FROM products WHERE category = '"+ input + "'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);

Kode ini dapat dengan mudah ditulis ulang dengan cara yang mencegah input pengguna mengganggu struktur kueri:

PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");
statement.setString(1, input);
ResultSet resultSet = statement.executeQuery();

Referensi :
1. https://owasp.org/www-community/attacks/SQL_Injection
2. https://portswigger.net/web-security/sql-injection
3. https://www.acunetix.com/websitesecurity/sql-injection/
All Rights Reserved by Rumah IT - Rumah Teknologi Informasi © 2013 - 2022
Powered By Blogger

Contact Form

Name

Email *

Message *

Powered by Blogger.