PHP 中Session 反序列化機制的三種方法


�php.ini中存在三項配置項:

session.save_path="" --設置session的存儲路徑

session.save_handler=""--設定用戶自定義存儲函數,如果想使用PHP內置會話存儲機制之外的可以使用本函數(數據庫等方式)

session.auto_start boolen--指定會話模塊是否在請求開始時啟動一個會話默認為0不啟動

session.serialize_handler string--定義用來序列化/反序列化的處理器名字。默認使用php

以上的選項就是與PHP中的Session存儲和序列話存儲有關的選項。

在使用xampp組件安裝中,上述的配置項的設置如下:

session.save_path="D:\xampp\tmp"表明所有的session文件都是存儲在xampp/tmp下

session.save_handler=files 表明session是以文件的方式來進行存儲的

session.auto_start=0表明默認不啟動session

session.serialize_handler=php 表明session的默認序列話引擎使用的是php序列話引擎

在上述的配置中,session.serialize_handler是用來設置session的序列話引擎的,除了默認的PHP引擎之外,還存在其他引擎,不同的引擎所對應的session的存儲方式不相同。

php_binary:存儲方式是,鍵名的長度對應的ASCII字符+鍵名+經過serialize函數序列化處理的值

php:存儲方式是,鍵名+豎線+經過serialize函數序列處理的值

php_serialize(php>5.5.4):存儲方式是,經過serialize函數序列化處理的值

在PHP中默認使用的是PHP引擎,如果要修改為其他的引擎,只需要添加代碼ini_set('session.serialize_handler', '需要設置的引擎');。示例代碼如下:

<?php

ini_set(&apos;session.serialize_handler&apos;&apos;php_serialize&apos;);

session_start;

// do something

存儲機制

php中的session中的內容並不是放在內存中的,而是以文件的方式來存儲的,存儲方式就是由配置項session.save_handler來進行確定的,默認是以文件的方式存儲。

存儲的文件是以sess_sessionid來進行命名的,文件的內容就是session值的序列話之后的內容。

假設我們的環境是xampp,那么默認配置如上所述。

在默認配置情況下:

<?php

session_start

$_SESSION[&apos;name&apos;]=&apos;spoock&apos;;

var_dump;

?>

最后的session的存儲和顯示如下:

可以看到PHPSESSID的值是jo86ud4jfvu81mbg28sl2s56c2,而在xampp/tmp下存儲的文件名是sess_jo86ud4jfvu81mbg28sl2s56c2,文件的內容是name|s:6:"spoock";。name是鍵值,s:6:"spoock";是serialize("spoock")的結果。

在php_serialize引擎下:

<?php

ini_set(&apos;session.serialize_handler&apos;&apos;php_serialize&apos;);

session_start;

$_SESSION[&apos;name&apos;]=&apos;spoock&apos;;

var_dump;

?>

SESSION文件的內容是a:1:{s:4:"name";s:6:"spoock";}。a:1是使用php_serialize進行序列話都會加上。同時使用php_serialize會將session中的key和value都會進行序列化。

在php_binary引擎下:

<?php

ini_set(&apos;session.serialize_handler&apos;&apos;php_binary&apos;);

session_start;

$_SESSION[&apos;name&apos;]=&apos;spoock&apos;;

var_dump;

?>

SESSION文件的內容是names:6:"spoock";。由於name的長度是4,4在ASCII表中對應的就是EOT。根據php_binary的存儲規則,最后就是names:6:"spoock";。(突然發現ASCII的值為4的字符無法在網頁上面顯示,這個大家自行去查ASCII表吧)

序列化簡單利用

test.php

<?php

classsyclover{

var$func="";

function__construct{

$this->func="phpinfo";

}

function__wakeup{

eval($this->func);

}

}

unserialize($_GET[&apos;a&apos;]);

?>

在11行對傳入的參數進行了序列化。我們可以通過傳入一個特定的字符串,反序列化為syclover的一個示例,那么就可以執行eval方法。我們訪問localhost/test.php?a=O:8:"syclover":1:{s:4:"func";s:14:"echo "spoock";";}。那么反序列化得到的內容是:

object(syclover)[1]

public&apos;func&apos;=>string&apos;echo "spoock";&apos;(length=14)

最后頁面輸出的就是spoock,說明最后執行了我們定義的echo "spoock";方法。

這就是一個簡單的序列化的漏洞的演示

PHP Session中的序列化危害

PHP中的Session的實現是沒有的問題,危害主要是由於程序員的Session使用不當而引起的。

如果在PHP在反序列化存儲的$_SESSION數據時使用的引擎和序列化使用的引擎不一樣,會導致數據無法正確第反序列化。通過精心構造的數據包,就可以繞過程序的驗證或者是執行一些系統的方法。例如:

$_SESSION[&apos;ryat&apos;]=&apos;|O:11:"PeopleClass":0:{}&apos;;

上述的$_SESSION的數據使用php_serialize,那么最后的存儲的內容就是a:1:{s:6:"spoock";s:24:"|O:11:"PeopleClass":0:{}";}。

但是我們在進行讀取的時候,選擇的是php,那么最后讀取的內容是:

array(size=1)

&apos;a:1:{s:6:"spoock";s:24:"&apos;=>

object(__PHP_Incomplete_Class)[1]

There are multiple header layouts available that allow you to utilize background images, office locations and hours and social media links. Multi-lingual sites even have the ability to add a language drop down menu. On a related note, Consulting WP comes with seven language files, is compatible with WPML and is translation-ready.

WordPress Customizer

Consulting WP is compatible with the WordPress Customizer, which you can use to preview changes to the theme’s options in real-time.

Create Your Own Layouts

With the included Visual Composer page builder plugin, you can create your own complex page layouts without having to touch code.

Features that Work for Business 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM