Home » SQL » SQL Injection : Syntax dan Contohnya

SQL Injection : Syntax dan Contohnya

by Hanifah Nurbaeti
by Hanifah Nurbaeti

SQL Injection

Injeksi SQL adalah teknik injeksi kode yang dapat merusak database .

Injeksi SQL adalah salah satu teknik peretasan web yang paling umum.

Injeksi SQL adalah penempatan kode berbahaya dalam pernyataan SQL, dapat melalui input halaman web.

SQL di Halaman Web

Injeksi SQL biasanya terjadi saat kita meminta masukan kepada pengguna, seperti nama username/userid mereka dan alih-alih nama / id, pengguna akan memberi kita pernyataan SQL yang tanpa sadar akan dijalankan pada database kita sendiri.

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;

Selanjutnya kita akan menjelaskan potensi bahaya menggunakan input pengguna dalam pernyataan SQL.

SQL Injection Berdasarkan 1 = 1 Selalu True

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

Jika tidak ada yang mencegah user memasukkan masukan yang “wrong”, pengguna dapat memasukkan beberapa masukan “smart” seperti ini:

UserId: 105 OR 1=1

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 “Users”, karena OR 1 = 1 selalu TRUE.

Apakah contoh di atas terlihat berbahaya? Bagaimana jika tabel “Users” berisi nama dan sandi?

Pernyataan SQL di atas kurang lebih sama dengan ini:

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

Seorang peretas 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 TRUE

Berikut adalah contoh login pengguna di situs web:

Contoh

uName = getRequestString("username");
uPass = getRequestString("userpassword");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

Hasil

SELECT * FROM Users WHERE Name ="Akhmad" AND Pass ="myPass"

Seorang peretas mungkin mendapatkan akses ke nama pengguna dan password ke dalam database hanya dengan memasukkan “OR” “=” ke dalam kotak teks nama pengguna atau 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 Statement SQL Batch

Kebanyakan database mendukung pernyataan SQL bertumpuk.

Statement SQL Batch adalah sekelompok dari dua atau lebih pernyataan SQL yang dipisahkan oleh titik koma.

Statement SQL di bawah ini akan mengembalikan semua baris dari tabel “Users”, lalu menghapus tabel “Suppliers”.

Contoh

SELECT * FROM Users; DROP TABLE Suppliers

Kemudian lihat contoh berikut ini :

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

Dan masukan berikut ini:

User id: 105; DROP TABLE Suppliers

Statement SQL yang valid akan terlihat seperti ini:

Hasil

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;

Gunakan Parameter SQL untuk Proteksi

Untuk melindungi situs web dari injeksi SQL, kita dapat menggunakan parameter SQL.

Parameter SQL adalah nilai yang ditambahkan ke kueri SQL pada waktu eksekusi, secara 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.

SELECT STATEMENT DI ASP.NET:

txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();

INSERT INTO STATEMENT 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();

INSERT INTO STATEMENT 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();

You may also like