SQL Injection - TeachMeSoft

SQL Injection












Injeksi SQL

Injeksi SQL adalah teknik injeksi kode yang dapat merusak 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 saat Anda meminta masukan kepada 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 pernyataan SELECT dengan menambahkan variabel (txtUserId) ke string pilihan. Variabel diambil dari input pengguna (getRequestString):

Contoh

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Bagian selanjutnya dari bab ini menjelaskan potensi bahaya menggunakan input pengguna dalam pernyataan SQL.


SQL Injection Berdasarkan 1 = 1 Selalu Benar

Lihat kembali contoh di atas. Tujuan asli dari kode ini adalah untuk membuat pernyataan SQL untuk memilih pengguna, dengan id pengguna tertentu.

Jika tidak ada yang mencegah pengguna memasukkan input yang "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 BENAR.

Apakah contoh di atas terlihat berbahaya? Bagaimana jika tabel "Pengguna" berisi nama dan sandi?

Pernyataan SQL di atas kurang lebih sama dengan ini:

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

Seorang peretas mungkin mendapatkan akses ke semua nama pengguna dan kata sandi 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 sandi dalam database hanya dengan memasukkan "OR" "=" ke dalam kotak teks nama pengguna atau 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 "Users", karena OR "" = "" selalu TRUE.


Injeksi SQL Berdasarkan Pernyataan SQL Batch 

Kebanyakan database mendukung pernyataan SQL bertumpuk.

Sekumpulan 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

Lihat contoh berikut:

Contoh

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Dan masukan berikut ini:

Identitas pengguna: 

Pernyataan SQL yang valid akan terlihat seperti ini:

Hasil

SELECT * FROM Users WHERE UserId = 105DROP 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 Razor 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 DALAM 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();



















Disqus comments