Jasakom - Jika Anda sedang membuat sebuah website, atau sudah mempunyai website, Anda tentunya mengkhawatirkan mengenai serangan potensial dari user yang tidak bertanggung jawab.
Seringkali, developer web terfokus pada masalah keamanan dari operating system dan webserver dimana situs mereka ditempatkan. Saat ditemukannya lubang keamanan pada webserver IIS yang mengijinkan para attacker mengeksploitasinya.
Keamanan pada IIS bukanlah satu-satunya daftar keamanan yang harus diperhatikan. Kode program tersebut umumnya ditulis untuk website dinamis seringkali menyebabkan lubang keamanan yang serius pada webserver IIS. Banyak lubang pada kode program yang dapat di eksploitasi oleh suatu exploit bernama SQL Injection.
Apakah SQL Injection itu?
SQL Injection adalah suatu teknik pemrograman yang memungkinkan seorang attacker untuk mengeksekusi perintah SQL yang tidak diotorisasikan, dengan memanfaatkan kelemahan input data yang tidak terenkripsi dalam query SQL yang membangun aplikasi web tersebut. Contohnya adalah sebagai berikut:
Sebuah halaman web yang memuat username dan password untuk mengakses halaman tertentu (secured section), dan menjalankan sebuah script ASP yang memeriksa SQL query apakah username dan password yang dimasukkan pengunjung tersebut valid atau tidak.
Dalam suatu skenario, situs yang berbasiskan ASP membutuhkan dua halaman, halaman pertama berupa file HTML untuk keperluan Login username dan password. Sedangkan halaman yang kedua berupa file ASP yang memeriksa validasi input yang dimasukkan pengunjung. Sebagai contoh halaman tersebut berisikan script
berikut ini:
jika anda mengkopi script dibawah ini ganti tanda ( ) dengan tanda < > agar terbaca
Login.htm
(form action="ExecLogin.asp" method="post")
Username: (input type="text" name="txtUsername")(br)
Password: (input type="password" name="txtPassword")(br)
(input type="submit" value="Kirim Data")
(/form)
ExecLogin.asp
(%
Dim p_strUsername, p_strPassword, objRS, strSQL
p_strUsername = Request.Form("txtUsername")
p_strPassword = Request.Form("txtPassword")
strSQL = "SELECT * FROM tblUsers " & _
"WHERE Username='" & p_strUsername & _
"' and Password='" & p_strPassword & "'"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
If (objRS.EOF) Then
Response.Write "login username atau password tidak
sesuai."
Else
Response.Write "Anda telah log in sebagai " &
objRS("Username")
End If
Set objRS = Nothing
%)
Sekilas pandang, script ASP ExecLogin.asp tidak menunjukkan sesuatu berupa lubang keamanan. User tidak dapat log in tanpa kombinasi username/password yang valid. Sebenarnya, kode ini belumlah dikatakan aman, dan mudah dieksploitasi melalui SQL Injection. Secara khusus, kerentanan ini berisikan fakta bahwa masukan pengunjung biasanya langsung membuat SQL Statement, yang mengakibatkan seorang attacker mampu mengendalikan eksekusi SQL Statement tersebut.
Dalam sebuah contoh dari kerentanan yang memungkinkan jika menurut string yang dimasukkan ke field username/password ' or ''='. Statement SQL akan mengeksekusinya sebagai :
SELECT * FROM tblUsers WHERE Username='' or ''='' and Password
= '' or ''=''
Query ini akan mengembalikan semua record yang tersimpan dalam tblUsers, dan script ASP akan memproses log in user sebagai identifikasi user yang pertama berdasarkan record pertama dalam table.
(form action="ExecLogin.asp" method="post")
Username: (input type="text" name="txtUsername")(br)
Password: (input type="password" name="txtPassword")(br)
(input type="submit" value="Kirim Data")
(/form)
ExecLogin.asp
(%
Dim p_strUsername, p_strPassword, objRS, strSQL
p_strUsername = Request.Form("txtUsername")
p_strPassword = Request.Form("txtPassword")
strSQL = "SELECT * FROM tblUsers " & _
"WHERE Username='" & p_strUsername & _
"' and Password='" & p_strPassword & "'"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
If (objRS.EOF) Then
Response.Write "login username atau password tidak
sesuai."
Else
Response.Write "Anda telah log in sebagai " &
objRS("Username")
End If
Set objRS = Nothing
%)
Sekilas pandang, script ASP ExecLogin.asp tidak menunjukkan sesuatu berupa lubang keamanan. User tidak dapat log in tanpa kombinasi username/password yang valid. Sebenarnya, kode ini belumlah dikatakan aman, dan mudah dieksploitasi melalui SQL Injection. Secara khusus, kerentanan ini berisikan fakta bahwa masukan pengunjung biasanya langsung membuat SQL Statement, yang mengakibatkan seorang attacker mampu mengendalikan eksekusi SQL Statement tersebut.
Dalam sebuah contoh dari kerentanan yang memungkinkan jika menurut string yang dimasukkan ke field username/password ' or ''='. Statement SQL akan mengeksekusinya sebagai :
SELECT * FROM tblUsers WHERE Username='' or ''='' and Password
= '' or ''=''
Query ini akan mengembalikan semua record yang tersimpan dalam tblUsers, dan script ASP akan memproses log in user sebagai identifikasi user yang pertama berdasarkan record pertama dalam table.
Variasi lainnya dari serangan SQL Injection ini terjadi saat menerima parameter querystring untuk menghasilkan halaman yang dinamis. Dibawah ini adalah contoh dari halaman ASP yang menerima sebuah ID melalui querystring, dan secara dinamis menghasilkan halaman yang berisikan ID tersebut.
<% Dim p_lngID, objRS, strSQL p_lngID = Request("ID") strSQL = "SELECT * FROM tblArtikel WHERE ID=" & p_lngID Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." If (Not objRS.EOF) Then Response.Write objRS("IsiArtikel") Set objRS = Nothing %>;
Dalam keadaan normal, script ini akan menampilkan isi dari artikel dimana ID telah dilalui sebagai sebuah parameter querystring. Contohnya, halaman URL halaman akan tampak seperti ini:
http://www.jasakom.com/Artikel.asp?ID=1055
yang mana hal ini menunjukkan suatu isi dinamis dari artikel dengan ID 1055.
Sebagaimana contoh login diatas, kode ini membuka dirinya untuk diserang oleh SQL Injection. Para Attacker dapat mengganti ID artikel yang valid untuk menjalankan perintah SQL dengan suatu ID lain seperti: 0 or 1=1
http://www.jasakom.com/Artikel.asp?ID=0 or 1=1
Query SQL akan mengembalikan seluruh artikel dari table yang
kemudian dieksekusi sebagai:
SELECT * FROM tblArtikel WHERE ID=0 or 1=1
Tentu saja, contoh ini mungkin tidak terlihat berbahaya, namun para attacker mampu memanipulasi aplikasi bahkan lebih jauh lagi berusaha menyisipkan perintah yang merusak, seperti statement DELETE. Hal ini dimungkinkan dengan melakukan manipulasi querystring sederhana! Contohnya, siapapun dapat memanggil halaman dengan sebuah querystring seperti:
http://www.jasakom.com/Artikel.asp?ID=1055; DELETE FROM
tblArtikel.
Keterlibatan dari SQL Injection
---------------------------------
Keterlibatan sebenarnya dari kerentanan ini berdasarkan lingkungan pemrograman dan konfigurasi. Jika koneksi database menggunakan konteks keamanan dari DBO, yang memungkinkan untuk memasukkan seluruh table dalam database, membuat table baru dsb. Jika koneksi database menggunakan konteks keamanan dari SA, yang juga memungkinkan untuk mengendalikan masukan dari SQL Server, dan dengan konfigurasi yang benar bahkan membuat user account mengambil alih database dari WebHosting Windows
Server.
Melindungi Aplikasi Anda dari SQL Injection
-----------------------------------------
Hal pertama yang harus dilakukan adalah melindungi query SQL dengan menerapkan teknik sanitasi (mengosongkan) seluruh input yang diterima dari permintaan objek ASP (seperti: Request, Request.QueryString, Request.Form, Request.Cookies dan Request.ServerVariabbles). Teknik sanitasi ini sangat tergantung pada Relational Database Management System.
Catatan mengenai RDBMS:
RDBMS merupakan sistem yang multiuser. Oleh karena itu, RDBMS menyertakan fitur sekuriti untuk mengontrol akses ke/dan penggunaan database.Tujuan arsitektur sekuriti RDBMS adalah untuk melindungi dan memverifikasi semua bagian informasi yang tersimpan dalam database. Informasi bisnis perlu diverifikasi untuk memastikan bahwa tidak ada data yang berubah.
Contoh penanganan MS SQL Server seperti dibawah ini.
Dalam sebuah halaman login, script semestinya terdiri dari dua variabel (txtUserName, txtPassword) dari jenis string yang dilewati. Saat sebuah tanda petik tunggal (') dimasukkan dalam sebuah parameter, hal ini mengijinkanuser untuk memanipulasi perintah yang dieksekusi. Untuk menghadapi ancaman SQL Injection, hindari penggunaan tanda petik tunggal (') dengan menggunakan fungsi REPLACE, seperti dibawah ini:
p_strUsername = Replace(Request.Form("txtUsername"), "'",
"''")
p_strPassword = Replace(Request.Form("txtPassword"), "'",
"''")
Contoh yang kedua, script diharapkan adalah sebuah variabel (ID) jenis long integer. Perintah SQL yang tidak diotorisasi dapat mengeksekusi dengan menambahkan perintah SQL ke dalam parameter ID. Untuk mengatasi hal ini gunakan input untuk Long Integer dengan fungsi CLng sbb:
p_lngID = CLng(Request("ID"))
Jika user mencoba melewati suatu string, fungsi CLng akan menampilkan pesan error.
Lebih jauh untuk mengurangi resiko serangan SQL Injection, pastikan menghapus/mengganti tampilan pesan kesalahan kepada user. Error Message juga seringkali digunakan untuk menelusuri jalur penyimpanan database. Untuk informasi mengenai pembuatan halaman Error menggunakan ASP silakan lihat kode dibawah ini:
Sub LogError(strLocation)
Dim objFSO 'sebagai Scripting.FileSystemObject
Dim objStream 'sebagai Scripting.TextStream
if Err.Number = 0 Then Exit Sub
WriteLine ""_
& "Terjadi kerusakan serius pada pemrosesan
halaman ini."_
& "Silakan coba lagi nanti atau hubungi
webmaster.
"
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
Akhirnya, untuk mengurangi serangan SQL Injection, batasi permisi hanya kepada user yang terotorisasi yang dapat melihat data yang tersimpan dalam tempat penyimpanan, individu yang terotorisasi harus yakin bahwa data yang diberikan kepada mereka sudah akurat dan tidak secara ceroboh memodifikasinya. Kedua, user harus dapat mengakses data yang mereka butuhkan ketikan mereka membutuhkannya.
Dibuat oleh si_cebol@yahoo.com
Balikpapan - Kalimantan Timur
Indonesia
0 komentar:
Posting Komentar