Sunday - May 18, 2008

Home | Site Map | Channels | Profile | Press Room | Services | Contact 

currently 11 user(s) online

search 

   Latest News

»

sony-ak.com Luncurkan Kamus Teknologi Informasi (May 27, 2006)

»

sony-ak.com Luncurkan IT Event Calendar (May 20, 2006)

»

Web Chat Berbasis AJAX dari sony-ak.com (May 09, 2006)

»

sony-ak.com Advertising Program (May 01, 2006)

»

Sony AK di Tabloid PCplus (April 18, 2006)

news archives » 


   Random Article

»

Internet Melalui Teknologi TV (7265)

»

Informasi yang Berlebihan (1989)

»

AJAX (Asynchronus JavaScript and XML) - Bagian II (1623)

»

Aplikasi DOSEMU pada Linux (1938)

»

Mengatasi Kerusakan Sistem Operasi Windows (11371)

   Newsletter

Join our newsletter, you will get alert about content updates

powered by Yahoo! Groups















Nedstat Basic - Free web site statistics

 
 
SQL Injection Menggunakan ASP dan MS SQL Server

Author: Sony Arianto Kurniawan
Published: January 12, 2004
Visits: 6615 - Category: Computer Security
 
     
 

Tulisan kali ini akan membicarakan tentang SQL injection dengan menggunakan ASP dan MS SQL Server. 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. Sudah banyak sekali sebenarnya artikel ataupun white paper yang membahas mengenai SQL injection ini. Salah seorang pakar sekuriti yang sering membahas mengenai SQL injection yaitu David Litchfield dari www.nextgenss.com.

Apa itu SQL injection?
SQL injection adalah kegiatan menyisipkan perintah SQL kepada suatu statement SQL yang ada pada aplikasi yang sedang berjalan. Terjadinya SQL injection terlebih dikarenakan security atau keamanan pada level aplikasi (dalam hal ini aplikasi web) masih kurang sempurna. Kurang sempurna bagaimana? 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. Berbahaya sekali bukan?

Contoh SQL injection sederhana (Bypassing User Authentication System)
Sekarang kita akan membuat contoh mengenai kasus SQL injection yang sampai saat ini dan detik ini juga 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 atas.

Menanggulangi SQL injection
Cara paling mudah 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.

<% 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 = '" & replace(request.form("username"),"'","''") & "' and password = '" & replace(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 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.

Demikian tulisan sederhana mengenai SQL injection dengan menggunakan ASP dan MS SQL Server. Semoga bermanfaat bagi Anda semuanya. Saran dan komentar bisa dikirimkan ke sony-ak@sony-ak.com. Untuk membaca tulisan menarik lainnya silakan menuju ke situs Sony AK Knowledge Center pada alamat www.sony-ak.com.

Silakan download source code lengkap dari project di atas

Terimakasih.




 Recommended articles
 

»

MWSnap, Aplikasi Screen Capture Sederhana tapi Powerful (2281)

»

Konektivitas Broadband Jarak Jauh dengan WiMAX, Standar Nirkabel Berkecepatan DSL (7745)

»

Tips Visual Basic: Open dan Close CD-ROM Drive (2907)

»

Teknologi Hardisk - Bagian 2 (7893)

»

Tips Visual Basic: Mengetahui Drive CD-ROM Pada Komputer (2958)

 Send your comments or suggestions
Full Name :
E-mail :
Comments :
 
 

  Privacy | Site Map | Advertise

  Copyright © 2003 - 2006 Sony AK Knowledge Center - all rights reserved

  info@sony-ak.com