Mengungkap bahaya SQL Injection yang tersembunyi

sql injection adalah

Serangan siber bisa dimulai dari mengetikkan satu kalimat di kolom pencarian pada website atau aplikasi. Tak percaya? Inilah yang terjadi pada SQL injection

Serangan SQL injection merupakan salah satu teknik paling efektif bagi peretas untuk mengakses data sensitif tanpa izin sah. Serangan ini memanfaatkan kode SQL pada aplikasi atau website yang rentan dan mudah dimanipulasi.

Dalam blog ini, kita akan mengupas tuntas bagaimana SQL injection bekerja, jenis-jenisnya, dan langkah penting apa yang bisa diambil untuk melindungi dari ancaman ini.

 

Apa itu SQL injection?

SQL injection adalah salah satu bentuk serangan yang biasa terjadi pada aplikasi atau website. Serangan ini menggunakan kode SQL berbahaya untuk memanipulasi backend pada database. Melalui SQL injection, pelaku kejahatan siber dapat melakukan aktivitas penting pada data pribadi di server, seperti mengakses, mengedit, atau menghapus, bahkan mengirim malware berbahaya kepada user. Dampaknya bisa sangat merugikan, mulai dari kebocoran data sensitif, kerugian finansial, hingga rusaknya reputasi organisasi.

Untuk mendeteksi dan memitigasi serangan SQL injection, dibutuhkan solusi keamanan jaringan yang komprehensif. Solusi ini harus mampu menganalisis serta mengkorelasikan log dari server web dan database secara menyeluruh.

 

Bagaimana cara kerja SQL injection?

Serangan SQL injection biasanya dimulai dari kolom input pada aplikasi atau website yang terhubung dengan database, seperti seach bar, form login, dan text box. Pada kolom input tersebut, pelaku serangan akan memasukkan kode SQL yang berbahaya. Tujuan kode ini adalah untuk mengubah query SQL yang dijalankan aplikasi.

Tentu saja, sebelumnya pelaku harus tahu dulu query SQL seperti apa yang digunakan di aplikasi. Biasanya, pelaku akan mencari informasi ini lewat pemeriksaan source code HTML atau traffic jaringan.

Kode SQL yang berbahaya dimasukkan berulang kali untuk menembus pertahanan autentikasi. Misalnya, penyerang memasukkan kode "1"="1" pada form login. Dengan memasukkan kode ini, penyerang jadi bisa login tanpa menggunakan username dan password yang sah, karena kode yang dimasukkan membuat query selalu mengembalikan nilai true.

Jika penyerang sudah berhasil masuk database, mereka dapat mengambil informasi pribadi atau bahkan menghapusnya. Aktivitas yang bisa dilakukan penyerang ini sebenarnya tergantung pada jenis privilege yang diberikan kepada database. Itulah mengapa, penting untuk mengatur jenis akses yang diberikan kepada database secara hati-hati agar tidak membuka celah keamanan.

 

Apa saja jenis-jenis SQL injection?

  1. In-band/Classic SQL injection

Punya dua nama, tipe SQL injection ini paling sering dilakukan. Pada tipe ini, penyerang bisa langsung melihat hasil kode SQL berbahaya yang dimasukkan ke situs atau aplikasi.

Ada dua jenis In-band/Classic SQL injection, yaitu Error-based dan Union-based.

Pada jenis Error-based, penyerang memanfaatkan pesan error yang muncul dari database untuk mengambil informasi penting. Misalnya, ada aplikasi yang punya query seperti ini:

SELECT * FROM users WHERE user_id = '<input_userid>'

Lalu, penyerang memasukkan nilai 1'. Hasilnya, query akan berubah menjadi:

SELECT * FROM users WHERE user_id = '1''

Pada query ini, ada tanda kutip yang dobel, sehingga query error. Biasanya, akan muncul pesan error pada aplikasi. Dari pesan error ini, penyerang bisa tahu bahwa kode SQL aplikasi rentan dimanipulasi.

Sementara itu, tipe Union-based menggunakan perintah UNION untuk menggabungkan hasil query normal dengan data sensitif dari tabel lain. Contohnya, query awal adalah:

SELECT * FROM users WHERE user_id = '<input_userid>'

Lalu, penyerang memasukkan nilai 1'. Akibatnya, query berubah menjadi:

SELECT * FROM users WHERE user_id = '1' UNION SELECT name, dcode--'

Dari sini, penyerang bisa melihat data dari kolom name dan dcode langsung di tampilan web.

  1. Blind SQL injection

Blind SQL injection adalah serangan yang dilakukan ketika penyerang tidak bisa melihat langsung hasil query SQL yang mereka masukkan ke situs atau aplikasi. Akan tetapi, mereka bisa menebak apa yang terjadi di balik layar berdasarkan perilaku situs atau aplikasi tersebut.

Ada dua tipe blind SQL injection, yaitu Boolean-based dan Time-based.

Boolean-based blind SQL injection memanfaatkan query SQL tipe conditional seperti IF, CASE, AND, dan OR. Tipe serangan ini bergantung pada logika true atau false.

Contohnya, ada sebuah situs rumah sakit dengan link berikut untuk melihat data pasien: http://www.sthospitals.original/pid.php?id=22. URL ini menampilkan data pasien nomor 22.

Penyerang kemudian mengubah URL menjadi:

http://www.sthospitals.original/pid.php?id=22 and 1=2

Karena 1=2 adalah false, maka data tidak ditampilkan.

Tidak berhenti sampai di situ, penyerang juga mengubah data menjadi:

http://www.sthospitals.original/pid.php?id=22 and 1=1

Karena 1=1 adalah true, maka data muncul lagi.

Dari proses ini, penyerang jadi tahu bahwa query SQL bisa dimanipulasi. Mereka pun bisa lanjut menebak isi database satu per satu, dengan cara yang serupa.

Selanjutnya, ada Time-based blind SQL injection. Serangan ini mengukur waktu respons aplikasi. Mereka akan memasukkan kode SQL yang menyuruh database untuk berhenti sejenak, jika ada kondisi true.

Contohnya, mereka memasukkan kode ini:

http://www.sthospitals.original/pid.php?id=22 and if(1=1, sleep(10))

Berdasarkan kode ini, jika server perlu waktu 10 detik untuk merespons, berarti kondisi 1=1 dianggap true dan query berhasil dijalankan. Dengan begitu, penyerang bisa mengorek isi database dengan pola trial-and-error meskipun mereka tidak bisa melihat data secara langsung.

  1. Out-of-band SQL injection

Berbeda dari serangan SQL injection biasa yang menampilkan data langsung melalui website atau aplikasi, pada SQL injection tipe out-of-band, penyerang mencuri data melalui jalur alternatif seperti jaringan DNS.

Misalnya, ada sebuah situs dengan kolom input nama. Query SQL normal pada situs tersebut yaitu:

SELECT * FROM database WHERE name = 'Rara';

Namun, alih-alih memasukkan nama, penyerang memasukkan kode berbahaya seperti:

' UNION SELECT DNS_QUERY(LOGS) FROM DUAL --

Kode ini akan menggabungkan query normal dengan perintah penyerang, membuat database mengirim log ke alamat DNS penyerang tersebut.

Karena jalur ini tidak langsung muncul di aplikasi atau web, sering kali serangan tidak terlihat oleh pemilik situs. Itulah mengapa, SQL injection tipe out-of-band sangat berbahaya.

 

Bagaimana cara mencegah SQL injection?

Serangan SQL injection tidak boleh diremehkan. Sebab, serangan ini bisa menimbulkan banyak kerugian, mulai dari finansial, pencurian data, hingga hilangnya reputasi. Oleh sebab itu, SQL injection perlu dicegah sebelum terlambat. Berikut caranya.

1. Menggunakan parameterized queries

Parameterized queries membuat input pengguna dianggap sebagai data, bukan bagian dari perintah SQL. Sehingga, struktur query menjadi terpisah dari data sebenarnya.

Contohnya adalah penggunaan query sebagai berikut:

cursor.execute("SELECT * FROM users WHERE username = ?", (user_input,))

Pada query ini, "?" akan diganti dengan nilai user_input dan tidak akan dijalankan sebagai kode SQL.

2. Menghindari penggunaan Dynamic SQL

Dynamic SQL adalah penggunaan query yang terdiri atas gabungan string dan input pengguna. Contohnya:

"SELECT * FROM users WHERE username = '" + user_input + "'"

Dynamic SQL sangat berbahaya. Sebab, jika ada orang yang sengaja memasukkan kode SQL berbahaya, kode tersebut bisa dijalankan oleh SQL, alih-alih masuk sebagai data.

3. Melakukan uji keamanan

Keamanan aplikasi atau website Anda dapat diuji menggunakan penetration testing atau vulnerability assessment. Dengan pengujian ini, Anda bisa mengidentifikasi dan menangani kerentanan yang berkaitan dengan SQL injection.

Selain itu, Anda juga perlu menerapkan code review untuk memastikan keamanan kode yang digunakan.

4. Menerapkan whitelisting

Untuk menghindari masuknya input yang berbahaya, Anda bisa membatasi hanya karakter atau format tertentu yang boleh masuk. Caranya adalah menggunakan whitelisting, hanya izinkan input yang benar.

5. Tidak menampilkan pesan error ke pengguna

SQL injection sangat memanfaatkan pesan error dalam serangannya. Itulah mengapa, jangan beri kesempatan kepada pengguna untuk bisa melihat pesan error ini.

Alih-alih menampilkan pesan error SQL yang spesifik, Anda bisa menyimpan log error di server saja. Lalu, tampilkan pesan umum seperti: Oops! Something went wrong.

6. Menggunakan tool deteksi dan mitigasi serangan SQL injection

Untuk mencegah SQL injection, Anda memerlukan tool yang bisa mendeteksinya. Dengan ManageEngine Log360, Anda bisa menganalisis dan mengkorelasikan data log dari web server dan database, mengaudit aktivitas SQL, memantau aktivitas server database, melacak perubahan akun database server, serta mendeteksi serangan keamanan yang mencurigakan seperti SQL injection.

Dengan demikian, jika terjadi SQL injection, Anda bisa segera tahu dan melakukan mitigasi dengan cepat.