Injeksi SQL
Injeksi SQL
Injeksi SQL adalah teknik injeksi kode yang dapat menghancurkan database Anda.
Injeksi SQL adalah salah satu teknik peretasan web yang paling umum.
Injeksi SQL adalah penempatan kode berbahaya dalam pernyataan SQL, melalui input halaman web.
SQL di Halaman Web
Injeksi SQL biasanya terjadi ketika Anda meminta input dari pengguna, seperti nama pengguna/id pengguna mereka, dan alih-alih nama/id, pengguna memberi Anda pernyataan SQL yang tanpa sadar akan Anda jalankan di database Anda.
Lihat contoh berikut yang membuat
SELECT
pernyataan dengan menambahkan variabel (txtUserId) ke string pilihan. Variabel diambil dari input pengguna (getRequestString):
Contoh
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
Sisa bab ini menjelaskan potensi bahaya menggunakan input pengguna dalam pernyataan SQL.
Injeksi SQL Berdasarkan 1 = 1 Selalu Benar
Perhatikan kembali contoh di atas. Tujuan asli dari kode ini adalah untuk membuat pernyataan SQL untuk memilih pengguna, dengan id pengguna yang diberikan.
Jika tidak ada yang mencegah pengguna memasukkan input "salah", pengguna dapat memasukkan beberapa input "pintar" seperti ini:
Identitas pengguna:
Kemudian, pernyataan SQL akan terlihat seperti ini:
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
SQL di atas valid dan akan mengembalikan SEMUA baris dari tabel "Pengguna", karena OR 1=1 selalu TRUE.
Apakah contoh di atas terlihat berbahaya? Bagaimana jika tabel "Pengguna" berisi nama dan kata sandi?
Pernyataan SQL di atas hampir sama dengan ini:
SELECT UserId, Name, Password
FROM Users WHERE UserId = 105 or 1=1;
Seorang hacker mungkin mendapatkan akses ke semua nama pengguna dan password dalam database, hanya dengan memasukkan 105 OR 1=1 ke dalam kolom input.
Injeksi SQL Berdasarkan ""="" Selalu Benar
Berikut adalah contoh login pengguna di situs web:
Nama pengguna:
Kata sandi:
Contoh
uName = getRequestString("username");
uPass = getRequestString("userpassword");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass +
'"'
Hasil
SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"
Seorang peretas mungkin mendapatkan akses ke nama pengguna dan kata sandi dalam database hanya dengan memasukkan " ATAU ""=" ke dalam kotak teks nama pengguna atau kata sandi:
Nama pengguna:
Kata sandi:
Kode di server akan membuat pernyataan SQL yang valid seperti ini:
Hasil
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
SQL di atas valid dan akan mengembalikan semua baris dari tabel "Pengguna", karena OR ""="" selalu TRUE.
Injeksi SQL Berdasarkan Pernyataan SQL Batch
Sebagian besar database mendukung pernyataan SQL batch.
Kumpulan pernyataan SQL adalah sekelompok dua atau lebih pernyataan SQL, dipisahkan oleh titik koma.
Pernyataan SQL di bawah ini akan mengembalikan semua baris dari tabel "Pengguna", lalu menghapus tabel "Pemasok".
Contoh
SELECT * FROM Users; DROP TABLE Suppliers
Lihatlah contoh berikut:
Contoh
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
Dan berikut masukannya:
Identitas pengguna:
Pernyataan SQL yang valid akan terlihat seperti ini:
Hasil
SELECT * FROM Users WHERE
UserId = 105; DROP TABLE Suppliers;
Gunakan Parameter SQL untuk Perlindungan
Untuk melindungi situs web dari injeksi SQL, Anda dapat menggunakan parameter SQL.
Parameter SQL adalah nilai yang ditambahkan ke kueri SQL pada waktu eksekusi, dengan cara yang terkontrol.
Contoh Pisau Cukur ASP.NET
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);
Perhatikan bahwa parameter diwakili dalam pernyataan SQL dengan penanda @.
Mesin SQL memeriksa setiap parameter untuk memastikan bahwa itu benar untuk kolomnya dan diperlakukan secara harfiah, dan bukan sebagai bagian dari SQL yang akan dieksekusi.
Contoh lain
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
Contoh
Contoh berikut menunjukkan cara membuat kueri berparameter dalam beberapa bahasa web umum.
PILIH PERNYATAAN DI ASP.NET:
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();
MASUKKAN KE PERNYATAAN DI ASP.NET:
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
MASUKKAN KE PERNYATAAN DI PHP:
$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();