
Oleh: Dzikri Maulana
Apa Itu SQL Injection?
SQL injection adalah teknik penyerangan yang dilakukan dengan cara memanipulasi input yang diterima oleh aplikasi web sehingga penyerang dapat menyisipkan atau “menyuntikkan” perintah SQL berbahaya ke dalam perintah SQL yang dijalankan oleh database.
Hal ini sangat mungkin terjadi apabila adanya celah kerentanan pada input yang diterima oleh sistem, dikarenakan:
● Input yang Rentan
Penyerang mengirimkan input yang dimodifikasi kemudian dijalankan oleh aplikasi. Ini dapat mencakup penggunaan karakter khusus, seperti tanda kutip tunggal (‘) atau karakter pemisah titik koma (;), untuk mengakhiri perintah SQL yang ada dan menyisipkan perintah SQL berbahaya.
● Aplikasi Web yang Tidak Aman
Apabila inputan rentan dikirim ke sistem tanpa melalui proses validasi, membersihkan, atau memproses input, dapat membuat perintah SQL yang berbahaya dapat dengan mudah disisipkan. Kegagalan validasi input dapat membuat suatu sistem dapat menjadi sasaran empuk serangan ini.
Dampak Serangan
Serangan SQL injection dapat menimbulkan dampak yang serius bagi aplikasi web dan penggunanya, antara lain:
● Mengakses, mencuri, dan data dalam database.
● Membocorkan informasi sensitif seperti kata sandi atau data pribadi.
● Mengubah, menghapus, atau merusak data yang ada dalam database.
● Mengeksploitasi izin database untuk menjalankan tindakan yang tidak diizinkan.
● Mengambil alih server atau sistem dalam kasus yang ekstrem.
Bagaimana SQL Injection Terjadi
1. Menentukan Target
Serangan SQL injection dimulai dengan menentukan target. Target serangan ini biasanya adalah aplikasi web yang menerima input dari pengguna. Input ini bisa berupa formulir pencarian, kolom pengguna, URL, atau parameter input lainnya yang diterima oleh aplikasi dan akhirnya digunakan dalam perintah SQL.
Secara acak, peretas dapat mencari website yang berkemungkinan mempunyai kerentanan SQL Injection dengan cara melakukan Google Dorking. Google Dorking adalah teknik pencarian informasi di internet menggunakan mesin pencari Google dengan menggunakan sintaks khusus. Teknik ini dapat digunakan untuk mencari informasi yang lebih mendalam dan spesifik, bahkan informasi yang tidak dipublikasikan secara terbuka.
2. Eksploitasi
Peretas akan mencoba memasukkan input yang telah dimodifikasi untuk mengeksploitasi kerentanan SQL injection. Input ini biasanya berupa karakter khusus yang dapat digunakan untuk mengendalikan perintah SQL yang dijalankan.
Contoh SQL Injection Sederhana
Misalkan ada kolom pencarian di situs web yang memungkinkan pengguna untuk mencari berdasarkan nama pengguna. Jika pengguna memasukkan nama pengguna ‘ OR 1=1 –, perintah SQL yang dieksekusi oleh aplikasi mungkin terlihat seperti ini:
SELECT FROM users WHERE username = ” OR 1=1 –‘ AND password = ‘…’
Perintah SQL di atas akan mengembalikan semua baris dalam tabel pengguna karena kondisi 1=1 selalu benar, dan — adalah komentar yang mengakhiri perintah SQL sehingga kondisi setelahnya diabaikan. Ini memungkinkan penyerang untuk mengakses data semua pengguna.
Google Dorking
Google Dorking adalah teknik pencarian informasi di internet menggunakan mesin pencari Google dengan menggunakan sintaks khusus. Teknik ini dapat digunakan untuk mencari informasi yang lebih mendalam dan spesifik, bahkan informasi yang tidak dipublikasikan secara terbuka.
a. Sintaksis Google Dorking
Google Dorking menggunakan berbagai sintaksis khusus untuk melakukan pencarian. Sintaksis-sintaksis tersebut dapat digunakan untuk mencari informasi berdasarkan berbagai kriteria, seperti:
● site: Mencari halaman web di domain tertentu.
site:example.com
● intitle: Mencari halaman web yang judulnya mengandung string tertentu.
intitle:”kata yang ingin dicari pada judul”
● inurl: Mencari halaman web yang tautannya mengandung string tertentu.
inurl:”login.php”
● filetype: Mencari halaman web yang memiliki ekstensi file tertentu.
filetype:php
● link: Mencari halaman web yang direferensikan oleh halaman web lain.
link:example.com
● cache: Mencari versi cache halaman web tertentu.
cache:example.com
Dalam konteks pembahasan ini, Google Dorking digunakan untuk mencari situs yang mempunyai kemungkinan kerentanan SQL injection, Berikut adalah beberapa contoh penggunaan Google Dorking:
Cari halaman web yang pada tautannya terdapat “php?id=”
inurl:”php?id=”
Ini bertujuan untuk mencari halaman web dengan bahasa pemrograman PHP yang mempunyai parameter, dengan harapan parameter dapat menyebabkan kerentanan SQL Injection
Blind SQL Injection
Blind SQL Injection Blind SQL Injection adalah salah sebuah teknik SQL injection yang dimana berbeda pada biasanya. Jika SQL Injection, saat kita melakukan injection akan menampilkan sebuah hasil, namun pada Blind SQL Injection tidak menampilkan hasil apapun. Dengan kata lain, attacker harus mencoba setiap kemungkinan untuk mendapatkan hasil tersebut.
Ada dua jenis Blind SQL Injection: Content-based Blind SQL Injection Time-based Blind SQL Injection Content-Based Blind SQL Injection Contohnya, jika kita membuka halaman web e-commerce, lalu mengakses salah satu item di web tersebut maka akan menampilkan URL sebagai berikut:
● http://www.ecommerce.com/item.php?id=10
Kode SQL yang digunakan pada request ini:
● SELECT column_name, column_name2 FROM table_name WHERE id = 10;
Content-Based Blind SQL Injection Attacker bisa saja memanipulasi request nya seperti berikut:
● http://www.ecommerce.com/item.php?id=10 and 1=2
Kode SQL yang digunakan pada request ini berubah menjadi:
● SELECT column_name2 FROM table_name WHERE id = 10 and 1=2;
● SELECT name, about, price FROM store_table WHERE id = 10 and 1=2;
Content-Based Blind SQL Injection Lalu attacker memanipulasi request nya seperti berikut:
● http://www.ecommerce.com/item.php?id=10 and 1=1
Kode SQL yang digunakan pada request ini berubah menjadi:
● SELECT column_name2 FROM table_name WHERE id = 10 and 1=1;
● SELECT name, about, price FROM store_table WHERE id = 10 and 1=1;
Time-Based Blind SQL Injection Contohnya adalah sebagai berikut:
● http://www.ecommerce.com/item.php?id=10 and if(1=1, sleep(10), false)
Saat melakukan Time-Based Blind SQL Injection, attacker membuat database melakukan operasi yang membutuhkan waktu yang lama. Jika database tidak merespon dengan segera, maka ada kerentanan terhadap Blind SQL Injection.
Penanganan yang Kurang Tepat untuk Mengatasi SQL Injection
Ada beberapa penanganan yang dapat dilakukan untuk mengatasi SQL injection. Namun, ada beberapa penanganan yang kurang tepat dan dapat menyebabkan serangan SQL injection tetap terjadi.
● Pengamanan dengan pembatasan input pada halaman HTML
Salah satu penanganan yang kurang tepat untuk mengatasi SQL injection adalah dengan membatasi input pada halaman HTML. Penanganan ini dilakukan dengan cara menggunakan atribut `type` pada elemen input untuk membatasi jenis input yang dapat dimasukkan oleh pengguna.
Misalnya, untuk membatasi input hanya berupa pilihan angka, kita dapat menggunakan elemen1< /option>
Penanganan ini kurang tepat karena tidak dapat mencegah penyerang untuk memasukkan karakter khusus dengan cara memanipulasinya dengan inspect element ataupun memanipulasi lalu lintas jaringan, contohnya dengan BurpSuite.

● Mengamankan dengan membatasi output melalui query SQL
Penanganan yang kurang tepat lainnya adalah dengan membatasi output melalui query SQL. Penanganan ini dilakukan dengan cara mengubah query sql, misalkan membuat query sql yang memastikan hanya ada 1 outputan yang muncul, hal ini tentu kurang efektif, mengingat peretas bisa memanipulasi query tersebut
$query = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’ LIMIT 1;”;
peretas dapat memanipulasinya dengan menonaktifkan kode setelah inputan menggunakan sintaks ‘- – ‘
$query = “SELECT first_name, last_name FROM users WHERE user_id = ‘1 union select first_name, password from users; – – ‘ LIMIT 1;”;
Penanganan SQL Injection yang tepat
1. Parameterize Query dan Sanitasi Input
Salah satu cara untuk mencegah serangan SQL Injection adalah dengan menggunakan parameterized query. Parameterized query adalah teknik penulisan query SQL yang menggunakan parameter alih-alih memasukkan nilai secara langsung ke dalam query.
Dengan menggunakan parameterized query, nilai yang dimasukkan oleh pengguna akan diproses terlebih dahulu sebelum dieksekusi oleh database. Hal ini akan membantu mencegah serangan SQL Injection karena nilai yang dimasukkan oleh pengguna tidak akan langsung diproses oleh database.
Berikut adalah contoh penggunaan parameterized query dalam PHP:
// Kode yang rentan terhadap SQL Injection
$query = “SELECT * FROM store_table WHERE name = ‘ ” . $input . ” ‘ “;
$statement = $connection->createStatement();
$resultSet = $statement->executeQuery($query);
// Kode yang aman menggunakan parameterized query
$preparedStatement = $connection->prepareStatement(“SELECT * FROM store_table WHERE name = ?”);
$preparedStatement->setString(1, $input);
$resultSet = $preparedStatement->executeQuery();
2. Sanitasi Input
Selain menggunakan parameterized query, cara lain untuk mencegah serangan SQL Injection adalah dengan melakukan sanitasi input. Sanitasi input adalah proses untuk memvalidasi input dari pengguna untuk memastikan bahwa input tersebut tidak mengandung karakter berbahaya yang dapat dimanfaatkan oleh penyerang.
Berikut adalah beberapa contoh penerapan sanitasi input menggunakan regex dalam PHP:
Menghapus karakter non-alfanumerik
$input = “Hello, 123!”;
$cleaned_input = preg_replace(‘/[^a-zA-Z0-9]/’, ‘ ‘, $input);
echo $cleaned_input; // Output: “Hellol23”
“`
Melarang karakter khusus
$input = “Hello, “;
$sanitized_input = preg_replace(‘/<[^>]*>/’, ”, $input);
echo $sanitized_input; // Output: “Hello, XS5”
“`
Mengevalidasi input hanya berisi angka
$input = “12345”;
if (preg_match(‘/^[0-9]+$/’, $input)) {
echo “Input valid.”;
} else {
echo “Input tidak valid.”;
}
Penerapan Langkah Pencegahan SQL Injection pada Proyek
Dari langkah pencegahan di atas, contoh penerapannya dalam kasus langsung adalah sebagai berikut:
$data->bindParam(‘:id’, $id, PDO::PARAM_INT);
$data->execute();
$row = $data->fetch();
// Make sure only 1 result is returned
if ($data->rowCount() == 1) {
// Get values
$first = $row[‘first_name’];
$last = $row[‘last_name’];
// Feedback for end user
echo ”
ID: {$id}
First name: {$first}
Surname: {$last}
“;
}
}
?>