Puji syukur penulis panjatkan ke hadirat Allah Tuhan Yang Maha Esa,
karena hanya dengan rahmatNya penulis dapat menyelesaikan penyusunan
makalah tugas mata kuliah Keamanan jaringan komputer, yang berjudul metode
serangan sql-injection dan cara mengatasinya.
Penulis
BAB I
PENDAHULUAN
Dunia maya atau internet sekarang ini sudah banyak sekali bertebaran bug-
bug dari unicode para cracker-cracker yang tidak bertanggung jawab. Mereka ini
menggunakan berbagai tehnik hacking untuk mencari kelemahan dan merusak
pada sistem keamanan suatu jaringan. Salah satu dari tehnik tersebut yang sangat
membahayakan sebuah website yaitu SQL injection atau dikenal juga dengan
SQL insertion yaitu sebuah teknik yang digunakan untuk mengeksploitasi
database pada suatu websites dengan memaksa keluarnya error page situs itu yang
ada error pages itu terdapat info tentang struktur database website yang
dieksploitasi. SQL sendiri merupakan bahasa pemrograman database yang sering
dipakai para web developer maupun admin sebuah situs untuk menampung
ataupun menaruh data-data baru dari suatu input yang masuk seperti input
member login, search engine, dan lain sebagainya.
Sebenarnya SQL injection sendiri bukanlah hal baru, dari dulu teknik ini
sudah dikenal dalam dunia hacking sebagai salah satu teknik web hacking, namun
baru muncul lagi sekarang karena sifatnya yang dapat merusak database dari suatu
website. SQL injection ini sempat ramai pada beberapa waktu yang lalu yaitu
pada saat kasus bobolnya situs TNP KPU oleh salah seorang cracker Indonesia,
Dani Firmansyah.
1.2 Tujuan
Tujuan dari penulisan makalah ini adalah untuk memahami bagaimana
SQL injection itu dilakukan serta mengetahui cara pencegahannya.
Seperti yang kita ketahui bahwa tehnik SQL injection ini memungkinkan
seseorang dapat login kedalam sistem tanpa harus memiliki account. Salah
satunya yaitu default setting SQL. Default setting SQL yang paling berbahaya
adalah menggunakan adminID = sa dan password blank alias (kosong), apabila
ada direktori sebuah situs yang disitu ada input untuk adminnya maka kalau kita
isi id-nya dengan = 'sa' dan passwordnya =' ' maka kita langsung masuk sebagai
admin, ini kalau default setting-nya belum diubah. Namun ada lagi string yang
bisa kita input untuk akses sebagai web admin yaitu dengan string ' OR 1=1--
apabila ada input web admin yang input box-nya adalah User dan Password maka
apabila kita masukan string ' OR 1=1-- di input box user dan masukan foobar di
input box password, maka akan membuat SQL query-nya bingung diakibatkan
jadi SQL Query membacanya sebagai:
SELECT * from users where User ='' or 1=1-- and Password ='foobar'
yang artinya sqlnya men-SELECT semua query dari user yang user-nya ''
(kosong) atau (OR) 1=1 (true) -- (tanda -- adalah mark dari SQL seperti halnya di
C/C++ marknya // atau /*)
Isikan data ke dalam tabel tersebut dengan mengetikkan perintah SQL seperti
berikut ini.
Setelah itu kita buat script untuk memproses login ini, penulis beri nama
login_process.asp. Code pada file login_process.asp adalah sebagai berikut. Untuk
koneksi ke database (SQL Server) penulis menggunakan metode SQL
Authentication, server pada localhost, username 'sa' dan password 'rahasia'.
Kita lihat pada code diatas terdapat operasi SELECT ke SQL yang
mencari username dan password dari tabel tbUser. Jika username dan password
yang dimasukkan benar maka akan masuk ke halaman secured_page.asp (ada
pada bagian akhir dari tulisan ini). Maksud dari halaman secured_page.asp ini
adalah bahwa halaman tersebut hanya bisa diakses jika Anda mengisikan
username dan password dengan benar. Anda tidak bisa mengetikkan URL
halaman tersebut secara langsung. Gambar contoh halaman secured_page.asp bisa
Anda lihat berikut ini.
Sekarang semua file sudah kita buat. Letakkan semua file tadi (login.asp,
login_process.asp, secured_page.asp, logout.asp) dalam satu folder dan jadikan
sebagai home directory pada MS IIS (web server) Anda. Hasilnya bisa Anda test
dengan mengetikkan URL yang mengarah pada web Anda tadi misalnya
http://localhost/login.asp.
Sekarang saatnya penulis akan menyajikan contoh SQL injection untuk mem-
bypass login. Tampilkan URL yang berisi login.asp tadi (misalnya
http://localhost/login.asp). Sekarang coba masukkan username 'a' dan password
'a', program akan kembali lagi ke halaman login.asp karena username dan
password tersebut salah. Sekarang coba sekali lagi, kali ini username 'sql' dan
password 'inject'. Karena username dan password benar maka Anda akan
diarahkan ke halaman secured_page.asp. Anda bisa klik link logout jika ingin
logout. Aktivitas tersebut adalah aktivitas normal pada suatu sistem pada login.
Bagaimanakah cara tidak normalnya? Kita memeriksa apakah login tersebut bisa
di bypass atau tidak dengan cara memberikan inputan tanda ' (single quote) pada
bagian inputan username dan masukkan sembarang string pada bagian password.
Jika Anda tekan tombol submit maka akan muncul error seperti berikut ini.
Error Type:
Microsoft OLE DB Provider for SQL Server (0x80040E14)
Line 1: Incorrect syntax near 'aku'.
/login_process.asp, line 8
Error di atas merupakan error dari database SQL Server yang sebenarnya
menyatakan ada kesalahan pada statement SQL (akibat kita masukkan karakter '
tadi). OK sekarang kita akan mulai bagian yang lebih seru, kembalikan lagi ke
halaman login.asp. Coba masukkan string 'or 1=1 -- pada bagian username dan
masukkan sembarang string pada bagian password. Apa yang terjadi? Anda akan
langsung dibawa ke halaman secured_page.asp tanpa harus mengetahui username
dan password yang benar sama sekali. Kenapa hal itu bisa terjadi? Mari kita
pelajari pelan-pelan konsepnya berikut ini.
Penyebab utama kejadian di atas adalah karena karakter ' (single quote)
yang kita inputkan pada bagian username. Karakter ' (single quote) merupakan
karakter pemutus dari statement SQL dan dari sini bisa kita kembangkan untuk
membelokkan statement SQL asli menjadi statement SQL sesuai keinginan kita.
Mari kita lihat kembali kejadiannya. Misalnya kita masukkan string 'user' dan
password 'pass' maka statement SQL yang terjadi adalah sebagai berikut.
Jalankan pada MS Query Analyzer maka hasilnya akan menjadi suatu zero
recordset dan tidak error.
Sekarang misalnya kita memasukkan karakter ' pada username dan string 'aku'
pada bagian password maka statement SQL pada database akan menjadi seperti
berikut ini.
Coba jalankan pada MS Query Analyzer dan akan muncul error seperti berikut
ini.
select * from tbUser where username = '' or 1=1 --' and password = 'aku'
-- Filename: les01_ovw_attack_demo.sql
-- Created: October 2, 2007
-- Creator: Bryn Llewellyn (adapted by Jenny Tsai-Smith)
-- Description: Code sample with dynamic SQL and string concatenation.
-- Used to demonstrate SQL injection vulnerability.
SQL>CONN hr
// perintah ini artinya kita membuat procedure untuk proses sebagai user login.
Enter password : *******
Connected.
SQL>SET SERVEROUTPUT ON
SQL>CREATE OR REPLACE
PROCEDURE User_Login
(p_Email Employees.Email%type DEFAULT NULL,
p_Last_Name Employees.Last_Name%type DEFAULT NULL)
AS
Stmt CONSTANT VARCHAR2(4000) :=
'SELECT Email
FROM Employees
WHERE Email = ''' || p_Email ||
''' AND Last_Name = ''' || p_Last_Name || '''';
// Pada kolom merah tersebut menandakan ini adalah dynamic sql statement yang
dibuat dengan penggabungan input inputan nilai atau value yang mana ini
merupakan vurnerability yang bias kita injeksi. Pada statement local procedure
PL /SQL variable menyediakan string yang bisa diinjection.
v Employees.Email%type;
BEGIN
END User_Login;
/
// Ternyata sukses besar! Disini anda pasti bertanya-tanya mengapa hal demikian
dapat terjadi?
// Disini Sting telah terinjeksi, dimana pada text string value pada parameter
pertama ini mengubah SQL statement. SQL tersebut akhirnya menguraikan
perintah ini, dan menafsirkannya kedalam database dimana email telah terinjeksi
atau telah tergantikan dengan nilai string or 1=1, begitupula pada
lastnamenya. Secara detailnya pertama pada tanda petik pada perintah dibawah
ini tertafsikan pada SQLnya sebagai tanda kutip terdekat untuk nilai (value) suatu
email.
Dengan ini google akan mencari pada internet situs-situs yang memiliki
cate_id tertentu.disini penulis pilih salah satunya sebagai contoh kasus saja (tidak
bermaksud untuk merusak).
Penulis memilih salah satu link pada google tsb, link yang didapat adalah sebagai
berikut:
http://www.**********.co.uk/auctions/subcat.php?cate_id=14&view=list
langkah selanjutnya, setelah cate_id= di hapus saja kemudian di ganti dengan bug
berikut:-
1%20union%20select%200,concat(char(116,117,114,107,101,121,58),user_name,
char(116,117,114,107,101,121,112,97,115,115,58),pas
sword),2%20from%20admin/*&view=list
http://www.**********.co.uk/auctions/subcat.php?cate_id=-
// ada tanda min (-) sebelum 1
1%20union%20select%200,concat(char(116,117,114,107,101,121,58),user_name,
char(116,117,114,107,101,121,112,97,115,115,58),password),2%20from%20adm
in/*&view=list
// bug ini berfungsi untuk menampilkan error pada username admin dengan
menggunakan parameter-parameter angka tertentu, sehingga username admin dan
password admin dapat ditampilkan.
Sekarang dapat kita saksikan bahwa terdapat tulisan yang dilingkari tersebut, itu
artinya:
usernamenya admin
passwordnya fuCk
// ternyata website ini benar-benar telah di hacked oleh orang banyak ini
semakin membuktikan bahwa sistem pemfilteran bug-bug SQL injection tidak
terpasang pada database website ini. Sehingga seorang Hacker dapat menyisipkan
perintah SQL kedalam suatu parameter maupun pada text area suatu form dan
memudahkan mereka untuk men-defacenya seperti yang anda lihat pada gambar
diatas para hacker menuliskan nama-nama mereka, memungkinkan juga mereka
menghapus, maupun menambahkan datadata yang berada didalam database.
Bahkan yang lebih berbahaya lagi yaitu mematikan database itu sendiri, sehingga
tidak bisa memberi layanan kepada web server.
Perlu juga kita ketahui tidak seluruh website dapat kita injeksi seperti
halnya pada website diatas, semua itu tergantung pada sistem keamanan yang
telah ditanamkan pada database website masing-masing. Survei membuktikan dari
10 website yang saya injeksi dengan bug diatas hanya 2 website saja yang
terinjeksi dengan bug tersebut. Contohnya pada website berikut ini:
//Dapat anda lihat pada website ini tidak terjadi penampilan error atau terjadinya
kerusakan kerusakan lainnya, yang ada hanyalah kalimat peringatan untuk tidak
masuk secara ilegal. Dengan kata lain dapat dikatakan pada sesi ini pemfilteran
sql injection pada website ini telah baik.
Berikut saya tampilkan website yang juga telah menjadi korban SQL injection ,
sehingga website inipun akhirnya ditutup pada tahun 2006 lalu.
para cracker meng-inject database-nya agar string SMS tadi diberi nilai
dan bisa dipakai untuk mengirim SMS, sehingga seorang cracker tersebut dapat
mengirim sms sepuasnya. pada website ini www.yepcell.com. Situs ini adalah
sebuah situs dari Timur Tengah yang menyediakan jasa pengiriman sms ke
seluruh penjuru dunia dan menyediakan aksesori handphone seperti, ringtone dan
gambar.
Cara biasa digunakan untuk mencegah SQL injection adalah dengan selalu
memeriksa setiap karakter inputan yang masuk ke dalam database melalui
statement SQL. Misalnya pada kasus di atas kita harus mencegah karakter ' (single
quote) untuk di proses ke dalam database atau kita bisa mengganti karakter '
(single quote) yang masuk dengan '' (dua kali single quote). Adapun contoh script
login_process.asp yang sudah dimodifikasi agar mencegah SQL injection adalah
sebagai berikut.
Kita lihat pada code diatas maka pada inputan username dan password ada sedikit
modifikasi dengan mengganti dari request.form("username") menjadi
replace(request.form("username"),"'","''"), demikian juga untuk yang bagian
password. Sebenarnya masih ada cara lainnya untuk mencegah misalnya dengan
penggunaan stored procedure dan lain sebagainya. Hal tersebut akan disajikan
pada kesempatan yang lain.
1. Query SQL
p_strUsername = Replace(Request.Form(txtUsername), , )
p_strPassword = Replace(Request.Form(txtPassword), , )
p_lngID = CLng(Request(ID))
Jika user mencoba melewati suatu string, fungsi CLng akan menampilkan
pesan error.
Sub LogError(strLocation)
Dim objFSO sebagai Scripting.FileSystemObject
Dim objStream sebagai Scripting.TextStream
if Err.Number = 0 Then Exit Sub
WriteLine <p><font color=#FF0000><b>_
& ERROR._
& Please try again later or contact webmaster.</b></font></p>
Set objFSO = Server.CreateObject(Scripting.FileSystemObject)
Set objStream = objFSO.OpenTextFile(C:errorlog.txt,_
ForAppending, True)
ObjStream.WriteLine Now() & : [" & Request("SCRIPT_NAME")_
& " - Err #" & Err.Number & "] _
& Err.description & [Lokasi: " & strLocation & "]
ObjStream.Close
Set objStream = Nothing
Set objFSO = Nothing
Response.End
End Sub
3. Permisi
Batasi permisi hanya pada user yang terotorisasi saja. Sang user tentu
saja harus yakin bahwa data yang dia terima sudah akurat dan tidak ceroboh
memodifikasinya.
5. Filterisasi
Filter input yang dimasukkan oleh user, terutama penggunaan tanda kutip
tunggal (Input Validation).
BAB IV
KESIMPULAN
SQL Injection merupakan teknik hacking paling populer pada aplikasi web
dengan prinsip melewatkan perintah-perintah SQL lewat aplikasi web untuk
dieksekusi oleh database back-end. Kelemahan akan muncul apabila inputan user
tidak disaring/difilter dengan sempurna dan akhirnya dieksekusi. Oleh karena itu
diperlukan suatu pengamanan yang extra hati hati pada SQL statement pada
database yang ada pada suatu website-website kita, agar perintah-perintah SQL
injection tersebut dapat disaring dengan baik. Demikian halnya dengan Setting
server dengan benar memang akan mengamankan e-commerce web dari serangan
deface, akan tetapi bukan berarti semuanya sudah aman sekarang. Situs e-
commerce yang menggunakan Microsoft IIS juga menggunakan database access
dengan Micosoft SQL server,dimana MS SQL server tersebut mempunyai
kelemahan yang memungkinkan seseorang tanpa account dapat masuk dan lolos
verifikasi dari MS SQL server..Hal ini yang jelas dapat merugikan sekali, sebab
bisa saja data sensitif seperti nomor kartu kredit serta lainnya bocor! Pada saat
seseorang berusaha masuk ke situs e-commerce, biasanya akan disambut dengan
halaman login yang mengharuskan pemakai memasukkan login name dan
password.
Semuanya tergantung dari kita bagaimana cara kita untuk selalu turus
update dalam penanganan masalah ini. Karena tentunya para-para cracker tersebut
selalu mengembangkan bug-bug mereka untuk dapat menemukan lubang-lubang
pada jaringan kita. Oleh karena itu sebelum kita menjadi defender yang kuat,
alangkah baiknya kita mengetahui dan mempelajari terlebih dahulu serangan-
serangan para cracker tersebut, serte kita bisa menjadi hacker pada sistem kita
sendiri.
DAFTAR PUSTAKA
1. http://www.nextgenss.com
2. http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm
3.http://www.ilmuwebsite.com/detil_hacking/7/SQL_Injection_AJ_Auction_selur
uh_ versi/"