程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP所有版本 SESSION 漏洞

PHP所有版本 SESSION 漏洞

編輯:PHP綜合

先看這一段簡單的代碼
<?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 登錄安全漏洞。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved