SQL Injection
Pengertian SQL injection
SQL injection adalah kegiatan
menyisipkan perintah SQL kepada suatu statement SQL yang ada pada aplikasi yang
sedang berjalan. Dengan kata lain SQL injection ini merupakan suatu tehnik
pengeksploitasi pada web apilikasi yang didalamna menggunakan database untuk
penyimpanan datanya. Terjadinya SQL injection tersebut dikarenakan security
atau keamanan pada level aplikasi (dalam hal ini aplikasi web) masih kurang
sempurna. Kurang sempurnanya adalah pada cara aplikasi meng-handle inputan yang
boleh di proses ke dalam database. Misalnya pada suatu web yang terdapat
fasilitas login, terdapat dua buah inputan pada umumnya, yaitu username dan
password. Jika karakter yang masuk melalui dua buah inputan tersebut tidak
difilter (disaring) dengan baik maka bisa menimbulkan efek SQL injection, ini
dikarenakan biasanya inputan tersebut secara sistem akan menjadi bagian dari
kriteria dari suatu perintah SQL di dalam aplikasi web-nya. Secara garis besar
terjadinya SQL injection tersebut adalah sebagai berikut:
1.
Tidak adanya pemfilteran terhadap karakter –
karakter tanda petik satu ’ dan juga karakter double minus -- yang menyebabkan
suatu aplikasi dapat disisipi dengan perintah SQL.
2.
Sehingga seorang Hacker dapat menyisipkan
perintah SQL kedalam suatu parameter maupun pada text area suatu form.
Default Setting SQL
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 /*)
Jadi kalau
diuraikan logikanya adalah bahwa SQL-nya menganggap 1=1 sebagai true sehingga
kolom itu di-bypass lalu kolom password-nya diabaikan karena setelah 1=1
terdapat mark SQL ( -- ), sehingga password itupun diabaikan. Lalu apakah hanya
itu string-nya dalam menginjeksi sebuah situs? Tentu saja tidak. Inti dari
injeksi dalam langkah awalnya adalah memaksa keluar sebuah error page yang
berisi informasi struktur database situs itu dan kalau kita ingin melihatnya
kita harus men-debug-nya. Jadi yang kita masukkan adalah string debugging SQL
code, yaitu ' having 1=1-- , ini adalah string yang harus dimasukkan kalau kita
ingin melihat error page dari situs sasaran.
Sehingga dapat dikatakan bahwa teknik ini memungkinkan
seseorang dapat login kedalam sistem tanpa harus memiliki account. Selain itu
SQL injection juga memungkinkan seseorang merubah, menghapus, maupun
menambahkan data–data yang berada didalam database. Bahkan yang lebih berbahaya
lagi yaitu mematikan database itu sendiri, sehingga tidak bisa memberi layanan
kepada web server.
Mencari Target
Situs web MS-SQL dengan ASP
adalah situs yang paling rentan terhadap serangan ini. Hal pertama yang
dilakukan dalam pencarian target yang sudah tidak asing lagi bagi kita yaitu
buka www.google.com, pada kolom keywordnya masukkan allinurl:.co.nz/admin.asp,
atau allinurl:/logon.asp Keyword ini dapat kita modifikasi ke berbagai bentuk
.Penulisan allinurl perlu dicantumkan, dengan begitu Google akan segera mencari
semua URL dalam sebuah situs yang mempunyai direktori /admin.asp. kita bisa
saja mengganti keyword tersebut dengan allinurl:.co.id atau net atau org,
or.id, sampai allinurl:.fr/admin.asp semua tergantung kemauan kita dalam mencari
target menggunakan Google, dan yang terpenting dari semua itu adalah kita harus
tahu di mana harus menginput string SQL tadi, misalnya di member login, user
login, dan bahkan dapat pula di search product dan lainnya.
Lokasi Sql Injection
Tidak
selalu pada setiap situs target, kita harus di-inject lewat input box-nya. Kita
juga bisa memasukan string-string SQL di URL situs target. Misalnya ada sebuah
situs www.xxxxxx.com/moreinfo.cfm?ProductID=245 lalu, ketikkan string injeksi
debuging SQL tadi ke address bar anda dibelakang url target itu, salah satu
contohnya:
www.xxxxxx.com/moreinfo.cfm?ProductID=245' having 1=1-- atau
juga kita dapat menghapus nilai produk dari URL tersebut dan ganti dengan
debugging codenya, sebagai contoh: www.xxxxxx.com/moreinfo?ProductID=' having
1=1รข€”
Apabila setelah itu akan keluar sebuah error page dari situs
itu, ini menandakan bahwa situs tersebut dapat memberikan informasi tentang
struktur database situs itu. Dari hasil informasi tersebut, kita dapat
melakukan serangan SQL injection berikutnya. Apabila browser kita adalah
Internet Explorer, ada sebagian situs yang tidak menampilkan error-nya, ini
dikarenakan opsi Show Friendly HTTP Error Messages diaktifkan. Untuk itu kita
perlu menonaktifkannya dengan cara menghilangkan tanda centang di kotaknya.
Opsi ini dapat anda temukan di Tools > Internet Option > Advanced cari
opsinya di bagian Browsing lalu hilangkan tanda centangnya dan klik tombol
Apply. Sesudah itu apabila anda menemui error page yang berisi HTTP 500 error -
internal server error- sebelum men-set opsi tadi, anda cukup menekan tombol
Refresh, lalu terlihatlah sudah error-nya. Setelah kita tahu struktur
database-nya, dengan pengetahuan dasar dari belajar SQL kita dapat
menghancurkan database itu dengan perintah ' drop database [nama_database] atau
drop table [nama_table], namun bukan ini yang kita cari dalam SQL Injection
karena kita tidak dapat apa-apa dari string tadi.
SQL injection sederhana (Bypassing User
Authentication System)
Sekarang
kita akan membuat contoh mengenai kasus SQL injection yang sampai saat masih
sering kita jumpai pada situs-situs di internet. Salah satu penyalahgunaan bug
SQL injection adalah digunakan untuk mem-bypass sistem login pada suatu situs.
Contoh kali ini akan kita rancang sendiri sedemikian rupa mulai dari merancang
database, membuat script sampai melakukan SQL injection terhadap script yang
kita buat tersebut. Kita akan menggunakan MS SQL Server sebagai databasenya,
ASP sebagai scripting languange nya dan sembarang HTML editor untuk membuat
layar loginnya (penulis disini menggunakan MS FrontPage). Penulis asumsikan
Anda menggunakan MS IIS sebagai web server. Siapkan MS IIS Anda dan juga MS SQL
Server 2000 Anda.
Pertama-tama kita akan buat dahulu databasenya. Siapkan
database dengan nama sqlinject dan buat tabel di dalamnya dengan nama tbUser.
Berikut ini adalah struktur dari tabel tbUser melalui perintah SQL CREATE
TABLE.
create table tbUser
(username varchar(50),
password varchar(50)
)
Isikan data ke dalam tabel tersebut dengan mengetikkan
perintah SQL seperti berikut ini.
insert into tbUser values
('sql','inject')
Sekarang kita sudah mempunyai sebuah database yang bernama
'sqlinject', sebuah tabel yang bernama 'tbUser' dan tabel tersebut sudah diisi
dengan satu buah row data. Sekarang kita akan buat sebuah halaman login yang
digunakan sebagai interface web-nya. Penulis beri nama filenya yaitu login.asp.
Bentuk tampilan dari layar login ini bisa Anda lihat 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'.
<% option explicit %>
<%
dim
connstring,conn,recset
connstring =
"Provider=SQLOLEDB.1; Password=rahasia; Persist Security Info=True; User
ID=sa; Initial Catalog=sqlinject; Data Source=localhost"
set conn =
server.createobject("adodb.connection")
set recset =
server.createobject("adodb.recordset")
conn.open connstring
recset.open
"select * from tbUser where username = '" &
request.form("username") & "' and password = '" &
request.form("password") & "'",conn,3,2
if not recset.eof
then
response.write recset.recordcount
session("username") = request.form("username")
response.redirect
"secured_page.asp"
else
response.redirect
"login.asp"
end if
%>
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.
Pada halaman secured_page.asp di atas terdapat sebuah link
logout yang mengarah pada dokumen logout.asp. Ini digunakan untuk melakukan
sign-out atau log-out dari halaman secured_page.asp dan menuju ke halaman
login.asp kembali. Code dari dokumen logout.asp adalah sebagai berikut.
<%
session.abandon
response.redirect
"login.asp"
%>
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.
select * from tbUser where username = 'user' and password =
'pass'
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.
select * from tbUser where username = ''' and password =
'aku'
Coba jalankan pada MS Query Analyzer dan akan muncul error
seperti berikut ini.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'aku'.
Server: Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string '
'.
Kita lihat error yang pertama persis sama pesannya seperti
yg terjadi pada web tadi. Itu terjadi karena Anda melakukan pemotongan
statement SQL dengan karakter ' dan belum Anda selesaikan. Efek dari pemotongan
ini akhirnya Anda bisa menambahkan statement SQL Anda sendiri setelah karakter
' tadi. Sekarang kita selesaikan pemotongan statement SQL tadi dengan
menambahkan string or 1=1 -- setelah karakter ' tadi (jadi pada bagian username
Anda ketikkan ' or 1=1 --) sehingga sekarang statement SQL nya akan menjadi
seperti berikut ini.
select * from tbUser where username = '' or 1=1 --' and
password = 'aku'
Coba Anda jalankan pada MS Query Analyzer. Hasilnya adalah
menimbulkan suatu record set yang menampilkan semua data pada tabel tbUser
tersebut. Kita lihat lagi pada statement di atas. Karakter -- adalah karakter
untuk menandakan bahwa string setelah tanda -- akan di ignore atau dianggap
sebagai remark pada suatu statement SQL. Jadi sebenarnya pada statement di atas
yang dijalankan adalah sebagai berikut.
select * from tbUser where username = '' or 1=1
Jadi perintah di atas akan men-select username yang berupa blank
character dan kemudian di OR dengan suatu kondisi TRUE (dalam hal ini diwakili
dengan 1=1). Kondisi apapun jika di OR dengan keadaan TRUE maka hasilnya akan
selalu TRUE pula. Itulah inti dari kejadian di atassumber : A. Affandi, “SQL Injection.” 2008.
Komentar
Posting Komentar