-->

Pengertian SQL Injection

Apa itu SQL Injection?


SQL injection (SQLi) adalah kelemahan keamanan aplikasi yang memungkinkan penyerang untuk mengendalikan database aplikasi - membiarkan mereka mengakses atau menghapus data, mengubah perilaku berbasis data, dan melakukan hal-hal lain yang tidak diinginkan - dengan menipu aplikasi tersebut dalam mengirimkan perintah SQL yang tidak diharapkan.

Kelemahan injeksi SQL terjadi ketika sebuah aplikasi menggunakan data yang tidak tepercaya, seperti data yang dimasukkan ke dalam kolom bentuk web, sebagai bagian dari query database. Ketika sebuah aplikasi gagal untuk benar membersihkan data yang tidak tepercaya ini sebelum menambahkannya ke query SQL, penyerang dapat memasukkan perintah SQL mereka sendiri yang akan dijalankan oleh database. Kerentanan SQLi semacam itu mudah dicegah, namun SQLi tetap menjadi pengguna aplikasi web terkemuka, dan banyak organisasi tetap rentan terhadap pelanggaran data yang berpotensi merusak akibat injeksi SQL.

Bagaimana Penyerang Mengeksploitasi Kerentanan SQLi

Penyerang menyediakan input yang dibuat khusus untuk mengelabui aplikasi agar memodifikasi kueri SQL sehingga aplikasi meminta database untuk dieksekusi. Hal ini memungkinkan penyerang untuk:

  • Kontrol perilaku aplikasi itu berdasarkan data dalam database, misalnya dengan menipu aplikasi agar bisa login tanpa password yang valid
  • Ubah data di database tanpa otorisasi, misalnya dengan membuat catatan palsu, menambahkan pengguna atau "mempromosikan" pengguna ke tingkat akses yang lebih tinggi, atau menghapus data
  • Akses data tanpa otorisasi, misalnya dengan menipu database agar terlalu banyak menghasilkan query
Anatomi Serangan Injeksi SQL

Seorang pengembang mendefinisikan query SQL untuk melakukan beberapa tindakan database yang diperlukan agar aplikasi mereka berfungsi. Kueri ini memiliki argumen sehingga hanya catatan yang diinginkan yang dikembalikan, dan nilai untuk argumen itu dapat disediakan oleh pengguna (misalnya, melalui kolom formulir, parameter URL, kuki web, dll.).

Serangan SQLi dimainkan dalam dua tahap:

  • Penelitian: Penyerang mencoba mengirimkan berbagai nilai tak terduga untuk argumen tersebut, mengamati bagaimana aplikasi merespons, dan menentukan serangan untuk dicoba.
  • Attack: Attacker memberikan nilai input yang dibuat dengan hati-hati, jika digunakan sebagai argumen pada query SQL, akan ditafsirkan sebagai bagian dari perintah SQL dan bukan hanya data; database kemudian mengeksekusi perintah SQL seperti yang dimodifikasi oleh penyerang.
Tahapan penelitian dan penyerangan dapat dengan mudah diotomatisasi dengan alat yang tersedia.
Melindungi  Terhadap Serangan SQLi
Ada cara mudah untuk menghindari pengenalan kerentanan SQLi dalam aplikasi, dan untuk membatasi kerusakan yang dapat mereka timbulkan sebagai berikut :

  • Temukan kerentanan SQLi dengan rutin menguji aplikasi Anda baik menggunakan pengujian statis dan pengujian dinamis.
  • Hindari dan perbaiki kerentanan SQLi dengan menggunakan parameterized queries. Jenis query ini menentukan placeholder untuk parameter sehingga database akan selalu memperlakukannya sebagai data dan bukan bagian dari perintah SQL. Pernyataan siap pakai dan pemanggil relasi objek (ORM) mempermudah pengembang.
  • Remediasi kerentanan SQLi dalam sistem warisan dengan melepaskan masukan sebelum menambahkannya ke kueri. Gunakan teknik ini hanya bila pernyataan disiapkan atau fasilitas serupa tidak tersedia.
  • Mengurangi dampak kerentanan SQLi dengan menerapkan hak istimewa paling sedikit pada database. Pastikan setiap aplikasi memiliki kredensial database masing-masing, dan kredensial ini memiliki hak minimum yang dibutuhkan aplikasi.

Contoh Serangan dan Pertahanan


1. Mengembalikan lebih banyak data dari yang diharapkan

Bayangkan seorang pengembang perlu menunjukkan nomor rekening dan saldo untuk id pengguna saat ini seperti yang diberikan di URL. Mereka mungkin menulis (di Jawa):

String accountBalanceQuery =
  "SELECT accountNumber, balance FROM accounts WHERE account_owner_id = "
  + request.getParameter("user_id");
try {
    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery(accountBalanceQuery);
    while (rs.next()) {
        page.addTableRow(rs.getInt("accountNumber"), rs.getFloat("balance"));
    }
} catch (SQLException e) { ... }
Dalam operasi normal, pengguna dengan ID 984 mungkin masuk log, dan mengunjungi URL:

https: // bankingwebsite / show_balances? user_id = 984

Ini berarti akunBalanceQuery akan berakhir:

 SELECT accountNumber, balance FROM accounts WHERE account_owner_id = 984

 Dll

0 Response to "Pengertian SQL Injection"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel