Pada postingan sebelumna kita telah membahas tentang Sosiaal Enginering yaitu suatu seni dan ilmu yang membuat orang untuk memenuhi keinginan seorang hacker. Nah untuk postingan kali ini kita akan membahas tentang salah satu tools yang digunakan oleh para hackers dalam kegiatan penyerangan system yaitu SQL Injection.
SQL injection adalah suatu teknik yang dapat dilakukan oleh hacker untuk dapat masuk kedalam system administrator tanpa mengetahui username dan password administrator terlebih dahulu dengan memanfaatkan perintah-perintah SQL yang dimasukkan kedalam database mesin server.
Untuk dapat melakukan aksi SQL injection, para hacker membutuhkan beberapa tools yang akan mereka gunakan sebagai pendukung untuk melakukan teknik penyerangan diantaranya adalah sebagai berikut :
1. Internet Exploler / Browser
2. PC yang terhubung internet
3. Program atau software seperti softice
Adapun beberapa contoh sintaks agar para hacker dapat melakukan penyerangan dengan menggunakan metode SQL injection adalah sebagai berikut :
1. $SQL = “select * from login where username = ’$username’ and password = ‘$password’”; , {dari GET atau POST variable}
2. Isikan password dengan string ’ or ’’ = ’
3. Hasilnya maka SQL akan seperti ini = “select * from login where username = ’$username’ and password = ’pass’ or ‘ = ′ ”;, {dengan SQL ini hasil selection akan selalu TRUE}
Dan hasilnya, para hacker bisa inject sintax SQL kedalam SQL.
Untuk melakukan SQL Injection sederhana, ada beberapa hal yang harus dipahami oleh seorang penyusup, diantaranya adalah penggunaan query untuk mysql, penggunaan karakter khusus, form, dll. Dengan menggabungkan semua pengetahuan tentang query database, maka seseorang bisa melakukan SQL Injection terhadap suatu aplikasi web.
Query yang paling sering mendapat eksploitasi adalah query login. Untuk melakukan login, biasanya setelah menerima inputan dari form, maka digunakan perintah select berdasarkan kriteria username dan passwordnya. Jika username dan password tersebut cocok, maka user tersebut bisa menggunakan session atau cookies untuk login.
Form adalah suatu bagian dimana aplikasi web menerima inputan dari penggunanya. Form tidak selalu harus terdiri dari berbagai field dengan bermacam – macam jenis inputan, tetapi satu buah kotak pencarian saja sudah bisa dikategorikan sebagai form. Dalam SQL Injection, biasanya penyusup melihat struktur form untuk mendapatkan beberapa data seperti tujuan eksekusi form, nama – nama field yang terdapat dalam form, metode pengiriman form, dll. Biasanya yang diberikan perhatian adalah pada nama field dalam form, karena biasanya programmer akan membuat sebuah variabel yang bernama sama di form dan di database untuk jenis field yang memiliki jenis data yang sama.
SQL Injection memerlukan karakter khusus agar bisa dimanipulasi secara paksa. Karakter – karakter inilah yang menjadi dasar penyusupan suatu situs dengan teknik SQL Injection. Beberapa karakter khusus tersebut adalah
Double minus (--)
Tanda ini adalah tanda akhir suatu statement SQL sehingga perintah dibelakangnya tidak akan dibaca dan dieksekusi oleh MySQL. Tanda ini sangat berguna terutama untuk statement yang menggunakan operator logika OR atau AND. Misalnya
Jika diberikan tanda (--) setelah klausa username, maka perintah diatas akan menjadi
Hal itu akan membuat seseorang bisa login tanpa harus memiliki password, karena MySQL hanya akan membaca perintah sampai (username = ‘$username’) dan mengabaikan sisanya. Pada beberapa versi dan software database, pemakaian tanda (--) seringkali diganti dengan dengan tanda pagar (#).
Union
Union adalah perintah untuk menggabungkan 2 atau lebih perintah SQL, biasanya penggunaan union dalam SQL Injection dilakukan untuk memberikan perintah error dalam query. Contoh penggunaannya:
Biasanya penggunaan perintah diatas adalah untuk mencari jumlah kolom dari suatu tabel. Untuk nama tabel, bisa dicari dengan memanfaatkan tabel information_schema pada MySQL yang menyimpan informasi semua tabel yang terdapat dalam database tersebut.
Halaman login adalah halaman yang sering menjadi sasaran para penyusup. Hal ini karena halaman login merupakan pintu untuk masuk ke halaman administrator yang bisa mengelola seluruh aplikasi web. Beberapa programmer terkadang lalai dalam menerapkan keamanan untuk halaman loginnya sehingga bisa ditembus dengan mudah.
Sebagai contoh, sebuah halaman login dibuat tanpa menggunakan standar pengamanan apapun terhadap serangan
SQL Injection.
Dengan memasukan karakter injeksi sederhana, maka form halaman login bisa ditembus tanpa harus memiliki account. Karakter yang sering digunakan adalah (' or 1=1--).
Hal tersebut terjadi karena form login tersebut dicek dengan menggunakan perintah
Sehingga jika variabel username diberi input (' or 1=1--), maka query SQLnya akan menjadi
Pernyataan 1=1 akan membuat query tersebut selalu mengembalikan nilai TRUE untuk pernyataan tersebut. Karakter double sign setelah username akan membuat pemeriksaan terhadap password akan diabaikan sehingga penyusup tidak perlu memasukan password.
Selain dengan String tersebut, beberapa String berikut juga biasa digunakan untuk mengecek adakah celah keamanan pada suatu form login. String – string tersebut adalah:
Pencegahan serangan dengan
SQL Injection bisa dilakukan dengan cara yang sederhana maupun dengan cara yang rumit. Beberapa cara untuk mencegah atau menanggulangi penyusup yang menggunakan teknik
SQL Injection antara lain yaitu dengan:
Menghilangkan tampilan error program saat aplikasi web sedang berjalan. Tampilan informasi error syntak hanyalah untuk developer aplikasi, bukan untuk konsumsi publik. Pada php, pesan error akan ditampilkan pada browser, untuk menghilangkannya cukup gunakan karakter @ sebelum pernyataan. Misalnya pada baris perintah:
Jika terdapat kesalahan saat menuliskan nama host menjadi
Maka akan ditampilkan pesan kesalahan seperti ini.
Pesan kesalahan semacam ini akan menjadi bahan untuk dieksploitasi penyerang. Untuk menghilangkan tampilan pesan kesalahan seperti diatas, cukup gunakan karakter @ sebelum deklarasi variabel koneksi.
Sehingga pesan error tidak akan ditampilkan.
Jika ingin menampilkan pesan error, gunakan pesan error buatan sendiri dengan bahasa yang sederhana.
Dengan menggunakan pesan error yang dibuat sendiri, akan menghindarkan browser menampilkan hal – hal yang tidak perlu.
Membatasi dan memfilter input pada form, terutama pada form – form yang sensitif terhadap keamanan aplikasi. Misalnya form login, form pendaftaran, dll. Pada html, pembatasan panjang karakter input suatu form dilakukan dengan cara menambahkan parameter “maxsize” pada tag “<input />”.
Filter terlebih dahulu data inputan baik dari form maupun dari URL, baik dengan method POST maupun dengan method GET. Hal ini untuk menjamin bahwa user tidak menginputkan karakter yang tidak lazim. Pada PHP, ada berbagai cara untuk menyaring inputan dari pengguna. Beberapa diantaranya adalah:
1. Mengecek panjang string dengan membuat fungsi cek panjang inputan
2. Menggunakan Escape String. Fungsi mysql_real_escape_string akan membuat php mengkonverskan beberapa karakter dengan menambahkan karakter “\” sebelum karakter tertentu untuk mencegah injeksi dari form/URL
3. Menggunakan fungsi string replace. Fungsi str_replace akan menggantikan karakter/kalimat tertentu dengan karakter/kalimat yang sudah didefinisikan.
4. Jika perlu, gunakan fungsi untuk mengecek apakah suatu nilai integer yang dimasukan (dari URL maupun Form) terutama untuk halaman yang menggunakan id. Hal ini untuk mencegah SQL Injection yang menghasilkan tampilan error.
5. Hindari menggunakan id untuk merujuk suatu alamat tertentu, baik dalam link maupun dalam URL. Hal ini untuk mencegah eksploitasi database dengan menggunakan kolom id pada tabel tertentu. Jika ingin menggunakan id, gunakan javascript dan ajax untuk menyembunyikan proses dan menghilangkan id dari alamat URL.
Gunakan kalimat maupun string yang irasional dan sulit mengejanya, hal ini untuk mempersulit penyusup dalam mencari dan menebak struktur database dari aplikasi. Misalnya tabel “user”, akan lebih baik jika dituliskan dalam bentuk “us3r”. Meskipun akan mempersulit dalam pembangunan aplikasi, tetapi cara ini bisa efektif untuk mencegah injeksi.