Table of contents

Apa itu SQL Injection?

SQL injection (SQLi) adalah teknik yang digunakan untuk memasukkan kode jahat ke database yang ada. Injeksi tersebut memungkinkan user jahat mendapatkan akses tanpa ijin untuk memperoleh, mengubah atau mengesktrak data seperti catatan customer, informasi personal dan sebagainya. Penyerang juga dapat menggunakan teknik ini untuk menemukan credentials administrator untuk mendapatkan akses penuh ke website, database, atau aplikasi yang terkena serangan.

Bagaimana Cara Kerja SQL Injection?

SQL Injection biasanya dilakukan lewat input aplikasi atau halaman web. Input form sering ditemui pada fitur seperti kotak pencarian, bidang formulir, atau URL parameters.

Untuk melakukan SQL injection, pelaku pertama perlu menemukan kelemahan dalam halaman website atau aplikasi. Setelah menemukan target, penyerang akan membuat muatan jahat dan mengirim input konten mereka untuk melakukan eksekusi malicious commands.

Dalam beberapa kasus, pelaku jahat mungkin hanya memanfaatkan program otomatis untuk menjalankan SQLi bagi mereka. Yang mereka butuhkan hanyalah URL situs web target untuk mendapatkan data curian dari korban.

Contoh SQL injection

Dalam contoh injeksi SQL berikut, kami mencoba untuk login dengan membandingkan input pengguna (nama pengguna dan kata sandi) dengan yang disimpan dalam database.

Ini adalah contoh dari apa yang TIDAK boleh dilakukan. Kueri ini memiliki banyak kekurangan berdasarkan desain. Khususnya, ini rentan terhadap injeksi SQL, dan tidak menggunakan kata sandi hashed dan salted

$mysqli = new mysqli(/*...*/);

$username = $_POST['username'];
$password = $_POST['password'];

$query = *SELECT * FROM user WHERE user.username = '$username' AND user.password = '$password';
$result = $mysqli->query($query);


Dalam contoh ini, kueri dibuat dengan menggabungkan nilai yang ditentukan pengguna (nama pengguna dan kata sandi) langsung ke dalam kueri.

Ini memudahkan penyerang untuk menghindari tanda kutip dan menyuntikkan lebih banyak operasi SQL. Dengan memiliki nama pengguna berikut admin' atau true  penyerang dapat masuk dengan akun pilihannya.

$mysqli = new mysqli(/*...*/);

$username = $_POST['username'];
$password = $_POST['password'];

$query = *SELECT * FROM user WHERE user.username = 'admin' or true --' AND user.password = '$password';
$result = $mysqli->query($query);


Cara Mencegah Serangan SQL Injection

Penyerang sering menargetkan situs web yang memiliki known vulnerabilities. Vulnerabilities yang tidak diumumkan, tidak dipatch atau zero-day vulnerabilities juga bertanggung jawab atas sebagian besar injeksi SQL.

Cara termudah untuk melindungi situs webmu dari injeksi SQL adalah dengan memperbarui semua perangkat lunak dan komponen pihak ketiga. Namun, ada sejumlah teknik yang dapat Anda gunakan untuk membantu mencegah kerentanan injeksi SQL.

  • Menggunakan Prepared Statements with Parameterized Queries

Prepared statements digunakan untuk memastikan tidak ada variabel dinamis yang kamu butuhkan dalam kueri yang dapat keluar dari posisinya. Kueri inti didefinisikan sebelumnya, dengan argumen dan tipenya sesudahnya.

Karena kueri mengetahui tipe data yang diharapkan, seperti string atau angka, mereka tahu persis bagaimana mengintegrasikannya ke kueri tanpa menyebabkan masalah.

$mysqli = new mysqli(/*...*/);

$username = $_POST['username'];
$password = $_POST['password'];

$query = "SELECT * FROM user WHERE user.username = ? AND user.password = ?";
$statement = $mysqli->prepare($query);
$statement->bind_param('s', $username);
$statement->bind_param('s', $password);
$statement->execute();
$result = $statement->get_results();



Dalam contoh ini, bahkan jika variabel nama pengguna atau kata sandi mencoba keluar dari kuerinya, Prepared Statements dengan benar keluar dari karakternya untuk mencegah perilaku yang tidak diharapkan atau SQLi.

  • Menggunakan Stored Procedures

Stored Procedures adalah operasi SQL yang sering disimpan di database itu sendiri, hanya bervariasi dengan argumennya. Stored Procedures mempersulit penyerang untuk mengeksekusi SQL jahat mereka, karena tidak dapat dimasukkan secara dinamis ke dalam kueri.

  • Allowlist Input Validation

Sebagai aturan praktis, jangan percayai data yang dikirimkan pengguna. Kamu dapat melakukan Allowlist Validation untuk menguji user input terhadap input yang diketahui, disetujui, dan ditentukan. Setiap kali data diterima tidak memenuhi nilai yang ditetapkan, data tersebut akan ditolak untuk melindungi aplikasi atau situs web dari injeksi SQL berbahaya dalam prosesnya.

  • Principle of Least Privilege

Principle of Least Privilege adalah prinsip ilmu komputer yang memperkuat kontrol akses ke situs websitemu untuk mengurangi ancaman keamanan.

Yang perlu dilakukan untuk menerapkan prinsip ini dan bertahan terhadap injeksi SQL yaitu

  • Menggunakan set previleges minimal di sistem untuk melakukan tindakan
  • Memberikan previleges hanya ketika tindakan itu diperlukan.
  • Tidak memberikan hak akses admin untuk akun aplikasi
  • Meminimalkan previleges untuk setiap akun database di environment milikmu
  • Keluar dari Masukan yang Disediakan Pengguna

Selama injeksi SQL normal, aktor jahat dapat dengan mudah membaca teks saat dikembalikan. Namun, ketika penyerang tidak dapat mengambil informasi dari server database, mereka akan sering menggunakan injeksi SQL berbasis waktu untuk mencapai hasil mereka. Ini bekerja dengan menggunakan operasi yang membutuhkan waktu lama untuk diselesaikan seringkali dalam hitungan detik.

Injeksi SQL berbasis waktu biasanya digunakan saat menentukan apakah ada kerentanan pada aplikasi web atau situs web, serta dalam hubungannya dengan teknik berbasis Boolean selama injeksi Blind SQL.

  • Memasang filter untuk input metakarakter

Memasang filter input metakarakter adalah salah satu cara mengatasi ancaman SQL injection. Mengimplementasikan filter terhadap metakarakter (&, ;, `, ‘, \, “, |, *, ?, ~, <, >, ^, (, ), [, ], {, }, $, \n, dan \r) berguna untuk mencegah input pada form isian pengguna yang bisa dimanfaatkan untuk melakukan serangan injeksi SQL

  • Menggunakan Web Application Firewall

Kamu dapat melindungi dari injeksi SQL generik dengan Web Application Firewall. Web Application Firewall dapat menangkap dan mencegah injeksi SQL dengan memfilter permintaan web yang berpotensi berbahaya.