先看這一段簡單的代碼
<?PHP
session_start();
$_SESSION['isadmin']='yes';
$isadmin='no';
echo $_SESSION['isadmin'];
?>
當PHP.ini裡配置 register_globals = Off 時,輸出 yes
但是
當PHP.ini裡配置 register_globals = On 的時候,
第一次運行輸出 yes
而刷新一下,則顯示的是 no
顯然這是不正常的,如果說是 $isadmin='no'; 改變了SESSION,
那麼為什麼第一次會顯示yes呢?
都知道:當配置 register_globals = On 的時候,
通過 xxx.PHP?id=123 訪問時,程序會自動創建變量 id
那麼自動創建的變量會不會改變SESSION呢? <?PHP
//xxx.PHP
session_start();
echo $_SESSION['id'];
?>
通過 xxx.PHP?id=123 訪問,沒任何輸出,采用 SESSION 做登錄的
而PHP配置 register_globals 為 On 的網站
將被隨便登錄。
還有兩個常用的函數 import_request_variables() 和 extract()
import_request_variables -- 將 GET/POST/CookIE 變量導入到全局作用域中
extract -- 從數組中將變量導入到當前的符號表
<?PHP
//xxx.PHP
import_request_variables('G');
echo $id;
?>
當通過xxx.PHP?id=123訪問的時候,
就算 register_globals 設為 Off
也是會輸出123
extract($_GET) 與 import_request_variables('G') 功能相似
那麼試試import_request_variables() 與 extract()創建的變量會不會影響SESSION呢? <?PHP
//xxx.PHP
session_start();
import_request_variables('G');
echo $_SESSION['id'];
?>
當通過xxx.PHP?id=123訪問程序,
沒有輸出,再用extract($_GET)代替import_request_variables('G')測試, <?PHP
session_start();
$arr=array('id'=>123);
extract($arr);
echo $_SESSION['id'];
?>
register_globals 為 On 時
會輸出 123
看來同樣是數組,
extract 處理 $_GET 與處理定義的數組
用的是不一樣的方法。
結論:
register_globals 為 On 的時候,
用import_request_variables('G')和extract($_GET)創建的變量是不會改變SESSION的。
總結:漏洞只存在於PHP配置register_globals = On的時候,定義的變量會改變同名的SESSION。
轉載請保留:
作者:Cos.X
日期:2007年6月13日
ps. 結果讓我挺失望的,以為會發現一個驚人的PHP SESSION 登錄安全漏洞。