c

Seluk Beluk SQL Injection

Seluk Beluk SQL Injection  : kita akan melihat bagaimana penyerang menggunakan injeksi SQL untuk tujuan merusak atau mengakses tanpa izin dan bagaimana melindungi Anda dan situs Anda darinya.

Apa itu injeksi SQL?

Seluk Beluk SQL Injection  Injeksi SQL adalah masalah yang sangat diabaikan, terutama dengan betapa mudahnya Joe Bloggs dan John Smith untuk mengatur situs web mereka sendiri dan melakukan apa yang mereka inginkan. Injeksi SQL sama dengan membiarkan pengguna lama memanipulasi database Anda, baik untuk tujuan jahat atau tidak. Kelemahan berbahaya ini mudah dicegah, namun lebih mudah diabaikan. Seluk Beluk SQL Injection

Setiap kali situs web atau aplikasi Anda melakukan kueri SQL dengan input yang diberikan kepadanya dari pengguna, ada kemungkinan untuk injeksi SQL jika Anda tidak dilindungi dengan benar. Hari ini kita akan belajar bagaimana injeksi SQL dilakukan dan bagaimana mencegahnya agar mudah ditelan, ini dia…

Benar, jadi bagaimana Anda melakukannya?

Ini jauh lebih sederhana daripada kedengarannya, injeksi SQL hanya mengubah kueri dari apa yang dimaksudkan untuk dilakukan dengan apa yang Anda inginkan, mari lewati gerak kaki yang membosankan dan lompat terlebih dahulu.

Untuk ‘melakukan’ injeksi SQL Anda memerlukan situs web atau aplikasi yang rentan, tentu saja untuk menunjukkan pencegahan dan seterusnya kita perlu menggunakan bahasa, kejutan kejutan bahasa yang akan kita gunakan hari ini adalah PHP ditambah dengan saudara-saudara yang luar biasa, MySQL . Pertimbangkan ini, Anda memiliki halaman bernama profile.php yang bila diakses dengan benar akan menarik informasi tentang pengguna tertentu dari database Anda yang dibuat dengan sangat baik. Katakanlah kueri terlihat seperti ini;

mysql_query(“PILIH nama_depan,
nama keluarga
DARI pengguna
WHERE user_id = ‘$_GET[‘id’]'”);

Tampaknya tidak berbahaya, ketika dijalankan dengan benar, kueri ini akan menarik dua bidang dari tabel yang disebut pengguna. Untuk mendatangkan malapetaka menyuntikkan SQL ke dalam kueri ini, kita perlu melakukan kueri kita sendiri, katakanlah misalnya; Pengguna DROP TABLE, sepertinya benar. Jelas jika kita mengunjungi profile.php?id=123 maka query akan terlihat seperti ini;

mysql_query(“PILIH nama_depan,
nama keluarga
DARI pengguna
WHERE user_id = ‘123’”);

Cukup sederhana, kueri ini akan mengambil nama depan dan nama belakang pengguna yang memiliki ID 123. Jelas bukan kueri yang dirancang terbaik karena akan lebih baik untuk membatasi jumlah hasil, dll, tetapi itu di luar cakupan ini tutorial. Sekarang katakanlah kita mengubah profile.php?id=123 menjadi profile.php?id=DROP TABLE pengguna. Kueri yang dijalankan sekarang terlihat seperti ini;

mysql_query(“PILIH nama_depan,
nama keluarga
DARI pengguna
WHERE user_id = ‘DROP TABLE pengguna'”);

Sangat tidak berguna. Semua yang dilakukan kueri ini adalah apa yang dimaksudkan dan mencari catatan di mana user_id diatur ke pengguna DROP TABLE. Untuk benar-benar membuat perintah kita dieksekusi, kita perlu ‘melarikan diri’ dari kueri SQL yang ramah dan memasukkan kueri kita sendiri, saya ingin memperkenalkan tanda kutip tunggal ( ‘ ). Saat Anda mencari string menggunakan SQL, untuk mencegah string mengganggu kueri, string tersebut dibungkus dalam sekumpulan tanda kutip tunggal. Jika kami menggunakan satu kutipan dalam kueri kami, itu tiba-tiba menjadi sedikit lebih menarik. Mari kita coba ‘pengguna DROP TABLE.

mysql_query(“PILIH nama_depan,
nama keluarga
DARI pengguna
WHERE user_id = ”DROP TABLE pengguna'”);

Apa yang kami lakukan adalah membuat string yang dicari kosong, dengan menggunakan satu tanda kutip kami telah menutup string dan kami sekarang berada di dalam kueri yang sebenarnya, menarik bukan? Jika Anda menjalankan kueri di atas, semua yang akan Anda terima kembali akan menjadi kesalahan (walaupun ini bervariasi tergantung pada konfigurasi PHP). ‘Hebat’ Saya mendengar Anda berkata, tetapi salah satu aturan emas ketika mencoba mengeksploitasi sesuatu adalah belajar menyukai pesan kesalahan.

Salah satu cara tercepat untuk mengetahui apakah sebuah situs dapat dieksploitasi adalah dengan memberikan satu kutipan di beberapa variabel $_GET dan melihat apakah Anda menerima pesan kesalahan. Jika Anda melakukannya maka kemungkinan ada lubang menganga bagi Anda untuk menghancurkan laporan ke administrator lokal. Tentu saja ini tidak selalu benar, tergantung pada banyak faktor dan hanya boleh digunakan sebagai upaya cepat pertama untuk memeriksa kerentanan.

Jadi kami memiliki pesan kesalahan, luar biasa, kami dapat memanipulasi kueri SQL! Sekarang alasan kueri di atas tidak berfungsi adalah karena itu dibaca sebagai satu perintah untuk dieksekusi, kami menjalankan perintah SELECT untuk memilih catatan dari database, mendorong perintah DROP TABLE di tengah jalan tidak akan diharapkan dan karena itu akan menyebabkan masalah. Cara kita mengatasinya adalah dengan menutup perintah SELECT untuk menginjeksi SQL kita sendiri.

Cara untuk mengakhiri perintah dengan benar dalam SQL sama dengan kebanyakan bahasa, dengan titik koma, jadi yang perlu kita lakukan adalah mengakhiri perintah sebelumnya dan kemudian memulai perintah kita sendiri. Satu hal yang perlu kita ingat adalah bahwa kueri yang kita akhiri tidak boleh menyebabkan kesalahan karena jika itu terjadi maka kesalahan akan menghentikan kueri dan perintah kita tidak akan tercapai. Mari kita menyuntikkan.

mysql_query(“PILIH nama_depan,
nama keluarga
DARI pengguna
WHERE user_id = ”; pengguna DROP TABLE'”);

Kami memasukkan ‘; pengguna DROP TABLE. Apa yang kami lakukan adalah menyisipkan tanda kutip untuk menutup string di ikuti dengan titik koma untuk mengakhiri kueri yang mencari pengguna, sejauh menyangkut siapa pun, perintah pertama dalam kueri ini valid, namun yang kedua tidak. Mengapa? Karena setelah perintah kami ada satu apostrof yang tertinggal dari perintah pertama tempat kami menyuntikkan. Uh oh. Perintah kami tidak akan di eksekusi karena ada kesalahan di dalamnya sekarang. Seluk Beluk SQL Injection

Rintangan lain yang bisa dilompati, intinya kita harus mengabaikan semuanya setelah apa yang kita injeksikan, kita tidak memperdulikannya. Untuk mengabaikan sisanya, kita harus menggunakan komentar SQL yang ditandai dengan dua tanda hubung (-). Setelah dua tanda hubung dibaca, sisa kueri diabaikan dan yang kita miliki adalah perintah yang berhasil, sebelum kita mengomentari sisa kueri, kita harus mengakhiri perintah kita dengan titik koma. Secara keseluruhan, kueri kami sekarang terlihat seperti ini.

mysql_query(“PILIH nama_depan,
nama keluarga
DARI pengguna
WHERE user_id = ”; pengguna DROP TABLE;–‘”);

Voila, Anda baru saja membuat marah seorang administrator database di suatu tempat, selamat. Sekarang satu hal yang harus kita sentuh adalah mengatasi otorisasi PHP/MySQL dasar dengan injeksi SQL.
Login yang benar ATAU 1=1?

Beberapa skrip login PHP (sangat) lemah yang menggunakan database MySQL menggunakan kueri aktual untuk memeriksa otorisasi daripada menanyakan basis data dan kemudian melakukan beberapa permainan dengan hasilnya. Berikut adalah contoh kueri yang sangat lemah;

myqsl_query(“PILIH user_id
DARI pengguna
WHERE username = ‘”.$username.”‘ AND password = ‘”.$password.”‘”);

Sekarang alasan orang mungkin menggunakan kueri ini untuk otorisasi adalah bahwa ketika nama pengguna dan kata sandi yang di tentukan di temukan dalam database, kueri di atas akan mengembalikan TRUE, sebenarnya itu akan mengembalikan user_id tetapi untuk contoh kami, kami hanya akan berasumsi bahwa PHP kode hanya memeriksa nilai yang di kembalikan. Seluk Beluk SQL Injection