03 Januari 2012

Menjaga Website dari SQL Injection

Perkembangan teknologi yang semakin pesat saat ini memudahkan masyarakat umum dalam mengakses informasi. Perkembangan ini ditandai dengan adanya kemajuan di dunia internet. Internet kini sudah semakin menjamur di masyarakat umum dan tidak terbatas pada kalangan yang bergerak di bidang komputer saja. Semakin maju dunia teknologi maka keamanan data pun semakin rawan terserang kejahatan.
Keamanan komputer dirasakan sangat perlu untuk dijaga dari pihak-pihak yang tidak berwenang. Salah satu keamanan komputer yang perlu dijaga adalah keamanan database yang dirasakan sangat penting dan diperlukan untuk menjaga data-data yang ada di dalam database.Banyak tindak kejahatan dunia cyber yang menyerang keamanan database karena database menyimpan data-data penting yang dapat merugikan jika diakses oleh sembarang orang. Biasanya serangan ditujukan pada sebuah website, karena website terhubung secara online sehingga lebih mudah diakses. Banyak metode atau cara kejahatan dalam keamanan suatu database salah satunya adalah Sql Injection.

1. Keamanan Database
Keamanan merupakan suatu proteksi terhadap pengrusakan data dan pemakaian data oleh pengguna yang tidak memiliki wewenang. Untuk menjaga keamanan database dengan :
- Penentuan perangkat lunak database Server yang handal.
- Pemberian Otoritas kepada user mana saja yang berhak mengakses, serta memanipulasi data-data yang ada.
- Memberikan dan membuat proteksi terhadap database yang kita buat.

1.1. Penyalahgunaan Database
Tidak disengaja, jenisnya :
a. kerusakan selama proses transaksi
b. anomali yang disebabkan oleh akses database yang konkuren
c. anomali yang disebabkan oleh pendistribuasian data pada beberapa komputer
d. logika error yang mengancam kemampuan transaksi untuk mempertahankan konsistensi database.
Disengaja, jenisnya :
a. Pengambilan data / pembacaan data oleh pihak yang tidak berwenang.
b. Pengubahan data oleh pihak yang tidak berwenang.
c. Penghapusan data oleh pihak yang tidak berwenang.

1.2 Tingkatan Pada Keamanan Database :
Fisikal 
lokasi-lokasi dimana terdapat sistem komputer haruslah aman secara fisik terhadap serangan perusak.
Manusia 
wewenang pemakai harus dilakukan dengan berhati-hati untuk mengurangi kemungkinan adanya manipulasi oleh pemakai yang berwenang
Sistem Operasi 
Kelemahan pada SO ini memungkinkan pengaksesan data oleh pihak tak berwenang, karena hampir seluruh jaringan sistem database menggunakan akses jarak jauh.
Sistem Database
Pengaturan hak pemakai yang baik.

1.3. Keamanan Data :
Otorisasi 
Pemberian Wewenang atau hak istimewa (priviledge) untuk mengakses sistem atau obyek database.
Tabel View 
Merupakan metode pembatasan bagi pengguna untuk mendapatkan model database yang sesuai dengan kebutuhan perorangan. Metode ini dapat menyembunyikan data yang tidak digunakan atau tidak perlu dilihat oleh pengguna.

1.4 Pengamanan Dilakukan Beberapa Level :
Relasi 
Pengguna diperbolehkan atau tidak diperbolehkan mengakses langsung suatu relasi
View 
Pengguna diperbolehkan atau tidak diperbolehkan mengakses data yang terapat pada view
Read Authorization 
Pengguna diperbolehkan membaca data, tetapi tidak dapat memodifikasi.
Insert Authorization 
Pengguna diperbolehkan menambah data baru, tetapi tidak dapat memodifikasi data yang sudah ada.
Update Authorization 
Pengguna diperbolehkan memodifikasi data, tetapi tidak dapat menghapus data.
Delete Authorization 
Pengguna diperbolehkan menghapus data.

Untuk Modifikasi data terdapat otorisasi tambahan :
Index Authorization 
Pengguna diperbolehkan membuat dan menghapus index data.
Resource Authorization 
Pengguna diperbolehkan membuat relasi-relasi baru.
Alteration Authorization 
Pengguna diperbolehkan menambah/menghapus atribut suatu relasi.
Drop Authorization 
Pengguna diperbolehkan menghapus relasi yang sudah ada.

2. SQL Injection
SQL Injection adalah sebuah teknik untuk mengeksporasi aplikasi web dengan memanfaatkan suplai data dari client dalam sintak SQL. Banyak halaman web memakai parameter dari web user untuk menggunakan query ke dalam database.
Dengan SQL Injection ini sangat mungkin untuk kita mengirim user nama dan password dan dianggap benar. Walaupun mudah untuk menandai dan melindungi model serangan ini, tapi cukup mengherankan banyak aplikasi web yang terserang dengan metode ini. Memakai web server IIS dan Microsoft SQL Server untuk databasenya, sedangkan skrip yang dipakai adalah ASP.

3. Keperluan untuk Sql Injection
Untuk keperluan SQL Injection kita hanya membutuhkan browser. Browser yang dipakai adalah segala macam browser.

Serangan yang biasa dilakukan :
1. Halaman login / halaman yang mempunyai Inputan
Kita dapat memanfaatkan halaman-halaman web yang terdapat submit data, contoh: halaman login, pencarian, feedback, dan lain-lain. Kadang halaman HTML menggunakan metode POST untuk mengirim parameter ke halaman web yang lain. Jika model halamnnya seperti ini maka kita harus melihat source code karena kita tidak dapat melihat pada URL. Mudah untuk mencek source code halaman HTML, tinggal klik kanan pilih view source (pada Mozilla Firefox), kemudian cari kode ―FORM‖.

2. Jika Bukan Dihalaman Inputan
Jika halaman bukan berbentuk form input, maka anda harus cari halaman yang di buat dengan bahasa pemrograman internet seperti ASP, JSP, CGI or PHP, kemudian cari spesial URL seperti http://www.bagas.co.cc/profile.php?id=10. Ini berarti halaman web PHP dengan parameter ―id‖ yang bernilai ―10‖.

Menguji Suatu website apakah mudah diserang Sql Injection

1. Single Qoute
Dimulai dari pengunaan single quote. Seperti masukan: hi or 1=1-- Dalam login, password, atau URL lain. Contoh:
- Login: hi' or 1=1—
- Pass: hi' or 1=1—
- http://www.bagas.co.cc /profil.php?id=10id=hi' or 1=1--

Jika halaman dalam bentuk ada field yang bertipe hidden, anda tinggal download kode HTML dari situs yang anda buka ke hard disk anda, di modifikasi sedikit kemudian di simpan dalam hard disk dan modifikasi URL,

2. Kenapa Harus menggunakan 1=1--
Kita akan ekplorasi pentingnya 1=1 -- dan apakah memperoleh informasi yang tidak normal (diberikan kepada user biasa) dari sebuah web site. Kita ambil halaman php yang di link ke halaman lain seperti URL berikut:
http://www.bagas.co.cc/barang.php?category=food
Dalam URL diatas, ―category‖ adalah nama variabel sedangkan ―food‖ adalah nilai yang diberikan pada variabel tersebut. Untuk dapat mengambil nilai dari variabel diatas berikut code program pada file barang.php.
v_cat = request("category") sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat &
set rs=conn.execute(sqlstr)

seperti kita lihat pada contoh diatas variabel kita bungkus dan diberi nama ―v_cat‖ dan SQL menjadi: SELECT * FROM product WHERE PCategory='food'
Pada query diatas menghasilkan ini satu atau beberapa baris yang cocok untuk kondisi dimana (WHERE) kondisinya adalah ‗food‘. Sekarang kita asumsikan URL diatas kita ganti menjadi seperti ini: http://www.myandisun.com/barang.asp?category=food' or 1=1--
Sekarang variabel ―v_cat‖ kita menjadi ―foot‘ or 1=1—―, jika masukkan ke query maka:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
Query diatas berarti menampilkan semua dari tabel product dengan ―Pcategory‖ sama dengan ‗food‘ atau tidak. Sedangkan double dash ―--― menyatakan pada SQL server untuk mengabaikan kesalahan query, yang akan membersihkan single quote yang terakhir. Kadang kita dapat menggenti double quote dengan has tunggal ―#‖. Jika cara diatas tidak dapat mennyebabkan SQL server mengabaikan kesalahan query anda dapat mencoba. ' or 'a'='a
Sehingga query akan menjadi: SELECT * FROM product WHERE PCategory='food' or 'a'='a'
Itu seharusnya akan menghasilkan hasil yang sama.Tergantung pada peraturan Query, dapat dicoba dengan beberapa alternatif yang mungkin:
' or 1=1-- " or 1=1-- or 1=1-- ' or 'a'='a " or "a"="a ') or ('a'='a

3. Insert dan Update data kedalam Database
Ketka kita sukses mengetahui nama kolom dalam tabel, kita memungkinkan untuk kita meng UPDATE atau melakukan INSERT record baru dalam tabel. Sebagai contoh menganti password ―4ka01‖:
http://www.bagas.co.cc/index.php?id=10; UPDATE 'admin_login' SET 'password' = 'passBaru' WHERE login_name='4ka01'--

Untuk INSERT record baru ke dalam database:
http://www.myandisun.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id','login_name', 'password', 'details') VALUES (666,'4ka01','passBaru','NA')--

Kita dapat login sebagai ―4ka01‖ dengan password ―passBaru‖.

4. Pencegahannya
Script method POST
Biasanya, serangan SQL injection yang dilancarkan ke sebuah situs korban melalui URL berparameter, misalkan seperti ini:
http://situskorban/artikel.php?id=10
URL di atas memiliki parameter id dan biasanya diikuti dengan angka tertentu. Angka ini menunjukkan nomor id dari artikel yang sedang tampil. Hanya dengan menambahkan beberapa query SQL di belakang parameter tersebut, seorang hacker mampu mengakses database yang digunakan oleh situs tersebut. Berikut ini salah satu contoh query yang diinjectkan melalui URL berparameter
http://situskorban/artikel.php?id=10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
Seorang hacker dalam melancarkan aksinya, biasanya butuh beberapa kali submit URL dan query sebelum akhirnya mendapatkan targetnya.penulis akan paparkan sedikit tentang bagaimana menghindari injection seperti halnya di atas. Point pentingnya di sini adalah bagaimana supaya parameter hanya bisa membaca nomor unik id dari artikelnya saja, dengan mengabaikan query yang disisipkan hacker. Atau dengan kata lain bagaimana supaya parameter yang berisi query injection dihilangkan, misal apabila diberikan URL berikut ini

http://situskorban/artikel.php?id=10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
akan menjadi
http://situskorban/artikel.php?id=10
(bagian ‗union all select 1,concat(user,0x3a,pass,0x3a,email) from users –‘ diabaikan)

Untuk menghilangkan query yang disisipkan pada parameter dalam URL, kita bisa menggunakan ‗teknik casting‘. Dalam hal ini, kita mengcasting nilai parameter ke dalam tipe data integer. Sebagai contoh, misalkan kita memiliki sebuah string id = ‘10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users –‘. Apabila id ini dicasting ke dalam integer maka akan dihasilkan id = 10, dengan cara memberikan perintah id = (int) $id.
Script di atas akan menghasilkan 10.

Pada URL http://situskorban/artikel.php?id=…, biasanya dalam script artikel.php ini, pastilah di dalamnya terdapat perintah berikut
Perintah $id = $_GET['id']; digunakan untuk membaca nilai parameter id-nya untuk kemudian ditampilkan artikelnya berdasarkan id tersebut. Teknik casting di atas dapat diterapkan pada script artikel.php ini

Lebih baik lagi, kalau kita tambahkan function absolut abs()<
Mengapa perlu ditambahkan abs()?karena ada pula teknik SQL injection yang memanfaatkan ‗negative number‘ pada parameter URLnya, misalkan

http://situskorban/artikel.php?id=-10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
Di sini, function abs() hanya untuk menjamin saja bahwa nilai parameter id adalah bernilai positif.

Mengurangi Penyusupan Sql Injection
Langkah yang dapat di tempuh untuk mengurangi penyusupan ke halaman web dengan SQL Injection dengan cara:
1. Memfilter dengan tidak membolehkan karakter seperti single quote, double quote, slash, back slash, semi colon, extended character like NULL, carry return, new line, etc, dalam string form:
- Masukan dari from users
- Parameters di URL
- Nilai dari cookie
2. Untuk nilai numeric, convert dulu sebelum melewati statement SQL dengan mengunakan ISNUMERIC untuk meyakinkan itu adalah integer.
3. Mengubah "Startup and run SQL Server" menggunakan low privilege user dalam SQL Server Security tab.
4. Ubah stored procedure – store procedure yang tidak terpakai, seperti: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask