0x01 全局變量覆蓋
- 變量若未被初始化(PHP中使用變量并不需要初始化),且能被用戶控制,很可能導(dǎo)致安全問題
- 當(dāng)register_globals=ON時,變量來源可能是各個地方
通過$GLOBALS獲取的變量,也可能導(dǎo)致變量的覆蓋
if(ini_get('register_globals')) foreach($_REQUEST as $k=>$v) unset(${$k});
這是一段禁用register_globals的代碼

php中unset的用法
由于unset只會銷毀局部變量,要銷毀全局變量必須使用$GLOBALS
給出代碼:
<?php
echo "Register_globals:".(int)ini_get("register_globals")."<br/>";
if(ini_get('register_globals')) foreach($_REQUEST as $k=>$v) unset(${$k});
print $a;
print $_GET[b];
?>
這段代碼$a未初始化,如果嘗試注入"GLOBALS[a]"以覆蓋全局變量時,將成功控制變量$a的值
unset($GLOBALS['bar']) //可以銷毀全局變量
0x02 extract()變量覆蓋
extract()函數(shù)能將變量從數(shù)組導(dǎo)入當(dāng)前的符號表
int extract(array $var_array[,int $extract_type [,string $prefix]])
第二個參數(shù)$extract_type指定函數(shù)將變量導(dǎo)入符號表時的行為,最常見的兩個值
- EXTR_OVERWRITE……如果變量名沖突,則覆蓋已有變量
- EXTR_SKIP……跳過不覆蓋
安全的做法是確定register_globals=OFF后,在調(diào)用extract()時使用EXTR_SKIP保證已有變量不會被覆蓋
0x03 import_request_variables變量覆蓋
bool import_request_variables(string $types[,string $prefix])
import_request_variables()將GET、POST、Cookie中的變量導(dǎo)入到全局,第二個參數(shù)是為導(dǎo)入的變量添加的前綴,如果沒有指定,則將覆蓋全局變量
import_request_variables('G')
指定導(dǎo)入GET請求中的變量,沒有規(guī)定前綴,從而導(dǎo)致變量覆蓋
0x04 安全建議
- 確保register_globals=OFF,若不能自定義php.ini,則應(yīng)該在代碼中控制
- 熟悉可能造成變量覆蓋的函數(shù)和方法,檢查用戶是否能控制變量的來源
- 養(yǎng)成初始化變量的好習(xí)慣