APA ITU SQL INJECTION

 

Halo assalamu alaikum dan selamat datang di tutorial saya pendigan.

Di bagian ini, saya akan menjelaskan apa itu injeksi SQL, menjelaskan beberapa contoh umum, menjelaskan cara menemukan dan mengeksploitasi berbagai jenis kerentanan injeksi SQL, dan meringkas cara mencegah injeksi SQL.

Injeksi SQL

Apa itu injeksi SQL (SQLi)?

Injeksi SQL adalah kerentanan keamanan web yang memungkinkan penyerang mengganggu kueri yang dibuat aplikasi ke database-nya. Biasanya memungkinkan penyerang untuk melihat data yang biasanya tidak dapat mereka ambil, Ini mungkin termasuk data milik pengguna lain, atau data lain yang dapat diakses oleh aplikasi itu sendiri. Dalam banyak kasus, penyerang dapat mengubah atau menghapus data ini, menyebabkan perubahan terus-menerus pada konten atau perilaku aplikasi.

Dalam beberapa situasi, penyerang dapat meningkatkan serangan injeksi SQL untuk mengganggu server yang mendasarinya atau infrastruktur back-end lainnya, atau melakukan serangan penolakan layanan

Apa dampak dari serangan injeksi SQL yang berhasil?

Serangan injeksi SQL yang berhasil dapat mengakibatkan akses tidak sah ke data sensitif, seperti sandi, detail kartu kredit, atau informasi pribadi pengguna. Banyak pelanggaran data profil tinggi dalam beberapa tahun terakhir adalah hasil dari serangan injeksi SQL, yang menyebabkan kerusakan reputasi dan denda peraturan. Dalam beberapa kasus, penyerang dapat memperoleh pintu belakang yang terus-menerus ke dalam sistem organisasi, yang mengarah ke kompromi jangka panjang yang dapat luput dari perhatian untuk waktu yang lama.

Contoh injeksi SQL

Ada berbagai macam kerentanan, serangan, dan teknik injeksi SQL, yang muncul dalam situasi yang berbeda. Beberapa contoh injeksi SQL yang umum meliputi:

  • Mengambil data tersembunyi, di mana Anda bisa mengubah kueri SQL untuk mengembalikan hasil tambahan.
  • Menumbangkan logika aplikasi, di mana Anda bisa mengubah kueri untuk mengganggu logika aplikasi.
  • Serangan UNION, di mana Anda dapat mengambil data dari tabel database yang berbeda.
  • Memeriksa database, tempat Anda dapat mengekstrak informasi tentang versi dan struktur database.
  • Injeksi SQL buta, di mana hasil kueri yang Anda kontrol tidak dikembalikan dalam respons aplikasi.

Mengambil data tersembunyi

Pertimbangkan aplikasi belanja yang menampilkan produk dalam kategori berbeda. 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 detail (*)
  • dari tabel produk
  • dimana kategorinya adalah Hadiah
  • dan dirilis adalah 1.

Pembatasan released = 1digunakan untuk menyembunyikan produk yang tidak dirilis. Untuk produk yang belum dirilis, mungkin released = 0.

Aplikasi tidak mengimplementasikan 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 urutan tanda hubung ganda --adalah indikator komentar dalam SQL, dan berarti kueri lainnya diartikan sebagai komentar. Ini secara efektif menghapus sisa kueri, sehingga tidak lagi disertakan 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

Permintaan yang diubah akan mengembalikan semua item yang kategorinya adalah Hadiah, atau 1 sama dengan 1. Sejak 1=1 selalu benar, kueri akan mengembalikan semua item.

Menumbangkan logika aplikasi

Pertimbangkan aplikasi yang memungkinkan pengguna masuk dengan nama pengguna dan kata sandi. Jika pengguna memasukkan nama pengguna wiener dan kata sandi bluecheese, aplikasi 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, itu akan 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 WHEREklausa kueri. Misalnya, mengirimkan nama pengguna administrator'-- dan kata sandi kosong menghasilkan kueri berikut:

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

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

Mengambil data dari tabel database lain

Jika hasil kueri SQL dikembalikan dalam respons aplikasi, penyerang dapat memanfaatkan kerentanan injeksi SQL untuk mengambil data dari tabel lain dalam database. Ini dilakukan dengan menggunakan UNION kata kunci, yang memungkinkan Anda menjalankan file SELECT kueri dan menambahkan hasil ke kueri asli.

Misalnya, jika aplikasi menjalankan kueri berikut yang berisi "Hadiah" input pengguna:

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

kemudian penyerang dapat mengirimkan masukan:

' UNION SELECT username, password FROM users--

Ini akan menyebabkan aplikasi mengembalikan semua nama pengguna dan sandi bersama dengan nama dan deskripsi produk.

Memeriksa database

Setelah identifikasi awal dari kerentanan injeksi SQL, biasanya 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 melakukannya bergantung pada jenis database, sehingga Anda dapat menyimpulkan jenis 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 di dalamnya. Misalnya, di sebagian besar database Anda bisa menjalankan kueri berikut ini untuk membuat daftar tabel:

SELECT * FROM information_schema.tables

Kerentanan injeksi SQL buta

Banyak contoh injeksi SQL adalah kerentanan buta. Ini berarti bahwa aplikasi tidak mengembalikan hasil kueri SQL atau detail kesalahan database apa pun dalam responsnya. Kerentanan buta masih dapat dimanfaatkan 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 bisa mengubah logika kueri untuk memicu perbedaan yang dapat dideteksi dalam respons aplikasi bergantung pada kebenaran dari satu kondisi. Ini mungkin melibatkan memasukkan kondisi baru ke dalam beberapa logika Boolean, atau memicu kesalahan secara bersyarat seperti divide-by-zero.
  • Anda dapat secara bersyarat memicu penundaan waktu dalam pemrosesan kueri, memungkinkan Anda menyimpulkan kebenaran kondisi berdasarkan waktu yang dibutuhkan aplikasi untuk merespons.
  • Anda dapat memicu interaksi jaringan di luar , menggunakan jalur OAST teknik . Teknik ini sangat kuat dan bekerja dalam situasi di mana teknik lain tidak. Seringkali, Anda dapat secara langsung mengekstrak data melalui saluran out-of-band, misalnya dengan menempatkan data ke dalam pencarian DNS untuk domain yang Anda kontrol.

Bagaimana mendeteksi kerentanan injeksi SQL

Mayoritas kerentanan injeksi SQL dapat ditemukan dengan cepat dan andal menggunakan Burp Suite pemindai kerentanan web .

Injeksi SQL dapat dideteksi secara manual dengan menggunakan serangkaian pengujian sistematis terhadap setiap titik masuk dalam aplikasi. Ini biasanya melibatkan:

  • Mengirimkan karakter tanda kutip tunggal ' dan mencari kesalahan atau anomali lainnya.
  • Mengirimkan beberapa sintaks khusus SQL yang mengevaluasi ke nilai dasar (asli) titik masuk, dan ke nilai yang berbeda, dan mencari perbedaan sistematis dalam respons aplikasi yang dihasilkan.
  • Mengirimkan ketentuan Boolean seperti OR 1=1 dan OR 1=2, and mencari perbedaan tanggapan aplikasi.
  • Mengirimkan payload yang dirancang untuk memicu penundaan waktu saat dieksekusi dalam kueri SQL, dan mencari perbedaan waktu yang dibutuhkan untuk merespons.
  • Mengirimkan payload OAST yang dirancang untuk memicu interaksi jaringan out-of-band saat dijalankan dalam kueri SQL, dan memantau setiap interaksi yang dihasilkan.

Injeksi SQL di bagian kueri yang berbeda

Sebagian besar kerentanan injeksi SQL muncul dalam file WHERE klausa dari a SELECTpertanyaan. Jenis injeksi SQL ini umumnya dipahami dengan baik oleh penguji berpengalaman.

Tetapi kerentanan injeksi SQL pada prinsipnya dapat terjadi di lokasi mana pun dalam kueri, dan dalam jenis kueri yang berbeda. Lokasi lain yang paling umum tempat munculnya injeksi SQL adalah:

  • Di UPDATE pernyataan, dalam nilai yang diperbarui atau WHERE ayat.
  • Di INSERT pernyataan, dalam nilai yang disisipkan.
  • Di SELECT pernyataan, di dalam tabel atau nama kolom.
  • Di SELECT pernyataan, dalam ORDER BY ayat.

Injeksi SQL orde kedua

Injeksi SQL orde pertama muncul di mana aplikasi mengambil input pengguna dari permintaan HTTP dan, dalam proses memproses permintaan itu, menggabungkan input ke dalam kueri SQL dengan cara yang tidak aman.

Dalam injeksi SQL orde kedua (juga dikenal sebagai injeksi SQL tersimpan), aplikasi mengambil input pengguna dari permintaan HTTP dan menyimpannya untuk digunakan di masa mendatang. Ini biasanya dilakukan dengan menempatkan input ke dalam database, tetapi tidak ada kerentanan yang muncul pada titik penyimpanan data. Nanti, saat menangani permintaan HTTP yang berbeda, aplikasi mengambil data yang disimpan dan menggabungkannya ke dalam kueri SQL dengan cara yang tidak aman.

Injeksi SQL orde kedua

Injeksi SQL orde kedua sering muncul dalam situasi di mana pengembang menyadari kerentanan injeksi SQL, dan dengan demikian menangani penempatan awal input ke dalam database dengan aman. Data yang kemudian diproses dianggap aman karena sebelumnya disimpan dalam database dengan aman. Pada titik ini, data ditangani dengan cara yang tidak aman, karena pengembang keliru menganggapnya dapat dipercaya.

Faktor spesifik basis data

Beberapa fitur inti dari bahasa SQL diimplementasikan dengan cara yang sama di seluruh platform database populer, dan begitu banyak cara untuk mendeteksi dan mengeksploitasi kerentanan injeksi SQL bekerja secara identik pada berbagai jenis database.

Namun, ada juga banyak perbedaan antara database umum. Ini berarti bahwa beberapa teknik untuk mendeteksi dan mengeksploitasi injeksi SQL bekerja secara berbeda pada platform yang berbeda. Sebagai contoh:

  • Sintaks untuk penggabungan string.
  • Komentar.
  • Kueri bertumpuk (atau bertumpuk).
  • API khusus platform.
  • Pesan kesalahan.

Bagaimana mencegah injeksi SQL

Sebagian besar contoh injeksi SQL dapat dicegah dengan menggunakan kueri berparameter (juga dikenal sebagai pernyataan yang disiapkan) alih-alih penggabungan string dalam kueri.

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();

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

Agar kueri berparameter efektif dalam mencegah injeksi SQL, string yang digunakan dalam kueri harus selalu berupa konstanta hard code, 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 menggunakan penggabungan string dalam kueri untuk kasus yang dianggap aman. Sangat mudah untuk membuat kesalahan tentang kemungkinan asal data, atau untuk perubahan dalam kode lain yang melanggar asumsi tentang data apa yang tercemar.

sekian..

 GAUSAH BANYAK CERAMAH INTINYA KEK GITULAH.. WKWK