Saturday, May 12, 2007

Securing Your PHP - Register Global Vulnerabilities

Ada bener nya juga kali ya PHP itu singkatan dari pretty hard to protect. Karena mudah dan menyenangkan nya php untuk di pelajari dan di gunakan sehingga banyak programmer php melupakan keamanan aplikasi yang di buat nya .... sehingga jangan heran jika web berbasis php paling sering kena serangan hack

Bahkan ada nasihat dari pendekar php, untuk mengurangi agar aplikasi berbasis php itu aman adalah dengan memberikan pendidikan yang baik bagi programmer nya untuk mendesign sebuah aplikasi. Benar boroknya php lagi di bongkar dengan adanya php month of the bugs, tapi tetep saja penyebab aplikasi terkena hack adalah masalah design aplikasi yang buruk. Apakah php aman untuk digunakan membuat sebuah aplikasi web jawabannya bisa ya , jika kita tepat dalam mengkonfigurasi dan mendesign aplikasi kita, jawabannya bisa tidak jika kita tidak bisa konfigurasi dengan baik dan buruk dalam mendesign aplikasi kita.

Beberapa hal yang perlu di perhatikan adalah :

  • Input Validation
  • Cross-Site scripting prevention
  • SQL injection
  • Preventing code injection
  • Command injection
  • Session security
  • Securing file access
  • The last is tips & trick to secure your application
Kita coba mulai dari awal saja ahhh yaitu

Register Globals

Pada umumnya aplikasi berbasis web selalu menggunakan input data baik GET(via url) maupun POST(via form). Banyak para attacker memanfaatkan hal ini untuk niat niat jahatnya, dengan cara memasukkan inputan yang tidak wajar ...

Beberapa masalah dengan input di antaranya :

Bisanya programmer php pemula menggunakan settingan default register_global pada php.ini. Jika register global on artinya variabel yang kita lempar via url akan membuat sebuah variabel sekaligus meng-assign isi dari variabel itu. Sebagai contoh : script.php?mode=secure, maka secara otomatis akan terbentuk variabel $mode dengan value nya 'secure'

Masalah pertama yang timbul akibat register global ini adalah, dapat terjadi konflik variabel yang masuk. Value yang ada pada sebuah variabel dapat dari berbagai sources, mulai dari GET,POST, cookies, server environment variabel, dan system environment variabel. sebagai contoh, kita melempar variabel $id pada url, dan kita juga memiliki cookies $id, kondisi ini memaksa php melakukan merge, sehingga ada informasi yang hilang, value dari $id jadi bisa tidak valid, misal yang dari url assign $id = 3, sedang cookies mengatakan $id = 5, mana yang akan kita gunakan ???

Nah itu tampaknya tergantung dari setting gpc_order di php.ini ,gpc = menggambarkan urutan dari prioritas variabel , Get, Post dan Cookies, pada contoh diatas maka $id akan berisi 5, sebab cookies memiliki prioritas lebih tinggi di bandingkan Get ...

Solusi dari masalah di atas, mungkin dengan memberikan prefix untuk variabel, sebagai contoh variabel dari post kita kasih prefix p jadi $p_id, sedang untuk cookies kita kasih prefix c. Cara ini bisa di lakukan tapi tidak reliabel di terapkan untuk aplikasi yang kompleks dan menggunakan banyak variabel

Contoh berbahaya dengan membiarkan register_global on adalah script seperti berikut :

if (is_authorized_user()) {
$auth = TRUE;
}

if ($auth) {
/* display content intended only for authorized users */
}


Dengan memberikan variabel $auth dengan inputan apa pun baik get maupun post maka kita akan bisa masuk sebagai authorized user ... bisa dengan script.php?auth=true, atau dengan menyisipkan input form yang bernama auth dengan value true, contoh .....

ini sih terjadi karena php tidak bisa/susah mendetect uninitialized variabel. Satu satu nya jalan adalah dengan men-set erorr reporting E_ALL pada php.ini, itu pun dengan batasan akan mengeluarkan error jika php mengeksekusi uninitialized variabel itu.

OK kita berhasil mendetek uninitialized variabel, tapi itu pun belonnn cukupppp ... aduh capek ya !!! mau bukti lihat script di bawah ini ...

$del_user[] = “95”; // add the only desired value
foreach ($del_user as $v) {
mysql_query(“DELETE FROM users WHERE id=”.(int)$v);
}

kita udah assign $del_user khan .... tapi apa yang terjadiii jika dari url kita panggil seperti ini script.php?del_user[]=1&del_user[]=2 ... hahah jadi hancurlah impian kita ... tuhh kannn , gimana menghindarinya sih? sebenarnya simple aja : dengan mendeklarasikan baris

$del_user =array();

setidaknya dengan deklarasi seperti itu menghindari injection ..

Sudah desperate dengan php? jangan dulu, sekarang kita coba solusinya dulu

An Alternative to Register Globals: Superglobals

Karena dengan membiar kan register_global aktif menimbulkan bahaya yang sangat mengerikan maka php 4.1 memperkenalkan super global variabel yang terdiri dari $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, nah silahkan disabled register global anda dan silahkan gunakan super global variabel

Alternatif lainnya dengan menggunakan constanta, ini bisa menghindari masalah register_global. Lihat contoh ini :

define(‘auth’, is_authorized_user());
if (auth) {
/* display content intended only for authorized users */
}

OK khan .... tapi ... pasti ada tapinya ... jangan pula kayak gini :

if (is_authorized_user())
define(‘auth’, TRUE);
if (auth) // {
/* display content intended only for authorized users */}

Kenapa ... sok aja coba karena auth nya itu akan selalu bernilai TRUE, kondisional expression terhadap undefined constant di php itu akan menghasilkan nilai true ... SIAL!!!! masih ada yang sial juga ... nih :

The $_REQUEST Trojan Horse

Ok di atas di sebutkan dengan ada nya super global variabel bisa mengatasi masalah dengan register global.... tapi be aware dengan super global variabel yang bernama $_REQUEST ... ini mah sama aja dia gabungin variabel dari post , get dan cookie ....maksudnya sih biar simpel tapiii.... bahaya juga. Bisa aja sih digunakan dengan mengecek dulu variabel yang lainnya ... contoh skrip di bawah ini :

if (!empty($_REQUEST[‘id’]) && isset($_COOKIE[‘id’]))
unset($_REQUEST[‘id’]);

}

Dari skrip di atas jadi di cek dulu $id di cookies ... tapi lieur juga oi aku , mendingan nih ya ... untuk safe nya gini aja lah udah :

if (!empty($_GET[‘id’]))
$id = $_GET[‘id’];
else if (!empty($_POST[‘id’]))
$id = $_POST[‘id’];
else
$id = NULL;

skrip di atas ini lebih secure ketimbang skrip di bawah ini :

if (!empty($_REQUEST[‘id’]))
$id = $_REQUEST[‘id’];
}

OK ... sekarang udah makin berdebar debar ... ini baru secuil saja, tapi ini banyak kita jumpai terjadi pada php pemula ... khan? biasanya php pemula sudah cukup senang dengan jalannya program tapi melupakan hal hal di atas .... itu baru dikittt ... kita akan coba lanjutkan dengan bahasan lainnya .... jangan menyerah HIDUP PHP!!! hidup pretty hard to protect hahah ...

Next On Securing Your PHP : INPUT VALIDATION

1 comment:

Anonymous said...

xrumer palladium [url=http://xrumerservice.org/]xrumer service[/url] backlink checker
seo reseller